电子时钟的设计

  • 格式:doc
  • 大小:104.96 KB
  • 文档页数:16

目录引言 (2)一 89c51单片机介绍 (3)二流程图 (5)三程序设计 (7)四仿真图 (14)参考文献 (15)致谢 (16)引言单片计算机即单片微型计算机。

由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

本设计主要设计了一个基于AT89C51单片机的电子时钟。

并在数码管上显示相应的时间。

应用Proteus的ISIS软件实现了单片机电子时钟系统的设计与仿真。

该方法仿真效果真实、准确,节省了硬件资源。

一 89C51单片机介绍VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U4AT89C5189C51单片机P3口:P3口管脚是8个带内部上拉电阻的双向I/O 口,可接收输出4个TTL 门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD (串行输入口) P3.1 TXD (串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR (外部数据存储器写选通) P3.7 /RD (外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

RST :复位输入。

当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。

ALE/PROG :当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH 编程期间,此引脚用于输入编程脉冲。

在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时, /EA将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

二流程图开始T0中断入口通过查表方式显示数据数码位选加1N位选值=8Y位选数值=0秒计数加1N秒计数=500Y总体流程图SECOND 加1中断返回 YYNNN子程序入口SECOND=6SECOND=0,并MINUTE 加1MINUTE=6MINUTE=0,并HOUR 加1显示数据处理 中断返回 HOUR=24 Y三程序设计定时计数中断程序:#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#define INT8U unsigned char#define INT16U unsigned int#define k1() ((PIND & (1<<PD0))==0x00)#define k2() ((PIND & (1<<PD1))==0x00)#define k3() ((PIND & (1<<PD2))==0x00)#define k4() ((PIND & (1<<PD3))==0x00)#define k5() ((PIND & (1<<PD4))==0x00)#define k6() ((PIND & (1<<PD5))==0x00)#define k7() ((PIND & (1<<PD6))==0x00)#define k8() ((PIND & (1<<PD7))==0x00)const INT8Useg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};INT8U ja;INT8U key=0xff;INT8U h,m,s,m1,d;INT16U y;void hour1(){if (++h>23) {h=0;day();} seg11[0]=seg[h/10];seg11[1]=seg[h%10];}void minute1(){if (++m>59){m=0;hour1();}seg11[3]=seg[m/10];seg11[4]=seg[m%10];}void second1(){if (++s>59){ s=0;minute1(); }seg11[6]=seg[s/10];seg11[7]=seg[s%10];}const INT8U Days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};const INT8U Days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};void year(){if (++y>9999) y=0;seg11[0]=seg[y/1000];seg11[1]=seg[y%1000/100];seg11[2]=seg[y%100/10];seg11[3]=seg[y%10];}void month1(){if (++m1>12){m1=0;year();}seg11[4]=seg[m1/10];seg11[5]=seg[m1%10];}void day(){ INT8U DAY;DAY=(( y%4==0 && y%100!=0 )||( y%400==0 ) ) ?Days1[m1]:Days2[m1];//判断闰年if(++d>DAY){ d=0;month1();}seg11[6]=seg[d/10];seg11[7]=seg[d%10];}//时间函数void time(){seg11[0]=seg[h/10];seg11[1]=seg[h%10];seg11[3]=seg[m/10];seg11[4]=seg[m%10];seg11[6]=seg[s/10];seg11[7]=seg[s%10];PORTA=0x00;PORTA=seg11[ja];PORTB=~(1<<ja);ja=(ja+1)&0x07;_delay_ms(5);}//日期void date(){ seg11[0]=seg[y/1000]; seg11[1]=seg[y%1000/100];seg11[2]=seg[y%100/10];seg11[3]=seg[y%10];seg11[4]=seg[m1/10];seg11[5]=seg[m1%10];seg11[6]=seg[d/10];seg11[7]=seg[d%10];//seg11[2]=seg11[5]=0x00;PORTA=0x00;PORTA=seg11[ja];PORTB=~(1<<ja);ja=(ja+1)&0x07;_delay_ms(3);}int main(){ INT8U ja=0;DDRA=0xff; PORTA=0xff;DDRB=0xff; PORTB=0xff;DDRD=0x00; PORTD=0xff;PIND=0x00;MCUCR=0X0A;//MCU 控制寄存器- MCUCRGICR=0XC0; //通用中断控制寄存器- GICRASSR=0x08;TCCR2=0x04;TCNT2=0;TIMSK=_BV(TOIE2)|_BV(TOIE0);d=26;y=2000;m1=2;h=m=s=12;sei();while(1){ time();if(k1())/{ while(k1()); hour1(); }if(k8()){ while(k8());while(2)//日期循环{date();if(k8()){while(k8());break;}}}}}ISR(TIMER2_OVF_vect){if( seg11[2]==0x40){seg11[2]=seg11[5]=0x00; }else{ seg11[2]=seg11[5]=0x40; second1();}}延时程序:1MS延时程序,LED显示程序用DL1MS: MOV R6,#14HDL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RET20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象DS20MS: ACALL DISPLAYACALL DISPLAYACALL DISPLAYRET四仿真图系统仿真图参考文献1、李朝青,单片机原理及接口技术,北京航空航天超大型出版社。