1、A Pera Global Company PERA China设计简介一设计背景二AT89C51单片机简介 三设计方案四硬件电路设计五软件设计与程序代码 六主要内容A Pera Global Company PERA China一、设计简介本设计利用Atmel公司的AT89C51单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用汇编进行软件编程,并用Proteus软件进行仿真演示、验证。主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机80C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机的数字电子时钟。它的计时周期为24小时,显满刻度为“23时5
2、9分59秒”,且配有3个独立键盘,可以灵活地调节时间,并具有一定的扩展性。 A Pera Global Company PERA China二、设计背景十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展
3、为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!A Pera Global Company PERA China四、设计方案1、主程序主程序执行流程图如图1所示。主程序先对显示单元和定时器计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有建按下,则转入相应的功能程序。 A Pera Global Company PERA ChinaA Pera Global Company PERA China四、设计方案2、数码管显示模块 本设计的显示模块采用6位一体共阳极数码管,显示分为时钟显示模式,从右到左
4、依次显示秒个位,秒十位,分个位,分十位,时个位,时十位;数码管显示的信息用6个内存单元存放,这6个内存单元为显示缓冲区,其中秒个位和秒十位,分个位和分十位,时个位和时十位分别由秒数据,分数据和小时数据分拆得到。A Pera Global Company PERA China四、设计方案3、定时器计数器T0中断服务程序 定时器计数器T0用于时间计时,选择方式1,重复定时,定时时间设为20MS,定时时间到则溢出中断,计50次则对秒单元加1,秒单元加到60则对分单元加1,同时秒单元清零。分单元加到60的时候,则对时单元加1,同时分单元清零,时单元加到24的时候则对时单元清零,标志一天时间计满,此时所
5、以单元清零。在对各单元计数的同时,把它们的值放到存储器单元的制定位置 A Pera Global Company PERA China四、设计方案4、按键处理模块 按键处理设置为:如果没有按键,则为时钟模式,时钟正常走时.按键KEY1为工作模式键,用于时钟显示或调秒、调分、调时的功能切换选择。R3寄存器记录KEY1按键的次数,R3=0,显示时钟;R3=1,调秒;R3=2,调分;R3=3,调时。按键KEY2为增1键,对选定的被调项的当前值增1;按键KEY3为减1键,对选定的被调项的当前值减1A Pera Global Company PERA China五、硬件电路设计A Pera Global
6、 Company PERA China六、软件设计与程序代码 1、软件选择与介绍 Proteus7.8是一款电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统 。A Pera Global Company PERA China六、软件设计与程序代码 2、软件仿真电路全图 1.模式0显示时钟A Pera Global Company PERA China2.模式1第1次按KEY1键选择调秒A Pera Global Company PERA China3.模式2第2次按KEY1键选择调分A Pera Global Company
7、PERA China4.模式3第3次按KEY1键选择调时A Pera Global Company PERA China六、软件设计与程序代码 3、程序代码KEY1 BIT P1.0KEY2 BIT P1.1KEY3 BIT P1.2CLK BIT P1.3LOAD BIT P1.4DIN BIT P1.5SECOND DATA 30HMINUTE DATA 31HHOUR DATA 32H ORG 0000H AJMP MAIN ORG 000BH AJMP TIMER0MAIN:MOV SP,#60H MOV TMOD,#01H;定时器T0方式设置 MOV TH0,#0B1H;定时器T0装
8、入初值20ms MOV TL0,#0E0H SETB ET0;T0中断允许 SETB EA;总中断允许 MOV R2,#50;T0中断为1s SETB TR0;启动T0 MOV SECOND,#00H MOV MINUTE,#00H MOV HOUR,#08H ;初始化时间8点00分00秒 MOV A,HOUR时间值送显示缓冲区79H7EH ANL A,#0F0H SWAP A MOV 79H,AA Pera Global Company PERA China MOV A,HOUR ANL A,#0FH MOV 7AH,A MOV A,MINUTE ANL A,#0F0H SWAP A MOV
9、 7BH,A MOV A,MINUTE ANL A,#0FH MOV 7CH,A MOV A,SECOND ANL A,#0F0H SWAP A MOV 7DH,A MOV A,SECOND ANL A,#0FH MOV 7EH,A MOV R3,#00H;R3初值设为0,显示时钟 ACALL INI7219;调用7219初始化子程序I NI7219:MOV 50H,#0FH;显示测试寄存器设置 MOV 51H,#00H;非测试模式,正常显示MOV R0,#50HACALL SEND7219MOV 50H,#0CH;关闭显示寄存器MOV 51H,#01H;正常显示MOV R0,#50HACAL
10、L SEND7219MOV 50H,#0BH;扫描界限寄存器MOV 51H,#05H;6位显示MOV R0,#50HACALL SEND7219MOV 50H,#0AH;亮度寄存器,其值为000EH,设置为0AHA Pera Global Company PERA China MOV 51H,#09HMOV R0,#50HACALL SEND7219MOV 50H,#09H;译码方式寄存器MOV 51H,#0FFH;8位显示全部B译码MOV R0,#50HACALL SEND7219RETDISPLAY:MOV 50H,#01H ;显示子程序 MOV 51H,79H;显示缓冲区设在79H7EH
11、单元MOV R0,#50H;其内容从左至右一次显示在数码管显示器上ACALL SEND7219MOV 50H,#02HMOV 51H,7AH MOV R0,#50HACALL SEND7219MOV 50H,#03HMOV 51H,7BHMOV R0,#50HACALL SEND7219MOV 50H,#04HMOV 51H,7CHMOV R0,#50HACALL SEND7219MOV 50H,#05HMOV 51H,7DHMOV R0,#50HACALL SEND7219MOV 50H,#06HMOV 51H,7EHMOV R0,#50HACALL SEND7219RETA Pera Gl
12、obal Company PERA ChinaSEND7219:CLR LOAD;向7219写入数据子程序 MOV R4,#02H;写入16位串行数据CLR CLOP1: MOV R1,#08H MOV A,R0LOP2: RLC A MOV DIN,C SETB CLK CLR CLK DJNZ R1,LOP2 INC R0 DJNZ R4,LOP1 SETB LOAD RET;键扫描处理子程序KEY: JNB KEY1,KK1;判断KEY1键是否按下 JB KEY1,$;等待KEY1键是否释放INC R3;模式值增1 ,在0、1、2、3间逐项切换 CJNE R3,#04H,JMPKK3;当
13、让中的模式值为4时,在设置为0 MOV R3,#00HJMPKK3:AJMP KK3;转至KK3,按R3内容选择显示KK1:JNB KEY2,KK2;判断KEY2键是否按下 JB KEY2,$ ;等待KEY2键释放MOV A,R3;根据当前R3值对时间项增1调整RL AMOV DPTR,#KJMP1JMP A+DPTRKJMP1: AJMP DISCLK AJMP SINC AJMP MINC AJMP HINCA Pera Global Company PERA ChinaSINC: MOV A,SECOND;秒增1 ADD A,#01H DA A MOV SECOND,A CJNE A,#
14、60H,DISS1 MOV 30H,#01HDISS1:AJMP DISS;转至秒显示缓冲区设置MINC:MOV A,MINUTE;分增1 ADD A,#01H DA A MOV MINUTE,A CJNE A,#60H,DISM1 MOV MINUTE,#00HDISM1:AJMP DISM;转至分显示缓冲区设置HINC: MOV A,HOUR;时增1 ADD A,#01H DA A MOV HOUR,A CJNE A,#24H,DISH1 MOV HOUR,#00HDISH1:AJMP DISH;转至时显示缓冲区设置KK2:JNB KEY3,KK3;判断KEY3是否按下 JB KEY3,$
15、 ;等待KEY3键释放MOV A,R3RL AMOV DPTR,#KJMP2JMP A+DPTRKJMP2:AJMP DISCLK AJMP SDEC AJMP MDEC AJMP HDECSDEC:MOV A,#9AH;秒减1 CLR C SUBB A,#01H ADD A,SECOND DA AA Pera Global Company PERA ChinaMOV SECOND,A CJNE A,#00H,DISS2 MOV SECOND,#59HDISS2:AJMP DISS;转至秒显示缓冲区设置MDEC:MOV A,#9AH;分减1 CLR C SUBB A,#01H ADD A,MI
16、NUTE DA A MOV MINUTE,A CJNE A,#0,DISM2 MOV MINUTE,#59HDISM2:AJMP DISM;转至分显示缓冲区设置HDEC:MOV A,#9AH;时减1 CLR C SUBB A,#01H ADD A,HOUR DA A MOV HOUR,A CJNE A,#99H,DISH2 MOV HOUR,#23HDISH2:AJMP DISH;转至时显示缓冲区设置KK3:MOV A,R3 RL AMOV DPTR,#KJMP3 JMP A+DPTRKJMP3:AJMP DISCLK ;R3=0显示时钟 AJMP DISS;R3=1显示秒 AJMP DISM
17、;R3=2显示分 AJMP DISH;R3=3显示时DISCLK:MOV R0,#79H MOV R1,#HOUR MOV R4,#03HA Pera Global Company PERA ChinaCFLOOP:MOV A,R1 SWAP A ANL A,#0FH MOV R0,A INC R0 MOV A,R1 ANL A,#0FH MOV R0,A INC R0 DEC R1 DJNZ R4,CFLOOP SETB TR0 RETDISS:CLR TR0;显示秒,时与分的数码管不亮 MOV A,SECOND SWAP A ANL A,#0FH MOV 7DH,A MOV A,SECON
18、D ANL A,#0FH MOV 7EH,A MOV 79H,#0FH MOV 7AH,#0FH MOV 7BH,#0FH MOV 7CH,#0FH AJMP KK5DISM:CLR TR0;显示分,时与秒的数码管不亮 MOV A,MINUTE SWAP A ANL A,#0FH MOV 7BH,A MOV A,MINUTE ANL A,#0FH MOV 7CH,A MOV 79H,#0FH MOV 7AH,#0FH MOV 7DH,#0FH MOV 7EH,#0FH AJMP KK5A Pera Global Company PERA ChinaDISH: CLR TR0 ;显示时,分与秒的
19、数码管不亮 MOV A,HOUR SWAP A ANL A,#0FH MOV 79H,A MOV A,HOUR ANL A,#0FH MOV 7AH,A MOV 7BH,#0FH MOV 7CH,#0FH MOV 7DH,#0FH MOV 7EH,#0FHKK5:RET;定时器T0中断处理子程序TIMER0:PUSH ACC;保护现场 PUSH PSW MOV TH0,#0B1H;重装定时常数 MOV TL0,#0E0H DJNZ R2,NEXT;判断是否中断了50次,不足50次,中断返回MOV R2,#50;若达到50次,计时满1s,刷新时间单元格 MOV A,SECOND ADD A,#01H DA A MOV SECOND,A CJNE A,#60H,NEXTS1:MOV SECOND,#00H MOV A,MINUTEADD A,#01HDA AMOV MINUTE,ACJNE A,#60H,NEXTS2:MOV MINUTE,#00H MOV A,HOUR ADD A,#01H DA A MOV HOUR,A CJNE A,#24H,NEXT MOV HOUR,#00HNEXT:POP PSW;恢复现场 POP ACCRETI;中断返回 END