当前位置:文档之家› 基于51单片机的数字钟毕业设计

基于51单片机的数字钟毕业设计

大学电子信息学院电子系统综合设计课程论文基于51单片机的数字钟设计2010 年 6 月 20日目录1 作品的背景与意义 (1)2 功能指标设计 (1)3 作品方案设计 (2)4 软件设计 (3)附录1 系统电路图 (6)附录2 系统软件代码 (7)1 作品的背景与意义时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。

怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。

现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。

现在我们利用单片机实现数字时钟计时功能的主要容,其中AT89C51是核心元件同时采用数码管动态显示“时”,“分”,“秒”的现代计时装置。

与传统机械表相比,它具有走时精确,显示直观等特点。

它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点,除此外还实现了万年历和闹钟等的功能。

时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。

在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。

单片计算机即单片微型计算机。

(Single-Chip Microcomputer ),是集CPU、RAM、ROM、定时、计数和多种接口于一体的微控制器。

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

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

所以综上所述,此次实验中所完成的数字钟有着强大的功能和良好的市场前景,复合电子类产品的发展趋势。

2 功能指标设计2.1 基本功能1.设计一个精确的1秒定时器;2.根据1秒定时器,设计一个带小时、分钟、秒的时钟,并将小时、分钟、秒显示在LED上;3.设计小时、分钟、秒的修改按键,可分别调整小时、分钟、秒(按键设计参考电子表);2.2 拓展功能1.增加小时、分钟、秒的键盘直接修改功能;2.设计闹钟功能,最多支持5个闹钟,可分别查看和修改闹钟时间,可分别设置闹钟开关。

3.增加万年历功能。

3 作品方案设计3.1设计要求基本设计1.设计一个精确的一秒定时器2.运用一秒的定时器设计出有时、分、秒的数字钟,并显示在LED数码管上3.设置按键,能够修改数字钟时间扩展设计:1. 设计闹钟功能,能够查看和修改闹钟时间及开关状态2. 设计万年历功能,实现日→月→年的正常进位,能够查看和修改年月日,能够自动区分大小月和平闰年3.2模块划分●初始化程序设定初值,中断初始化●主程序程序主要执行部分,对子程序(显示、按键设置,闹钟、万年历功能)进行调用●定时器中断服务中断走时:秒→分→时●显示程序刷新8位数码管来显示时间、日期及扩展功能设置界面●按键设置通过对按键的操作实现时间及扩展功能的设置。

●闹钟功能修改闹铃时间,闹铃开关的置换,修改位闪烁加以区分●万年历功能修改日期,同样的修改位闪烁加以区分3.3模块设计概述1.按键设置通过调整选择键SET_KEY选择调整位,选中位开始闪烁,此时再按增加键ADD_KEY 或减少键DEC_KEY调整选中位,如果长按ADD_KEY或DEC_KEY,系统识别后则进行调时快进,此时停止闪烁,方便人眼观察。

同时还增加了调秒功能:如果选中位是秒,则按增加键或减少键都是将秒清零。

3. 时间设置进入时间设置界面后,通过调整选择键SET_KEY选择调整位,选中位闪烁。

按增加键ADD_KEY或减少键DEC_KEY设置所需要的时间。

4. 闹钟设置进入闹钟设置界面后,通过调整选择键SET_KEY选择调整位,选中位闪烁。

按增加键ADD_KEY或减少键DEC_KEY设置所需要的时间。

与时间设置不同的是,闹钟设置里增加了开关设置。

5. 万年历设置进入万年历设置界面后,通过调整选择键SET_KEY选择调整位,选中位闪烁。

按增加键ADD_KEY或减少键DEC_KEY设置所需要的时间。

万年历设置里增加了大小月和平闰年的判别。

4 软件设计4.1 主程序流程图4.2闹钟程序流程4.3万年历程序流程4.4中断系统结构图附录一附录二/*********************************************************************** ******///初始化MOV SP,#60H;栈指针地址赋值MOV 3CH,#0CH;设置界面修改位的闪烁频率具体代码在SERVE 1秒中断服务中MOV 37H,#0FFH ;临时地址预留给39HMOV 39H,#0FFH ;段位标志 8位数据对应8个数码管为0的那位数码管始终暗MOV 3AH,#11111101B;界面转换标志******01为时间界面取反后 ******10为万年历界面 ******00为设置闹钟界面CLR A ;时间万年历初始化时间00:00:00 万年历2000。

01。

01MOV 23H,A;时MOV 22H,A ;分MOV 21H,A ;秒MOV 33H,#01H;日MOV 34H,#01H ;月MOV 35H,A;年只能显示2000-2099的时间MOV 3DH,A ;数码管闪烁开关初始化为关闭状态取反后 11111111 打开MOV 40H,A ;闹钟设置界面预留地址地址MOV 41H,AMOV 42H,AMOV 43H,AMOV 44H,AMOV 45H,AMOV 46H,AMOV 47H,AMOV 50H,A ;闹钟1 时MOV 51H,A ;闹钟1 分MOV 52H,A ;闹钟1 秒MOV 0AH,A ;闹钟1 开关 00000000为关闭状态取反后打开闹钟1MOV 53H,A ;同上MOV 54H,AMOV 55H,AMOV 0BH,AMOV 56H,AMOV 57H,A ;同上MOV 58H,AMOV 0CH,AMOV 59H,A ;同上MOV 5AH,AMOV 5BH,AMOV 0DH,AMOV 5CH,A ;同上MOV 5DH,AMOV 5EH,AMOV 0EH,A**************************************************************/ ORG 0000H ;程序入口地址LJMP STARTORG 000BH ;定时器0中断入口地址LJMP TIMER_0ORG 0300H/*****程序开始,初始化*****/START:SETB 48H ;使用一个bit位用于调时闪烁标志SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒MOV 20H,#00H ;用于控制秒基准时钟源的产生MOV 21H,#00H ;清零秒寄存器MOV 22H,#00H ;清零分寄存器MOV 23H,#00H ;清零时寄存器MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生MOV IP,#02H ;IP,IE初始化MOV IE,#82HMOV TMOD,#01H ;设定定时器0工作方式1MOV TH0,#3CHMOV TL0,#0B0H ;赋定时初值,定时50msSETB TR0 ;启动定时器0MOV SP,#40H ;重设堆栈指针/*****主程序*****/MAIN:LCALL DISPLAY ;调用显示子程序LCALL KEY_SCAN ;调用按键检测子程序JZ MAIN ;无键按下则返回重新循环LCALL SET_KEY ;调用选择键处理子程序46H,MAIN ;如果已进行长按调整(调时快进),则不再执行下面的单步调整LCALL ADD_KEY ;调用增加键处理子程序,加一LCALL DEC_KEY ;调用减少键处理子程序,减一LJMP MAIN ;重新循环/*****定时器中断服务程序*****/TIMER_0:PUSH ACCPUSH PSW ;保护现场MOV TH0,#3CHMOV TL0,#0B0H ;重新赋定时初值CPL 47H ;产生脉冲用于调时快进时基INC 24HMOV A,24HCJNE A,#10,ADD_TIME ;产生0.5秒基准时钟,用于调时闪烁CPL 48H ;取反调时闪烁标志位MOV 24H,#00HADD_TIME: ;走时INC 20HMOV A,20HCJNE A,#20,RETI1 ;产生1秒基准时钟MOV 20H,#00H ;一秒钟时间到,清零20HMOV A,21HADD A,#01HDA A ;作十进制调整MOV 21H,ACJNE A,#60H,RETI1MOV 21H,#00H ;一分钟到MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETI1MOV 22H,#00H ;一小时到MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETI1MOV 23H,#00H ;到24点,清零小时RETI1:POP PSWPOP ACC ;恢复现场RETI ;中断返回/*****显示处理*****/DISPLAY:MOV A,21H ;秒ANL A,#0FHMOV 2FH,A ;转换出秒个位,存入2FHMOV A,21HANL A,#0F0HSWAP AMOV 2EH,A ;转换出秒十位,存入2EH46H,MIN ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#3,MIN ;如果R1为3,闪烁秒位待调整48H,MINMOV 2FH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2EH,#0AHMIN:MOV A,22H ;分ANL A,#0FHMOV 2DH,A ;转换出分个位,存入2DHMOV A,22HANL A,#0F0HSWAP AMOV 2CH,A ;转换出分十位,存入2CH46H,HOUR ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#2,HOUR ;如果R1为2,闪烁分位待调整48H,HOURMOV 2DH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2CH,#0AHHOUR:MOV A,23H ;时ANL A,#0FHMOV 2BH,A ;转换出时个位,存入2BHMOV A,23HANL A,#0F0HSWAP AMOV 2AH,A ;转换出时十位,存入2AH46H,DISP ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#1,DISP ;如果R1为1,闪烁时位待调整48H,DISPMOV 2BH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2AH,#0AH/*****数码管动态扫描显示*****/DISP:MOV DPTR,#TABLEMOV A,2FHMOVC A,A+DPTRMOV P0,ACLR P2.7LCALL DELAYSETB P2.7 ;显示秒个位MOV A,2EHMOVC A,A+DPTRMOV P0,ACLR P2.6LCALL DELAYSETB P2.6 ;显示秒十位MOV A,#0BFHMOV P0,ACLR P2.5LCALL DELAYSETB P2.5 ;显示“-”MOV A,2DHMOVC A,A+DPTRMOV P0,ACLR P2.4LCALL DELAYSETB P2.4 ;显示分个位MOV A,2CHMOVC A,A+DPTRMOV P0,ACLR P2.3LCALL DELAYSETB P2.3 ;显示分十位MOV A,#0BFHMOV P0,ACLR P2.2LCALL DELAYSETB P2.2 ;显示“-”MOV A,2BHMOVC A,A+DPTRMOV P0,ACLR P2.1LCALL DELAYSETB P2.1 ;显示时个位MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0 MOV A,2AHMOVC A,A+DPTRMOV P0,ACLR P2.0LCALL DELAYSETB P2.0 ;显示时十位RET/*****按键检测子程序*****/KEY_SCAN:CLR 46H ;关闭长按调整(调时快进)标志MOV P1,#0FFH ;将P1口设置成输入状态MOV A,P1CPL AANL A,#07H ;P1口低3位连接3个按键,只判断该3位JZ EXIT_KEY ;无键按下则返回LCALL DELAY ;延时去抖动MOV A,P1 ;重新判断CPL AANL A,#07HJZ EXIT_KEY ;键盘去抖动MOV R5,A ;临时将键值存入R5MOV R4,#00H ;用于控制调时快进速度;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进LOOP: ;进入长按处理LCALL DISPLAY ;使长按时显示正常MOV A,P1CPL AANL A,#07H47H,LOOP1INC R4 ;调时快进间隔时间基准加1LOOP1:CJNE R1,#03H,LOOP2 ;如果调秒时长按,则不处理LJMP LOOP3LOOP2:CJNE R4,#99H,LOOP3MOV R4,#70H ;确认用户长按后,重新设定起始值,加快调时快进速度SETB 46H ;长按调整(调时快进)标志LCALL ADD_KEYLCALL DEC_KEYLOOP3:JNZ LOOP ;等待键释放MOV A,R5 ;输出键值RETEXIT_KEY:RET/*****延时子程序*****/DELAY:MOV R7,#150DJNZ R7,$RET/*****选择键处理子程序*****/SET_KEY:CJNE R5,#01H,EXIT ;选择键键值INC R1 ;调整选择功能标志加一CJNE R1,#4,EXITMOV R1,#0MOV 24H,#00H ;调时闪烁基准清零RET/*****增加键处理子程序*****/ADD_KEY:CJNE R5,#02H,EXIT ;增加键键值CJNE R1,#01H,NEXT1 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,EXITMOV 23H,#00HNEXT1:CJNE R1,#02H,NEXT2 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,EXITMOV 22H,#00HNEXT2:CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如增加键按下直接清零秒RET/*****减少键处理子程序*****/DEC_KEY:CJNE R5,#04H,EXIT ;减少键键值CJNE R1,#01H,NEXT3 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#99HDA AMOV 23H,ACJNE A,#99H,EXITMOV 23H,#23HNEXT3:CJNE R1,#02H,NEXT4 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#99HDA AMOV 22H,ACJNE A,#99H,EXITMOV 22H,#59HNEXT4:CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如较少键按下直接清零秒RET/*****万用返回子程序*****/EXIT:RET/*****数码管字形编码表*****/TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形显示编码TABLE1:DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小时位的十位数编码,该位如果为0则不显示//闹钟检测MOV A,0AHJZ NAO2 ;检测闹钟开关若关检测下一个闹钟,否则检测时间是否为闹钟设定时间MOV A,30HCJNE A,50H,NAO2MOV A,31HCJNE A,51H,NAO2MOV A,32HCJNE A,52H,NAO2AJMP XIANG ;时间为闹钟设定时间吻合进入闹铃程序下同NAO2:MOV A,0BHJZ NAO3MOV A,30HCJNE A,53H,NAO3MOV A,31HCJNE A,54H,NAO3MOV A,32HCJNE A,55H,NAO3AJMP XIANGNAO3:MOV A,0CHJZ NAO4MOV A,30HCJNE A,56H,NAO4MOV A,31HCJNE A,57H,NAO4MOV A,32HCJNE A,58H,NAO4AJMP XIANGNAO4:MOV A,0DHJZ NAO5MOV A,30HCJNE A,59H,NAO5MOV A,31HCJNE A,5AH,NAO5MOV A,32HCJNE A,5BH,NAO5AJMP XIANGNAO5:MOV A,0EHJZ BUMOV A,30HCJNE A,5CH,BUMOV A,31HCJNE A,5DH,BUMOV A,32HCJNE A,5EH,BUAJMP XIANG//检测独立按键BU: T0,ZHU1 ;检测s19是否按下按下进入万年历界面,否则检测矩阵键盘MOV A,3AH ;界面转换标志取反即可使得时间和万年历界面相互转换CPL AMOV 3AH,A//检测矩阵键盘//检测到按键1,2,3,4,5时进入对应的闹钟设置界面检测到0BH(对应s11)进入时间设置界面检测到0CH(对应s12)进入万年历设置界面//若未检测到按键则跳回主程序继续下一个检测周期ZHU1:MOV R7,#0FHACALL JIANCEANJIAN ;矩阵键盘检测子程序将检测到的键值存入r7 CJNE R7,#0FH,ZHU2AJMP ZHUXUNHUANZHU2:CJNE R7,#0BH,ZHU3AJMP SHIJIANSHEZHIZHU3:CJNE R7,#0CH,ZHU4AJMP WANNIANLISHEZHIZHU4:CJNE R7,#01H,ZHU5AJMP NAOZHONGSHEZHIZHU5:CJNE R7,#02H,ZHU6AJMP NAOZHONGSHEZHIZHU6:CJNE R7,#03H,ZHU7AJMP NAOZHONGSHEZHIZHU7:CJNE R7,#04H,ZHU8AJMP NAOZHONGSHEZHIZHU8:CJNE R7,#05H,ZHUXUNHUAN0AJMP NAOZHONGSHEZHIZHUXUNHUAN0:AJMP ZHUXUNHUAN//年月日校正子程序用于万年历进位和万年历设置防止出现不存在的时间NYR:MOV A,33HCJNE A,#32,MONTH ;日为32时,月进位日置1MOV 33H,#01HAJMP MONTH0MONTH:CJNE A,#31,MONTH1 ;日为31时分辨大小月及2月MOV A,34HCJNE A,#4,MONTH2MOV 33H,#01HAJMP MONTH0MONTH2:CJNE A,#2,MONTH6MOV 33H,#01HAJMP MONTH0MONTH6:CJNE A,#6,MONTH9MOV 33H,#01HAJMP MONTH0MONTH9:CJNE A,#9,MONTH11MOV 33H,#01HAJMP MONTH0MONTH11:CJNE A,#11,RETURN0MOV 33H,#01HAJMP MONTH0MONTH1:CJNE A,#30,MONTH29 ;日为30时分辨2月MOV A,34HCJNE A,#02H,RETURN0MOV 33H,#01HAJMP MONTH0MONTH29:CJNE A,#29,RETURN0 ;日为29时分辨闰平年2月MOV A,34HCJNE A,#02H,RETURN0MOV A,35HMOV B,#04HDIV ABMOV A,BJNZ MONOAJMP RETURN0MONO:MOV 33H,#01HMONTH0:MOV A,#01H ;月进位ADD A,34HMOV 34H,ACJNE A,#0DH,RETURN0MOV 34H,#01HMOV A,#01HADD A,35HMOV 35H,ACJNE A,#100,RETURN0 ;年最多只能99MOV 35H,#00RETURN0: RET/******************************************************************/ //屏幕刷新中断XIANSHI:PUSH BPUSH DPHPUSH DPLPUSH PSWPUSH ACCMOV TH1,#0DFHMOV TL1,#0E0HMOV A,3AHJNB ACC.0,WANNIANLI ;界面显示判断//时间界面MOV A,21HMOV B,#0AHDIV ABMOV 10H,BMOV 11H,AMOV A,22HMOV B,#0AHDIV ABMOV 12H,BMOV 13H,AMOV A,23HMOV B,#0AHDIV ABMOV 14H,BMOV 15H,AMOV 16H,#0AH MOV 17H,#0AH AJMP LIANG//万年历界面WANNIANLI:JNB ACC.1,SHEZHI MOV A,33HMOV B,#0AHDIV ABMOV 10H,BMOV 11H,AMOV A,34HMOV B,#0AHDIV ABMOV 12H,BMOV 13H,AMOV A,35HMOV B,#0AHDIV ABMOV 14H,BMOV 15H,AMOV 16H,#00HMOV 17H,#02HAJMP LIANG//闹钟设置界面SHEZHI:MOV 10H,40HMOV 11H,41HMOV 12H,42HMOV 13H,43HMOV 14H,44HMOV 15H,45HMOV 16H,46HMOV 17H,47H//万年历设置WANNIANLISHEZHI:MOV 3AH,#0FEH ;转换设置界面MOV 39H,#11011111B ;设置闪烁位MOV 37H,39HMOV 3DH,#0FFH ;开闪烁开关WM:ACALL NYR ;校正万年历T1,WS1 ;s20 按下退出设置界面MOV 39H,#0FFH ;关闪烁MOV 3DH,#00H ;闪烁开关关MOV 3AH,#11111101B ;转换成时间设置界面AJMP ZHUXUNHUANWS1:INT0,WS2 ;修改位右移同上MOV A,37HCJNE A,#11111110B,WSS0RR ARR ARR AMOV 37H,AS20:JNB INT0,S20AJMP WMWSS0:RR AMOV 37H,AS21:JNB INT0,S21AJMP WMWS2:INT1,WM1 ;修改位左移MOV A,37HCJNE A,#11011111B,WSS1RL ARL ARL AMOV 37H,AS23:JNB INT1,S23AJMP WMWSS1:RL AMOV 37H,AS24:JNB INT1,S24AJMP WM//矩阵键盘检测修改万年历WM1:MOV R7,#0FHACALL JIANCEANJIANCJNE R7,#0FH,WSJSZ1AJMP WMWSJSZ1:MOV A,37H ;检测修改位 ACC.5,WSJSZ2//修改年十位MOV A,35HMOV B,#0AHDIV ABMOV 1FH,BMOV A,R7MOV B,#0AHMUL ABADD A,1FHMOV 35H,AMOV A,37HRR AMOV 37H,AAJMP WMWSJSZ2:ACC.4,WSJSZ3//修改年个位MOV A,35HMOV B,#0AHDIV ABMOV B,#0AHMUL ABADD A,R7MOV 35H,AMOV A,37HRR AMOV 37H,AAJMP WMWSJSZ3:ACC.3,WSJSZ4//修改月十位只能为0,1 但月个位不为0,1,2是不能修改为1 月个位为0时不能修改为0CJNE R7,#00H,WSJ1MOV A,34HMOV B,#0AHDIV ABMOV A,BCJNE A,#00H,WLED4AJMP WMMMWSJ1:CJNE R7,#01H,WMMMMOV A,34HMOV B,#0AHDIV ABMOV A,BCJNE A,#00H,L1AJMP WLED4L1: CJNE A,#01H,L2AJMP WLED4L2: CJNE A,#02H,WMMMAJMP WLED4WMMM:LJMP WMWLED4:MOV A,34HMOV B,#0AHDIV ABMOV 1FH,BMOV A,R7MOV B,#0AHMUL ABADD A,1FHMOV 34H,AMOV A,37HRR AMOV 37H,AAJMP WMWSJSZ4:ACC.2,WSJSZ5//修改月个位但月十位为1时只能修改为0,1,2 月十位为0时不能修改为0 MOV A,34HDIV ABCJNE A,#00H,WJ0CJNE R7,#00H,WLED3AJMP WWMWJ0:CJNE R7,#00H,WJ1AJMP WLED3WJ1: CJNE R7,#01H,WJ2AJMP WLED3WJ2: CJNE R7,#02H,WWMAJMP WLED3WLED3:MOV B,#0AHMUL ABADD A,R7MOV 34H,AMOV A,37HRR AMOV 37H,AWWM: AJMP WMWSJSZ5:ACC.1,WSJSZ6//修改日十位只能为0,1,2,3 日个位不为0,1时不能修改为3 CJNE R7,#00H,WSJ10AJMP WLED2WSJ10:CJNE R7,#01H,WSJ20AJMP WLED2WSJ20:CJNE R7,#02H,WSJ30AJMP WLED2WSJ30:CJNE R7,#03H,WWMMOV A,33HDIV ABMOV A,BCJNE A,#00H,L3AJMP WLED2L3: CJNE A,#01H,WWMAJMP WLED2WLED2:MOV A,33HMOV B,#0AHDIV ABMOV 1FH,BMOV A,R7MOV B,#0AHMUL ABADD A,1FHMOV 33H,AMOV A,37HRR AMOV 37H,AAJMP WMWSJSZ6://修改日个位日十位为3时只能修改为0,1 MOV A,33HMOV B,#0AHDIV ABCJNE A,#00H,LL4CJNE R7,#00H,WLED1AJMP WMLL4:CJNE A,#03H,WLED1CJNE R7,#00H,WJ4AJMP WLED1WJ4:CJNE R7,#01H,WWMAJMP WLED1WLED1:MOV B,#0AHMUL ABADD A,R7MOV 33H,AMOV 37H,#11011111BAJMP WM/***************************************************************/ //矩阵按键检测子程序JIANCEANJIAN:MOV DPTR,#8000HMOV A,#0F0HMOVX DPTR,AMOV DPTR,#8000HMOVX A,DPTRCPL AJNZ XIAODOURETXIAODOU://ACALL DELAYMOV A,#0F0HMOV DPTR,#8000HMOVX A,DPTRCPL AJNZ PANRETPAN:MOV DPTR,#8000HMOV A,#11111110BMOVX DPTR,AMOV DPTR,#8000HMOVX A,DPTRJNB ACC.0,KEY10 ;低电位说明按键在该位JNB ACC.1,KEY20JNB ACC.2,KEY30 JNB ACC.3,KEY40MOV DPTR,#8000H MOV A,#11111101B MOVX DPTR,AMOV DPTR,#8000H MOVX A,DPTRJNB ACC.0,KEY50 JNB ACC.1,KEY60 JNB ACC.2,KEY70 JNB ACC.3,KEY80MOV DPTR,#8000H MOV A,#11111011B MOVX DPTR,AMOV DPTR,#8000H MOVX A,DPTRJNB ACC.0,KEY90 JNB ACC.1,KEY00 JNB ACC.2,TUI JNB ACC.3,KEY0C0 RETKEY10:MOV R7,#01HRETKEY20:MOV R7,#02HRETKEY30:MOV R7,#03HRETKEY40:MOV R7,#04HRETKEY50:MOV R7,#05HRETKEY60:MOV R7,#06HRETKEY70:MOV R7,#07HRETKEY80:MOV R7,#08HRETKEY90:MOV R7,#09HRETKEY00:MOV R7,#00HRETTUI:MOV R7,#0BHRETKEY0C0:MOV R7,#0CHRET/****************************************************/ //闹铃响XIANG:CLR P1.0//ACALL MDELAY//SETB P1.0T1,XIANG ;s20 退出闹铃跳回主循环SETB P1.0AJMP ZHUXUNHUAN/****************************************************/ //闹钟设置NAOZHONGSHEZHI://检测是哪个闹钟并初始化闹钟设置CJNE R7,#01H,NZ2MOV A,50HMOV B,#0AHDIV ABMOV 45H,AMOV 44H,BMOV A,51HMOV B,#0AHDIV ABMOV 43H,AMOV 42H,BMOV A,52HMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#50HMOV 47H,#01HMOV 08H,#0AHAJMP NANJIANNZ2:CJNE R7,#02H,NZ3MOV A,53HMOV B,#0AHDIV ABMOV 45H,AMOV 44H,BMOV A,54HMOV B,#0AHDIV ABMOV 43H,AMOV 42H,BMOV A,55HMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#53H MOV 47H,#02H MOV 08H,#0BH AJMP NANJIANNZ3:CJNE R7,#03H,NZ4 MOV A,56HMOV B,#0AHDIV ABMOV 45H,AMOV 44H,BMOV A,57HMOV B,#0AHDIV ABMOV 43H,AMOV 42H,BMOV A,58HMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#56H MOV 47H,#03H MOV 08H,#0CH AJMP NANJIANNZ4:CJNE R7,#04H,NZ5 MOV A,59HMOV B,#0AHDIV ABMOV 45H,A MOV 44H,B MOV A,5AH MOV B,#0AH DIV ABMOV 43H,A MOV 42H,B MOV A,5BH MOV B,#0AH DIV ABMOV 41H,A MOV 40H,B MOV 09H,#59H MOV 47H,#04H MOV 08H,#0DH AJMP NANJIAN NZ5:MOV A,5CH MOV B,#0AH DIV ABMOV 45H,A MOV 44H,B MOV A,5DH MOV B,#0AH DIV ABMOV 43H,A MOV 42H,B MOV A,5EH MOV B,#0AH DIV ABMOV 41H,A MOV 40H,B MOV 09H,#5CH MOV 47H,#05HMOV 08H,#0EHAJMP NANJIANNANJIAN:MOV 3AH,#11111100B ;界面转换成闹钟设置界面MOV 39H,#11011111BMOV 37H,39HMOV 3DH,#0FFH ;开闪烁NM: MOV R1,08HT0,XIA1 ;s19 闹钟开关MOV A,R1CPL AMOV R1,AXIA1:MOV A,R1JZ XIA2MOV 46H,#0BHJMP XIA3XIA2:MOV 46H,#0AHXIA3:T1,NS1 ;s20 退出闹钟设置跳回主程序//闹钟数据保存MOV 39H,#0FFHMOV 3DH,#00HMOV 3AH,#11111101BMOV R1,09HMOV A,45HMOV B,#0AHMUL ABADD A,44HMOV R1,AINC R1MOV A,43HMOV B,#0AHMUL ABADD A,42HMOV R1,AINC R1MOV A,41HMOV B,#0AHMUL ABADD A,40HMOV R1,AAJMP ZHUXUNHUANNS1:INT0,NS2 ;修改位右移同上MOV A,37HCJNE A,#11111110B,NSS0RR ARR ARR AMOV 37H,AS30:JNB INT0,S30AJMP NMNSS0:RR AMOV 37H,AS31:JNB INT0,S31AJMP NMNNM:AJMP NMNS2:INT1,NM1 ;修改位左移同上MOV A,37HCJNE A,#11011111B,NSS1RL ARL ARL AMOV 37H,AS32:JNB INT1,S32LJMP NMNSS1:RL AMOV 37H,AS33:JNB INT1,S33LJMP NMNM1://矩阵键盘检测修改闹钟同时间设置MOV R7,#0FHLCALL JIANCEANJIANCJNE R7,#0FH,NSJSZ1LJMP NMNSJSZ1:MOV A,37HACC.5,NSJSZ2CJNE R7,#00H,NSJS1LJMP NLED6NSJS1:CJNE R7,#01H,NSJS2LJMP NLED6NSJS2:CJNE R7,#02H,NMMAJMP NLED6NLED6:MOV 45H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ2:ACC.4,NSJSZ3MOV A,45HCJNE A,#02H,NLED5 CJNE R7,#00H,NSJS4 AJMP NLED5NSJS4:CJNE R7,#01H,NSJS5 AJMP NLED5NSJS5:CJNE R7,#02H,NSJS6 AJMP NLED5NSJS6:CJNE R7,#03H,NMM1 AJMP NLED5NMM1:LJMP NNM NLED5:MOV 44H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ3:ACC.3,NSJSZ4 CJNE R7,#00H,NSJ1 LJMP NLED4NSJ1:CJNE R7,#01H,NSJ2 AJMP NLED4NSJ2:CJNE R7,#02H,NSJ3 AJMP NLED4NSJ3:CJNE R7,#03H,NSJ4 AJMP NLED4NSJ4:CJNE R7,#04H,NSJ5 AJMP NLED4NSJ5:CJNE R7,#05H,NMM AJMP NLED4NMM:LJMP NMNLED4:MOV 43H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ4:ACC.2,NSJSZ5 MOV 42H,R7MOV A,37HRR AMOV 37H,AAJMP NMM0NSJSZ5:ACC.1,NSJSZ6 CJNE R7,#00H,NSJ10 AJMP NLED2NSJ10:CJNE R7,#01H,NSJ20 AJMP NLED2NSJ20:CJNE R7,#02H,NSJ30 AJMP NLED2NSJ30:CJNE R7,#03H,NSJ40 AJMP NLED2NSJ40:CJNE R7,#04H,NSJ50 AJMP NLED2NSJ50:CJNE R7,#05H,NMM0AJMP NLED2NMM0:LJMP NM NLED2:MOV 41H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ6:MOV 40H,R7MOV 37H,#11011111B LJMP NMEND页脚.。

相关主题