《电子时钟-万年历-单片机设计.doc》由会员分享,可在线阅读,更多相关《电子时钟-万年历-单片机设计.doc(28页珍藏版)》请在三一办公上搜索。
1、一、题目:电子实时时钟/万年日历系统二、功能要求: 1 基本要求: 显示准确的北京时间(时、分、秒),可用24小时制式; 随时可以调校时间。2 发挥要求: 增加公历日期显示功能(年、月、日),年号只显示最后两位; 随时可以调校年、月、日; 允许通过转换功能键转换显示时间或日期。三、方案考虑: 1、硬件方案: 显示器采用6位LED数码管(共阳),可分别显示时间或日期。 显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码。采用“一键多用方案”,以减
2、少按键数目。本方案采用了4按键。 整体上要考虑:结构简单、布局美观、操作方便、成本低廉。2、设计电路图如下:3、元件清单:(我们使用的是TX-1C开发板) 89C52 1个 IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。 74LS244 1个(用于驱动6个共阳的LED段数码管)。 IC座(20脚) 1个(用于接插74LS244)。(5)显示器:LED_8段数码管(共阳型)6个三极管:(6)PNP(8550) 6个(用于驱动6个共阳型LED段数码管)。(7)微型开关: 3个(其中1个用于复位电路、其它用于键盘)。(8)晶体振荡器(12MHz):1个(用于振荡电
3、路)。(9)电阻器: 3K 1个(用于系统复位电路)。 1K 6个(用作PNP三极管基极电阻)。 100 7个(驱动器用作74LS244输出限流电阻)。(10)电容器: 10F 1个(用于系统复位电路)。 30 pF 2个(用于系统振荡电路)。(11)其它: 万能电路板(1015): 1块 焊锡条: 2米 带插头、座的电源端子: 1条 各种颜色外皮的导线: 各1米(12)工具:1电烙铁: 1把2剪钳: 1把3镊子: 1把4万用表: 1个(13)设备:编程器(MEP300或TOP851) 6个4、软件方案: (1)使用全汇编编写 (2)时钟基准时间由单片机内部定时中断来提供,定时时间应该乘以一个
4、整数得到,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。一般来说,基准时间越短,越有利于提高时钟运行的精确度。本实验定时50mS。乘以一个整数20得到“1秒”,本程序的时钟能实现精确定时,在1小时后,误差值在1秒内(3为了能使调整的状态位能被操作者知道,本系统使用特别的光标技术,使调节器整的当前位特别亮,没有调整时则全部数码管的亮度一致,具体实施起来就是:设置7个光标显示状态位(key1),里面的6个位对应6个光标位,1位对应空闲位.当按下按键2时,对应光标位将被加1.(4)光标位的显示原理是,当光标状态位是对应值时,将其显示值两次赋给数码管
5、.(5)在按键松手检测程序中,改变将其放在死循环的做法,当没松手时,不断调用显示子程序,使数码管的显示不会“熄灭”对于串口收发,本程序采用的是在主程序的循环里面不断进行键盘扫描,当按下四个独立按键时,分别向按键发送四个不同数值,然后引起串口中断,在串口中断的时侯读入四个键值,在中断子程序读入四个键值,对不同键值采用不同操作。 把按键分4情况来处理,操作简单。4按键功能如下:Key1键:(对应单片机左下角第一位):启动主程序后,其初始值为0,即光标位没有显示,当该键多次按下,KEY1值依次加一,加到7后,又返回光标0位Key2键:(对应单片机左下角第二位):其功能是将对应光标位的时分秒值或年月日
6、值加一Key3键:(对应单片机左下角第三位):其功能是使显示在年月日与时分秒之间切换Key4键:(对应单片机左下角第四位):其功能是是显示在子模块与主模块之间切换 (7)整点歌唱功能:在定时器一里面加入音乐子程序,整首歌唱完之后自动跳出,d原理是:因为我们采用的歌曲是通过死循环播放的,所以在播放音乐的时候我们肯定不能让数码管动态显示以及让定时器0继续计时,所以我们在让音乐播放16秒之后停止,然后时间值加上16秒继续计时5、程序流程图如下:(1) 电子时钟计算程序图(2)调整流程图汇编程序编写如下(共1039行,24页,源程序后是收获与体会):;/ORG 0000HLJMP MAINORG 00
7、0BH LJMP INTT0 ORG 001BH LJMP START;ORG 0023HLJMP CHUKOUSPK EQU P2.3 ;音乐DULA EQU P2.6;伪指令定义WELA EQU P2.7MIAO0 DATA 30HMIAO1 DATA 31HFEN0 DATA 32HFEN1 DATA 33HSHI0 DATA 34HSHI1 DATA 35HDAY0 DATA 37HDAY1 DATA 38HMON0 DATA 39HMON1 DATA 40HYEA0 DATA 41HYEA1 DATA 42HKEY1 DATA 43HKEY2 DATA 45HKEY3 DATA 46
8、HKEY4 DATA 47HFLAG1 DATA 48HFLAG2 DATA 49HPASSIN DATA 50HPASSOUT DATA 51HCHANGGE DATA 52HORG 0070H INTT0: MOV TH0,#3CH ;中断进来定时器计数; MOV TL0,#0B0H INC 20H MOV A,20H CJNE A,#20,TIAOGUO MOV 20H,#00H INC MIAO0 ;秒计数; MOV A,MIAO0 CJNE A,#10,TIAOGUO MOV MIAO0,#0 INC MIAO1;十秒计数; MOV A,MIAO1 CJNE A,#6,TIAOGUO
9、MOV MIAO1,#0 INC FEN0 MOV A,FEN0 CJNE A,#10,TIAOGUO MOV FEN0,#0 INC FEN1 MOV A,FEN1 CJNE A,#6,TIAOGUO MOV FEN1,#0 ;设定播音乐时间;MOV R1,MIAO0CJNE R1,#0,TIAOYIN MOV R2,MIAO1 CJNE R2,#0,TIAOYIN MOV R3,FEN0 CJNE R3,#0,TIAOYIN MOV R4,FEN1 CJNE R4,#0,TIAOYINSETB ET1 TIAOYIN: INC SHI0 MOV A,SHI1 ;小时计数; CJNE A,#
10、2,SHIZHIA MOV A,SHI0 CJNE A,#4,TIAOGUO MOV SHI0,#0 INC SHI1 AJMP SHIZHIB SHIZHIA:MOV A,SHI0 CJNE A,#10,TIAOGUO MOV SHI0,#0 INC SHI1 SHIZHIB:MOV A,SHI1 CJNE A,#3,TIAOGUO MOV SHI1,#0 INC DAY0 AJMP TIAOGUO1 TIAOGUO:AJMP TIAOGUO2 TIAOGUO1: MOV A,DAY1 ;天计数; CJNE A,#3,DAYZHIA MOV A,DAY0 CJNE A,#2,TIAOGUO2
11、 MOV DAY0,#1 INC DAY1 AJMP DAYZHIB DAYZHIA:MOV A,DAY0 CJNE A,#10,TIAOGUO2 MOV DAY0,#0 INC DAY1 DAYZHIB:MOV A,DAY1 CJNE A,#4,TIAOGUO2 MOV DAY1,#0 INC MON0 ;月计数,并且使它不益出;MOV A,MON1 ; CJNE A,#1,MONZHIA MOV A,MON0 CJNE A,#3,TIAOGUO2 MOV MON0,#1 INC MON1 AJMP MONZHIB MONZHIA:MOV A,MON0 CJNE A,#10,TIAOGUO2
12、 MOV MON0,#0 INC MON1 MONZHIB:MOV A,MON1 CJNE A,#2,TIAOGUO2 MOV MON1,#0 INC YEA0 ;年计数; MOV A,YEA0 CJNE A,#10,TIAOGUO2 MOV YEA0,#0 INC YEA1 ; MOV A,YEA1 CJNE A,#10,TIAOGUO2 MOV YEA1,#0 TIAOGUO2: RETICHUKOU:CLR ES ;串口中断弹进;MOV A,SBUFMOV PASSIN,ARNEWS:JBC RI,HELLO1 SJMP RNEWSHELLO1: SETB ESMOV A,PASSINC
13、JNE A,#0,HELLO2INC KEY1 ;每次进来,加一,对七取模MOV A,KEY1MOV B,#7DIV ABMOV KEY1,BHELLO2:MOV A,PASSINCJNE A,#1,HELLO3INC KEY2HELLO3:MOV A,PASSINCJNE A,#2,HELLO4INC FLAG1MOV A,FLAG1MOV B,#2DIV ABMOV FLAG1,BHELLO4:MOV A,PASSINCJNE A,#3,HELLO5INC FLAG2MOV A,FLAG2MOV B,#3DIV ABMOV FLAG2,BHELLO5:RETI MAIN: MOV TH0,
14、#3CH ;初始化所有参数MOV TL0,#0B0HMOV TH1,#0FFHMOV TMOD,#21H SETB EASETB ET0SETB TR0 ;定时器开始计数;SETB TR1SETB RENSETB SM0CLR SM1SETB ES MOV MIAO0,#5 ;时分秒初值MOV MIAO1,#5MOV FEN0,#9MOV FEN1,#5MOV SHI0,#3MOV SHI1,#2 ; 一个倒着看,一个顺着看MOV YEA1,#0 ; 年月日初值MOV YEA0,#9MOV MON1,#1MOV MON0,#2MOV DAY1,#3MOV DAY0,#1MOV KEY1,#0M
15、OV KEY2,#0MOV KEY3,#0MOV KEY4,#0MOV FLAG1,#0MOV FLAG2,#0MOV CHANGGE,#0 LOOP: MOV A,FLAG1 CJNE A,#0,LEI0 MOV A,KEY1;光标调整时分秒或着年月日; CJNE A,#1,NEXT2 MOV A,KEY2 CJNE A,#1,NEXT2 MOV KEY2,#0 INC MIAO0 NEXT2: MOV A,KEY1 CJNE A,#2,NEXT3 MOV A,KEY2 CJNE A,#1,NEXT3 MOV KEY2,#0 INC MIAO1 NEXT3: MOV A,KEY1 CJNE
16、A,#3,NEXT4 MOV A,KEY2 CJNE A,#1,NEXT4 MOV KEY2,#0 INC FEN0 NEXT4: MOV A,KEY1 CJNE A,#4,NEXT5 MOV A,KEY2 CJNE A,#1,NEXT5 MOV KEY2,#0 INC FEN1 NEXT5: MOV A,KEY1 CJNE A,#5,NEXT6 MOV A,KEY2 CJNE A,#1,NEXT6 MOV KEY2,#0 INC SHI0 NEXT6: MOV A,KEY1 CJNE A,#6,TIAOZHU2; MOV A,KEY2 CJNE A,#1,TIAOZHU2 MOV KEY2,
17、#0 INC SHI1 AJMP TIAOZHU2 ;光标调整年月日,并且通过FLAG1检测,使时分秒的调整不影响年月日; LEI0: MOV A,KEY1 CJNE A,#1,NEXT22 MOV A,KEY2 CJNE A,#1,NEXT22 MOV KEY2,#0 INC DAY0 NEXT22: MOV A,KEY1 CJNE A,#2,NEXT33 MOV A,KEY2 CJNE A,#1,NEXT3 MOV KEY2,#0 INC DAY1 NEXT33: MOV A,KEY1 CJNE A,#3,NEXT44 MOV A,KEY2 CJNE A,#1,NEXT44 MOV KEY
18、2,#0 INC MON0 NEXT44: MOV A,KEY1 CJNE A,#4,NEXT55 MOV A,KEY2 CJNE A,#1,NEXT55 MOV KEY2,#0 INC MON1 NEXT55: MOV A,KEY1 CJNE A,#5,NEXT66 MOV A,KEY2 CJNE A,#1,NEXT66 MOV KEY2,#0 INC YEA0 NEXT66: MOV A,KEY1 CJNE A,#6,TIAOZHU2; MOV A,KEY2 CJNE A,#1,TIAOZHU2 MOV KEY2,#0 INC YEA1 ;主要部分; TIAOZHU2: ACALL KEY
19、SCAN MOV A,FLAG2 ;主次模块判断,分别对应显示LED_DISPLAY,LED_DISPLAY2,3,4; CJNE A,#0,ZHU2 MOV A,FLAG1 CJNE A,#0,ZHU1 ACALL LED_DISPLAY AJMP ZHU4 ZHU1:ACALL LED_DISPLAY2 AJMP ZHU4 ZHU2:MOV A,FLAG2 CJNE A,#1,ZHU3 ACALL LED_DISPLAY3 AJMP ZHU4 ZHU3:MOV A,FLAG2 CJNE A,#2,ZHU4 ACALL LED_DISPLAY4 ZHU4: MOV A,MIAO0 ;使按键调
20、整无溢出模块,因为在将其放在定时器0的子程序里的反应调整时间没有主程序快; CJNE A,#10,TIAO1 MOV MIAO0,#0 TIAO1: MOV A,MIAO1 CJNE A,#6,TIAO2 MOV MIAO1,#0 TIAO2: MOV A,FEN0 CJNE A,#10,TIAO3 MOV FEN0,#0 TIAO3: MOV A,FEN1 CJNE A,#6,TIAO4 MOV FEN1,#0 TIAO4: MOV A,SHI1 CJNE A,#2,TIAO44 CLR C ;对应c语言里的(if(x3); MOV A,#3 SUBB A,SHI0 JNC TIAO5MOV
21、 SHI0,#0AJMP TIAO5 TIAO44: MOV A,SHI0 CJNE A,#10,TIAO5 MOV SHI0,#0 TIAO5:MOV A,SHI1 CJNE A,#3,TIAO6 MOV SHI1,#0 TIAO6:MOV A,DAY1 ;使得调整的时间不会出现25小时,37号,16月之类; CJNE A,#3,TIAO66 CLR C ;通过减法判断进位来判别是否达到调整条件;MOV A,#1SUBB A,DAY0JNC TIAO7MOV DAY0,#0AJMP TIAO7TIAO66:MOV A,DAY0CJNE A,#10,TIAO7MOV DAY0,#0TIAO7:
22、MOV A,DAY1CJNE A,#4,TIAO8MOV DAY1,#0TIAO8:MOV A,MON1 ;CJNE A,#1,TIAO88 CLR CMOV A,#2SUBB A,MON0JNC TIAO9 ;使调整不会超出A;MOV MON0,#0AJMP TIAO9TIAO88:MOV A,MON0CJNE A,#10,TIAO9MOV MON0,#0TIAO9:MOV A,MON1CJNE A,#2,TIAO10MOV MON1,#0TIAO10:MOV A,YEA0 CJNE A,#10,TIAO11 MOV YEA0,#0TIAO11:MOV A,YEA1 CJNE A,#10,T
23、IAOGUO3 MOV YEA1,#0 TIAOGUO3: AJMP LOOP;跳回,循环主程序LED_DISPLAY: SETB DULA MOV A,MIAO0 ;赋值 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#1,GUAN2 LCALL DELAY2SETB DULA MOV A,MIAO0 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LC
24、ALL DELAY2 GUAN2: SETB DULA MOV A,MIAO1 ;赋值 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#2,GUAN3 SETB DULA MOV A,MIAO1 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LCALL DELAY2 GUAN3: SETB DULA MOV A,FEN0 ;赋值 ACALL PLAY C
25、LR DULA MOV P0,#0FFH SETB WELA MOV P0,#0F7H CLR WELA LCALL DELAY1 MOV A,KEY1 CJNE A,#3,GUAN4 SETB DULA MOV A,FEN0 ;判断光标位 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0F7H CLR WELA LCALL DELAY2 GUAN4: SETB DULA MOV A,FEN1 ;赋值 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FBH CLR WELA LCAL
26、L DELAY1MOV A,KEY1 ;判断光标位CJNE A,#4,GUAN5 SETB DULA MOV A,FEN1 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FBH CLR WELA LCALL DELAY2GUAN5: SETB DULA MOV A,SHI0 ;赋值 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FDH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#5,GUAN6 SETB DULA MOV A,S
27、HI0 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FDH CLR WELA LCALL DELAY2GUAN6: SETB DULA MOV A,SHI1 ;赋值 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FEH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#6,ZHUANG1 SETB DULA MOV A,SHI1 ACALL PLAY CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0
28、FEH CLR WELA LCALL DELAY2ZHUANG1:NOP RETPLAY: MOV DPTR,#SEG_DATA MOVC A,A+DPTR MOV P0,A RET;年月日显示; LED_DISPLAY2: SETB DULA MOV A,DAY0 ;赋值 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#1,GUAN22 LCALL DELAY2SETB DULA MOV A,DAY0 ACALL PLAY2 CLR
29、 DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LCALL DELAY2 GUAN22: SETB DULA MOV A,DAY1 ;赋值 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#2,GUAN33 SETB DULA MOV A,DAY1 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LC
30、ALL DELAY2 GUAN33: SETB DULA MOV A,MON0 ;赋值 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0F7H CLR WELA LCALL DELAY1 MOV A,KEY1 CJNE A,#3,GUAN44 SETB DULA MOV A,MON0 ;判断光标位 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0F7H CLR WELA LCALL DELAY2 GUAN44: SETB DULA MOV A,MON1 ;赋值 ACALL PLA
31、Y2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FBH CLR WELA LCALL DELAY1MOV A,KEY1 ;判断光标位CJNE A,#4,GUAN55 SETB DULA MOV A,MON1 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FBH CLR WELA LCALL DELAY2GUAN55: SETB DULA MOV A,YEA0 ;赋值 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FDH CLR WELA
32、 LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#5,GUAN66 SETB DULA MOV A,YEA0 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FDH CLR WELA LCALL DELAY2GUAN66: SETB DULA MOV A,YEA1 ;赋值 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FEH CLR WELA LCALL DELAY1 MOV A,KEY1 ;判断光标位 CJNE A,#6,ZHUANG11 SET
33、B DULA MOV A,YEA1 ACALL PLAY2 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FEH CLR WELA LCALL DELAY2ZHUANG11:NOP RETPLAY2: MOV DPTR,#SEG_DATA MOVC A,A+DPTR MOV P0,A RET;子模块1;LED_DISPLAY3: SETB DULA MOV A,#5 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LCALL DELAY1 SETB DULA MOV
34、A,#4 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LCALL DELAY1 SETB DULA MOV A,#3 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0F7H CLR WELA LCALL DELAY1 SETB DULA MOV A,#2 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FBH CLR WELA LCALL DELAY1 SETB DUL
35、A MOV A,#1 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FDH CLR WELA LCALL DELAY1 SETB DULA MOV A,#0 ;赋值 ACALL PLAY3 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0FEH CLR WELA LCALL DELAY1 RETPLAY3: MOV DPTR,#SEG_DATA MOVC A,A+DPTR MOV P0,A RET;子模块2; LED_DISPLAY4: SETB DULA MOV A,#15;赋值 ACALL PLAY4 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0DFH CLR WELA LCALL DELAY1 SETB DULA MOV A,#14 ;赋值 ACALL PLAY4 CLR DULA MOV P0,#0FFH SETB WELA MOV P0,#0EFH CLR WELA LCALL DELAY1 SETB DULA MOV A,#13