1、基于基于AT89C51AT89C51单片机的数字时钟设计单片机的数字时钟设计小组成员:设计简介一设计背景二AT89C51单片机简介 三设计方案四硬件电路设计五软件设计与程序代码 六主要内容一、设计简介本设计利用Atmel公司的AT89C51单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用汇编进行软件编程,并用Proteus软件进行仿真演示、验证。主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机80C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机的数字电子时钟。它的计时周期为24小时,显满刻度为“23时59分59秒”,且配有3个独立键盘,可以灵活
2、地调节时间,并具有一定的扩展性。二、设计背景十一世纪的今天,最具代表性的计时产品就是电子万年历,十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表
3、的走时月差从分级缩小到秒级。高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到历),使计时产品的走时日差从分级缩小到1/6001/600万秒,从原万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需及其他日常附属信息的显示功能,它更符合消费者的生
4、活需求!求!四、设计方案1、主程序主程序执行流程图如图主程序执行流程图如图1所示。主程所示。主程序先对显示单元和定时器计数器初始化,序先对显示单元和定时器计数器初始化,然后重复调用数码管显示模块和按键处然后重复调用数码管显示模块和按键处理模块,当有建按下,则转入相应的功理模块,当有建按下,则转入相应的功能程序。能程序。四、设计方案2、数码管显示模块 本设计的显示模块采用本设计的显示模块采用6 6位一体共阳极数码管,显位一体共阳极数码管,显示分为时钟显示模式,从右到左依次显示秒个位,秒示分为时钟显示模式,从右到左依次显示秒个位,秒十位,分个位,分十位,时个位,时十位;数码管显十位,分个位,分十位
5、,时个位,时十位;数码管显示的信息用示的信息用6 6个内存单元存放,这个内存单元存放,这6 6个内存单元为显示个内存单元为显示缓冲区,其中秒个位和秒十位,分个位和分十位,时缓冲区,其中秒个位和秒十位,分个位和分十位,时个位和时十位分别由秒数据,分数据和小时数据分拆个位和时十位分别由秒数据,分数据和小时数据分拆得到。得到。四、设计方案3、定时器计数器T0中断服务程序 定时器计数器定时器计数器T0用于时间计时,选择方式用于时间计时,选择方式1,重复,重复定时,定时时间设为定时,定时时间设为20MS,定时时间到则溢出中断,定时时间到则溢出中断,计计50次则对秒单元加次则对秒单元加1,秒单元加到,秒单
6、元加到60则对分单元加则对分单元加1,同时秒单元清零。分单元加到,同时秒单元清零。分单元加到60的时候,则对时的时候,则对时单元加单元加1,同时分单元清零,时单元加到,同时分单元清零,时单元加到24的时候则的时候则对时单元清零,标志一天时间计满,此时所以单元清对时单元清零,标志一天时间计满,此时所以单元清零。在对各单元计数的同时,把它们的值放到存储器零。在对各单元计数的同时,把它们的值放到存储器单元的制定位置单元的制定位置 四、设计方案4、按键处理模块 按键处理设置为:如果没有按键,则为时按键处理设置为:如果没有按键,则为时钟模式,时钟正常走时钟模式,时钟正常走时.按键按键KEY1KEY1为工
7、作模为工作模式键,用于时钟显示或调秒、调分、调时的式键,用于时钟显示或调秒、调分、调时的功能切换选择。功能切换选择。R3R3寄存器记录寄存器记录KEY1KEY1按键的次按键的次数,数,R3=0R3=0,显示时钟;,显示时钟;R3=1R3=1,调秒;,调秒;R3=2R3=2,调分;调分;R3=3R3=3,调时。按键,调时。按键KEY2KEY2为增为增1 1键,对键,对选定的被调项的当前值增选定的被调项的当前值增1;1;按键按键KEY3KEY3为减为减1 1键,对选定的被调项的当前值减键,对选定的被调项的当前值减1 1五、硬件电路设计六、软件设计与程序代码 1、软件选择与介绍 Proteus7.8
8、是一款电路分析实是一款电路分析实物仿真系统,可仿真各种电路和物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,并支持单片机,元件库齐全,使用方便,是不可多得的专业的使用方便,是不可多得的专业的单片机软件仿真系统单片机软件仿真系统。六、软件设计与程序代码 2、软件仿真电路全图 1.模式0显示时钟显示时钟2.2.模式模式1 1第第1 1次按次按KEY1KEY1键选择调秒键选择调秒3.3.模式模式2 2第第2 2次按次按KEY1KEY1键选择调分键选择调分4.4.模式模式3 3第第3 3次按次按KEY1KEY1键选择调时键选择调时六、软件设计与程序代码 3、程序代码KEY1 BIT P1.
9、0KEY1 BIT P1.0KEY2 BIT P1.1KEY2 BIT P1.1KEY3 BIT P1.2KEY3 BIT P1.2CLK BIT P1.3CLK BIT P1.3LOAD BIT P1.4LOAD BIT P1.4DIN BIT P1.5DIN BIT P1.5SECOND DATA 30HSECOND DATA 30HMINUTE DATA 31HMINUTE DATA 31HHOUR DATA 32HHOUR DATA 32H ORG 0000H ORG 0000H AJMP MAIN AJMP MAIN ORG 000BH ORG 000BH AJMP TIMER0 A
10、JMP TIMER0MAIN:MOV SP,#60HMAIN:MOV SP,#60H MOV TMOD,#01H MOV TMOD,#01H;定时器;定时器T0T0方式设置方式设置 MOV TH0,#0B1HMOV TH0,#0B1H;定时器;定时器T0T0装入装入初值初值20ms20ms MOV TL0,#0E0H MOV TL0,#0E0H SETB ET0 SETB ET0;T0T0中断允许中断允许 SETB EA SETB EA;总中断允许;总中断允许 MOV R2,#50 MOV R2,#50;T0T0中断为中断为1s1s SETB TR0 SETB TR0;启动;启动T0T0 MO
11、V SECOND,#00H MOV SECOND,#00H MOV MINUTE,#00H MOV MINUTE,#00H MOV HOUR,#08H MOV HOUR,#08H ;初始化时间;初始化时间8 8点点0000分分0000秒秒 MOV A,HOUR MOV A,HOUR时间值送显示缓时间值送显示缓冲区冲区79H7EH79H7EH ANL A,#0F0H ANL A,#0F0H SWAP A SWAP A MOV 79H,A MOV 79H,A MOV A,HOURMOV A,HOUR ANL A,#0FH ANL A,#0FH MOV 7AH,A MOV 7AH,A MOV A,M
12、INUTE MOV A,MINUTE ANL A,#0F0H ANL A,#0F0H SWAP A SWAP A MOV 7BH,A MOV 7BH,A MOV A,MINUTE MOV A,MINUTE ANL A,#0FH ANL A,#0FH MOV 7CH,A MOV 7CH,A MOV A,SECOND MOV A,SECOND ANL A,#0F0H ANL A,#0F0H SWAP A SWAP A MOV 7DH,A MOV 7DH,A MOV A,SECOND MOV A,SECOND ANL A,#0FH ANL A,#0FH MOV 7EH,A MOV 7EH,A MOV
13、 R3,#00H MOV R3,#00H;R3R3初值设为初值设为0 0,显示时钟显示时钟 ACALL INI7219 ACALL INI7219;调用调用72197219初始化子程序初始化子程序I NI7219:MOVNI7219:MOV 50H,#0FH50H,#0FH;显显示示测试测试寄存器寄存器设设置置 MOV 51H,#00HMOV 51H,#00H;非非测试测试模式,正常模式,正常显显示示MOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219MOVMOV 50H,#0CH50H,#0CH;关闭显关闭显示寄存器示寄存器MOV 51H,#0
14、1HMOV 51H,#01H;正常;正常显显示示MOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219MOV 50H,#0BHMOV 50H,#0BH;扫扫描界限寄存器描界限寄存器MOV 51H,#05HMOV 51H,#05H;6 6位位显显示示MOV R0,#50HMOV R0,#50HACALL SEND7219MOV 50H,#0AH;亮度寄存器,其值为000EH,设置为0AH MOV 51H,#09HMOV 51H,#09HMOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219MOV 50H,
15、#09HMOV 50H,#09H;译码方式寄存器;译码方式寄存器MOV 51H,#0FFHMOV 51H,#0FFH;8 8位显示全部位显示全部B B译码译码MOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219RETRETDISPLAY:MOV 50H,#01HDISPLAY:MOV 50H,#01H;显示;显示子程序子程序 MOV 51H,79H MOV 51H,79H;显示;显示缓冲区设在缓冲区设在79H7EH79H7EH单元单元MOV R0,#50HMOV R0,#50H;其内容从左至右一次;其内容从左至右一次显示在数码管显示器上显示在数码
16、管显示器上ACALL SEND7219ACALL SEND7219MOV 50H,#02HMOV 50H,#02HMOV 51H,7AHMOV 51H,7AH MOV R0,#50H MOV R0,#50HACALL SEND7219ACALL SEND7219MOV 50H,#03HMOV 50H,#03HMOV 51H,7BHMOV 51H,7BHMOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219MOV 50H,#04HMOV 50H,#04HMOV 51H,7CHMOV 51H,7CHMOV R0,#50HMOV R0,#50HACALL
17、 SEND7219ACALL SEND7219MOV 50H,#05HMOV 50H,#05HMOV 51H,7DHMOV 51H,7DHMOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219MOV 50H,#06HMOV 50H,#06HMOV 51H,7EHMOV 51H,7EHMOV R0,#50HMOV R0,#50HACALL SEND7219ACALL SEND7219RETRETSEND7219:CLR LOADSEND7219:CLR LOAD;向;向72197219写入数据子程序写入数据子程序 MOV R4,#02HMOV R4,
18、#02H;写入;写入1616位串行数据位串行数据CLR CCLR CLOP1:MOV R1,#08HLOP1:MOV R1,#08H MOV A,R0 MOV A,R0LOP2:RLC ALOP2:RLC A MOV DIN,C MOV DIN,C SETB CLK SETB CLK CLR CLK CLR CLK DJNZ R1,LOP2 DJNZ R1,LOP2 INC R0 INC R0 DJNZ R4,LOP1 DJNZ R4,LOP1 SETB LOAD SETB LOAD RET RET;键扫描处理子程序;键扫描处理子程序KEY:JNB KEY1,KK1KEY:JNB KEY1,K
19、K1;判断;判断KEY1KEY1键是否按下键是否按下 JB KEY1,$JB KEY1,$;等待;等待KEY1KEY1键是否键是否释放释放INC R3INC R3;模式值增;模式值增1 1,在在0 0、1 1、2 2、3 3间逐项切换间逐项切换 CJNE CJNE R3,#04H,JMPKK3R3,#04H,JMPKK3;当让中的模;当让中的模式值为式值为4 4时,在设置为时,在设置为0 0 MOV R3,#00H MOV R3,#00HJMPKK3:AJMP KK3JMPKK3:AJMP KK3;转;转至至KK3KK3,按,按R3R3内容选择显示内容选择显示KK1:JNB KEY2,KK2K
20、K1:JNB KEY2,KK2;判;判断断KEY2KEY2键是否按下键是否按下 JB KEY2,$JB KEY2,$;等待;等待KEY2KEY2键键释放释放MOV A,R3MOV A,R3;根;根据当前据当前R3R3值对时间项增值对时间项增1 1调整调整RL ARL AMOV DPTR,#KJMP1MOV DPTR,#KJMP1JMP A+DPTRJMP A+DPTRKJMP1:AJMP DISCLKKJMP1:AJMP DISCLK AJMP SINC AJMP SINC AJMP MINC AJMP MINC AJMP HINC AJMP HINCSINC:MOV A,SECONDSINC
21、:MOV A,SECOND;秒增;秒增1 1 ADD A,#01H ADD A,#01H DA A DA A MOV SECOND,A MOV SECOND,A CJNE A,#60H,DISS1 CJNE A,#60H,DISS1 MOV 30H,#01H MOV 30H,#01HDISS1:AJMP DISSDISS1:AJMP DISS;转至;转至秒显示缓冲区设置秒显示缓冲区设置MINC:MOV A,MINUTEMINC:MOV A,MINUTE;分增;分增1 1 ADD A,#01H ADD A,#01H DA A DA A MOV MINUTE,A MOV MINUTE,A CJNE
22、 A,#60H,DISM1 CJNE A,#60H,DISM1 MOV MINUTE,#00H MOV MINUTE,#00HDISM1:AJMP DISMDISM1:AJMP DISM;转至;转至分显示缓冲区设置分显示缓冲区设置HINC:MOV A,HOURHINC:MOV A,HOUR;时增;时增1 1 ADD A,#01H DA A MOV HOUR,A CJNE A,#24H,DISH1 CJNE A,#24H,DISH1 MOV HOUR,#00H MOV HOUR,#00HDISH1:AJMP DISHDISH1:AJMP DISH;转至时;转至时显示缓冲区设置显示缓冲区设置KK2
23、:JNB KEY3,KK3KK2:JNB KEY3,KK3;判断;判断KEY3KEY3是否按下是否按下 JB KEY3,$JB KEY3,$;等待;等待KEY3KEY3键释键释放放MOV A,R3MOV A,R3RL ARL AMOV DPTR,#KJMP2MOV DPTR,#KJMP2JMP A+DPTRJMP A+DPTRKJMP2:AJMP DISCLKKJMP2:AJMP DISCLK AJMP SDEC AJMP SDEC AJMP MDEC AJMP MDEC AJMP HDEC AJMP HDECSDEC:MOV A,#9AHSDEC:MOV A,#9AH;秒减;秒减1 1 CL
24、R C SUBB A,#01H ADD A,SECOND DA AMOV SECOND,AMOV SECOND,A CJNE A,#00H,DISS2 CJNE A,#00H,DISS2 MOV SECOND,#59H MOV SECOND,#59HDISS2:AJMP DISSDISS2:AJMP DISS;转至秒显;转至秒显示缓冲区设置示缓冲区设置MDEC:MOV A,#9AHMDEC:MOV A,#9AH;分减;分减1 1 CLR C CLR C SUBB A,#01H SUBB A,#01H ADD A,MINUTE ADD A,MINUTE DA A DA A MOV MINUTE,
25、A MOV MINUTE,A CJNE A,#0,DISM2 CJNE A,#0,DISM2 MOV MINUTE,#59H MOV MINUTE,#59HDISM2:AJMP DISMDISM2:AJMP DISM;转至分显;转至分显示缓冲区设置示缓冲区设置HDEC:MOV A,#9AHHDEC:MOV A,#9AH;时减;时减1 1 CLR C CLR C SUBB A,#01H SUBB A,#01H ADD A,HOUR ADD A,HOUR DA A DA A MOV HOUR,AMOV HOUR,A CJNE A,#99H,DISH2 CJNE A,#99H,DISH2 MOV H
26、OUR,#23H MOV HOUR,#23HDISH2:AJMP DISHDISH2:AJMP DISH;转至时;转至时显示缓冲区设置显示缓冲区设置KK3:MOV A,R3KK3:MOV A,R3 RL A RL AMOV DPTR,#KJMP3MOV DPTR,#KJMP3 JMP A+DPTRJMP A+DPTRKJMP3:AJMP KJMP3:AJMP DISCLKDISCLK ;R3=0R3=0显显示时钟示时钟 AJMP DISSAJMP DISS;R3=1R3=1显显示秒示秒 AJMP DISMAJMP DISM;R3=2R3=2显显示分示分 AJMP DISHAJMP DISH;R
27、3=3R3=3显显示时示时DISCLK:MOV R0,#79HDISCLK:MOV R0,#79H MOV R1,#HOUR MOV R1,#HOUR MOV R4,#03H MOV R4,#03HCFLOOP:MOV A,R1CFLOOP:MOV A,R1 SWAP A SWAP A ANL A,#0FH ANL A,#0FH MOV R0,A MOV R0,A INC R0 INC R0 MOV A,R1 MOV A,R1 ANL A,#0FH ANL A,#0FH MOV R0,A MOV R0,A INC R0 INC R0 DEC R1 DEC R1 DJNZ R4,CFLOOP D
28、JNZ R4,CFLOOP SETB TR0 SETB TR0 RET RETDISS:CLR TR0DISS:CLR TR0;显示秒,;显示秒,时与分的数码管不亮时与分的数码管不亮 MOV A,SECONDMOV A,SECOND SWAP A SWAP A ANL A,#0FH ANL A,#0FH MOV 7DH,A MOV 7DH,A MOV A,SECOND MOV A,SECOND ANL A,#0FHNL A,#0FH MOV 7EH,A MOV 7EH,A MOV 79H,#0FH MOV 79H,#0FH MOV 7AH,#0FH MOV 7AH,#0FH MOV 7BH,#
29、0FH MOV 7BH,#0FH MOV 7CH,#0FH MOV 7CH,#0FH AJMP KK5 AJMP KK5DISM:CLR TR0DISM:CLR TR0;显示分,时与秒的;显示分,时与秒的数码管不亮数码管不亮 MOV A,MINUTE MOV A,MINUTE SWAP A SWAP A ANL A,#0FH ANL A,#0FH MOV 7BH,A MOV 7BH,A MOV A,MINUTE MOV A,MINUTE ANL A,#0FH ANL A,#0FH MOV 7CH,A MOV 7CH,A MOV 79H,#0FH MOV 79H,#0FH MOV 7AH,#0F
30、H MOV 7AH,#0FH MOV 7DH,#0FH MOV 7DH,#0FH MOV 7EH,#0FH MOV 7EH,#0FH AJMP KK5 AJMP KK5DISH:CLR TR0DISH:CLR TR0;显示时,分与秒的数;显示时,分与秒的数码管不亮码管不亮 MOV A,HOUR MOV A,HOUR SWAP A SWAP A ANL A,#0FH ANL A,#0FH MOV 79H,A MOV 79H,A MOV A,HOUR MOV A,HOUR ANL A,#0FH ANL A,#0FH MOV 7AH,A MOV 7AH,A MOV 7BH,#0FH MOV 7BH,
31、#0FH MOV 7CH,#0FH MOV 7CH,#0FH MOV 7DH,#0FH MOV 7DH,#0FH MOV 7EH,#0FH MOV 7EH,#0FHKK5:RETKK5:RET;定时器;定时器T0T0中断处理子程序中断处理子程序TIMER0:PUSH ACCTIMER0:PUSH ACC;保护现场;保护现场 PUSH PSW PUSH PSW MOV TH0,#0B1H MOV TH0,#0B1H;重装定时常数;重装定时常数 MOV TL0,#0E0H DJNZ R2,NEXT;判断是否中断了50次,不足50次,中断返回MOV R2,#50MOV R2,#50;若达到;若达到5
32、050次,计时满次,计时满1s1s,刷新时间单元格刷新时间单元格 MOV A,SECOND MOV A,SECOND ADD A,#01H ADD A,#01H DA A DA A MOV SECOND,A MOV SECOND,A CJNE A,#60H,NEXT CJNE A,#60H,NEXTS1:MOV SECOND,#00HS1:MOV SECOND,#00H MOV A,MINUTE MOV A,MINUTEADD A,#01HADD A,#01HDA ADA AMOV MINUTE,AMOV MINUTE,ACJNE A,#60H,NEXTCJNE A,#60H,NEXTS2:MOV MINUTE,#00HS2:MOV MINUTE,#00H MOV A,HOUR MOV A,HOUR ADD A,#01H ADD A,#01H DA A DA A MOV HOUR,A MOV HOUR,A CJNE A,#24H,NEXT CJNE A,#24H,NEXT MOV HOUR,#00H MOV HOUR,#00HNEXT:POP PSW;恢复现场 POP ACCRETI;中断返回 END