武汉大学电子信息学院电子系统综合设计课程论文数字钟在单片机上的实现(汇编语言)专业:年级:作者:__________________________指导教师:2012年06 月29 日目录1 作品的背景与意义 (1)2 功能指标设计 (1)2.1设计要求 (1)2.1.1 基本要求 (1)2.1.2 拓展要求 (1)2.2 功能设计方案 (1)3 作品方案设计 (2)3.1总体方案的选择 (2)3.2模块划分及分析 (3)3.3 单模块设计流程图 (3)4 模块源程序 (7)5 系统测试 (35)测试数据: (36)6 心得体会 (36)1 作品的背景与意义数字钟是一种用数字电路技术实现时、分、秒计时的钟表。
与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。
数字钟的设计方法有许多种,例如可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用单片机来实现电子钟等等。
这些方法都各有其特点,其中利用单片机实现的电子钟具有编程灵活,以便于功能的扩展。
2 功能指标设计2.1设计要求2.1.1 基本要求1.设计一个精确的1秒定时器;2.根据1秒定时器,设计一个带小时、分钟、秒的时钟,并将小时、分钟、秒显示在LED上;3.设计小时、分钟、秒的修改按键,可分别调整小时、分钟、秒(按键设计参考电子表)。
2.1.2 拓展要求1.增加小时、分钟、秒的键盘直接修改功能;2.设计闹钟功能,最多支持5个闹钟,可分别查看和修改闹钟时间,可分别设置闹钟开关;3.增加万年历功能。
2.2 功能设计方案1. 实现正常走时(秒-分-时-日-月-年进位);2. 能够设置时间和日期;3. 能够自动区分平闰年和大小月及2月;4. 具有5个闹钟及其设置功能;5. 在任何设置状态下,修改位会闪烁显示。
3 作品方案设计3.1总体方案的选择以T0计时器中断产生1s信号,T1计时器中断刷新数码管。
系统软件流程图如下所示:设计时使T0优先级高于T1以确保准确计时,初始化完成后,程序一直处于主循环模块,主循环模块中有设置按键的检测模块,当遇到设置信号暂时跳出主循环去执行相应的设置模块,时间设置,日期设置,闹钟设置3大模块彼此之间是相互独立且平行的,他们和主循环模块也不干扰。
因此,当进入任何一个模块时,其他模块中的所有功能和按键都暂时失效,程序由始至终中断服务一直打开。
3.2模块划分及分析•MAIN:初始化程序模块进行初值的分配(栈顶地址,初始时间,初始日期,初始化闹钟及相关标志地址)各定时器,中断初始化。
▪ZHUXUNHUAN:主循环模块程序主要执行部分,包含闹钟检测,独立按键检测(日期—时间转换检测),矩阵按键检测(闹钟设置,日期设置,时间设置)3大检测部分。
▪•SERVE:1s中断服务中断走时:秒→分→时→日→月→年▪XIAGSHI:刷屏中断服务(显示中断服务)以人眼不能分辨的频率一次刷新8或6位数码管来显示时间或日期及其他设置界面。
▪SHIJIANSHEZHI:时间设置模块修改时间,其中修改位闪烁显示加以区分,内嵌了时间的自动检测和校正代码,既不允许修改出现不存在的时间。
▪WANNIANLISHEZHI:日期设置模块修改日期,同样的修改位闪烁加以区分,内嵌了日期的自动检测和校正代码,既不允许出现不存在的日期。
▪NAOZHONGSHEZHI:闹钟设置模块修改闹钟时间,闹钟开关的置换,修改位闪烁加以区分,内嵌时间自动监测和校正代码已设置正确的时间。
3.3 单模块设计流程图在完成的整体设计和模块划分后,便进入到工作量最大的单模块流程设计。
▪主循环:说明:1.初始化时,将保存5个闹钟(按时分秒顺序排放)的15个地址50H—5EH均清零,将对应的5个闹钟开关0AH—0EH也都清零表示闹钟开关状态,检测闹钟时,从第一个闹钟开始分别检测开关,时分秒只要有任何一项不符合及即检测下一个闹钟,到最后一个闹铃也不符合时,进入按键检测部分。
2.按键检测包含独立按键和矩阵按键两部分,独立按键很简单,矩阵按键则编写检测子程序,将检测到的键值保存在寄存器R7中,没有检测到按键时不改变R7的数值。
因此,检测器先将R7里面放入#0FH(只要不是#00H—#0CH中的数即可),然后调用矩阵键盘检测子程序,再来通过检测R7的数值来判断有无按键按下或按下的那个键。
▪时间设置模块:说明:1.进入时间设置模块后,时的十位开始闪烁,通过独立按键s17,s18可以向右向左移动闪烁即修改位,修改正确的判断实际上是对将要修改完成的时间进行合理性的判断,如合理则修改时间,若不合理则此次按键失效。
2.检测到退出信号后,先要将所有初始化过程中改变了的标志位还原,如闪烁开关位等,再调回主循环。
▪日期设置模块:日期设置模块和时间设置模块几乎完全一样,所不同的是初始化不一样及日期设置里面有8位数码管需要刷新,而且由于日期比时间复杂,因此该模块中有两处日期校正部分,一部分是对按键修改是否正确的判断,使用方法也是使相应按键暂时失效(例如:修改前日期是2012:03:31,那么此时月份上得十位1-9所以数字都暂时失效,日个位上的2-9所以数字也都全部暂时失效);另一部分是修改后的日期校正,通过调用该子程序,防止上一部分不能消除的错误日期设置(例如:修改前日期是2012:01:31,这时修改月份个位为2则日期变为2012:02:31,显然这样的日期是不存在的,这时校正程序将日期进位,日期更改为2012:03:01)。
这部分校正模块在后面的1s中断服务中也有使用。
下图为该模块流程图:▪闹钟设置模块:闹钟设置模块和时间设置一是大同小异,主要区别在于多了一部分闹铃开关的检测。
下图为该模块流程图:4 模块源程序ORG 0000HAJMP MAINORG 000BHAJMP SERVEORG 001BHAJMP XIANSHITAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H ;段选表0,1,2,3,4,5,6,7,8,9,熄灭,-TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,00H,40H ;段选表带小数点,同上MAIN:/************************************************************************* ****///初始化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 30H,A ;时MOV 31H,A ;分MOV 32H,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//中断,定时器初始化MOV TMOD,#11HMOV 38H,#14H ;T0定时器每50ms溢出一次溢出20次为一秒SETB PT0 ;优先级设置1秒中断为最高级屏幕刷新优先级低SETB PT1SETB ET0SETB ET1SETB EAMOV TH1,#0DFH ;T1定时器设置显示扫描频率MOV TL1,#0E0HMOV TH0,#3CH ;T0定时器设置为50msMOV TL0,#0B0HSETB TR1SETB TR0/***********************************************************************/ //程序主循环ZHUXUNHUAN://闹钟检测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: JB T0,ZHU1 ;检测s19是否按下按下进入万年历界面,否则检测矩阵键盘MOV A,3AH ;界面转换标志取反即可使得时间和万年历界面相互转换CPL AMOV 3AH,A//检测矩阵键盘//检测到按键1,2,3,4,5时进入对应的闹钟设置界面检测到0BH(对应s11)进入时间设置界面检测到0CH(对应s12)进入万年历设置界面//若未检测到按键则跳回主程序继续下一个检测周期ZHU1:MOV R7,#0FHACALL JIANCEANJIAN ;矩阵键盘检测子程序将检测到的键值存入r7CJNE 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/************************************************************************* ***///1秒中断服务见书141例6-6SERVE:CLR EAPUSH BPUSH DPHPUSH DPLPUSH PSWPUSH ACCMOV TH0,#3CHMOV TL0,#0B0HMOV A,3DHJZ SEMOV A,3CHCJNE A,#6,SE0MOV 39H,37HSE0: DJNZ 3CH,SEMOV 39H,#0FFHMOV 3CH,#0CHSE:DJNZ 38H,RETURNMOV 38H,#14HMOV A,#01HADD A,32HMOV 32H,ACJNE A,#3CH,RETURNMOV 32H,#00HMOV A,#01HADD A,31HMOV 31H,ACJNE A,#3CH,RETURNMOV 31H,#00HMOV A,#01HADD A,30HMOV 30H,ACJNE A,#18H,RETURNMOV 30H,#00HMOV A,#01HADD A,33HMOV 33H,AACALL NYRRETURN:POP ACCPOP PSWPOP DPLPOP DPHPOP BSETB EARETI/************************************************************************* *///年月日校正子程序用于万年历进位和万年历设置防止出现不存在的时间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,32HMOV B,#0AHDIV ABMOV 10H,BMOV 11H,AMOV A,31HMOV B,#0AHDIV ABMOV 12H,BMOV 13H,AMOV A,30HMOV B,#0AHDIV ABMOV 14H,BMOV 15H,AMOV 16H,#0AHMOV 17H,#0AHAJMP LIANG//万年历界面WANNIANLI:JNB ACC.1,SHEZHIMOV 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//刷新屏幕LIANG:MOV R6,#11111110B ;位选MOV R0,#10H ;利用r0间接访问功能实现选中位显示控制MOV R4,#8H ;刷新8次MAIN0: ;位选子程序ACALL LCJNE R0,#12H,TT1MOV DPTR,#TAB1AJMP KTT1:CJNE R0,#14H,TT2MOV DPTR,#TAB1AJMP KTT2:MOV DPTR,#TABK:MOV A,@R0MOVC A,@A+DPTRMOV R5,A//数码管开关判断不刷新39H中对应为0的那段数码管MOV A,39HJNB ACC.0,AC0JNB ACC.1,AC1JNB ACC.2,AC2JNB ACC.3,AC3JNB ACC.4,AC4JNB ACC.5,AC5JNB ACC.6,AC6JNB ACC.7,AC7AJMP J0AC0: CJNE R4,#08H,J0AJMP J1AC1: CJNE R4,#07H,J0AJMP J1AC2: CJNE R4,#06H,J0AJMP J1AC3: CJNE R4,#05H,J0AJMP J1AC4: CJNE R4,#04H,J0AJMP J1AC5: CJNE R4,#03H,J0AJMP J1AC6: CJNE R4,#02H,J0AJMP J1AC7: CJNE R4,#01H,J0AJMP J1J0: ACALL R ;段选子程序J1: MOV A,R6RL AMOV R6,AINC R0ACALL DELAY1 ;延时越长数码管越亮但过长导致刷新过慢数码管不能同时全亮MOV DPTR,#8200HMOV A,#00HMOVX @DPTR,ADJNZ R4,MAIN0POP ACCPOP PSWPOP DPLPOP DPHPOP BRETIL:MOV DPTR,#8300HMOV A,R6MOVX @DPTR,ARETR:MOV DPTR,#8200HMOV A,R5MOVX @DPTR,ARET/********************************************************************/ //延时子程序DELAY: ;延时20毫秒用于矩阵键盘的检测MOV 3EH,#120LOOP1:MOV 3FH,#30LOOP2:DJNZ 3FH,LOOP2DJNZ 3EH,LOOP1RETMDELAY:MOV 3EH,#5MLOOP1:MOV 3FH,#0AAHMLOOP2:DJNZ 3FH,MLOOP2DJNZ 3EH,MLOOP1RETDELAY1:MOV 3EH,#15LOOP11:MOV 3FH,#40LOOP21:DJNZ 3FH,LOOP21DJNZ 3EH,LOOP11RETDELAY0:MOV 3EH,#0FFHLOOP10:MOV 3FH,#0FFHLOOP20:DJNZ 3FH,LOOP20DJNZ 3EH,LOOP10RET/***********************************************************///时间设置SHIJIANSHEZHI:MOV 39H,#11011111B ;时的十位闪烁MOV 37H,39HMOV 3DH,#0FFH ;开闪烁开关M:JB T1,S1 ;检测独立按按键s20 按下则退出时间设置继续进入主循环MOV 39H,#0FFHMOV 3DH,#00HAJMP ZHUXUNHUANS1: JB INT0,S2 ;闪烁位即修改为右移MOV A,37HCJNE A,#11111110B,SS0RR ARR ARR AMOV 37H,AS10:JNB INT0,S10 ;右移按键松开才继续下面的程序防止一次按键右移多位下同AJMP MSS0:RR AMOV 37H,AS11: ;左移JNB INT0,S11AJMP MS2: JB INT1,M1MOV A,37HCJNE A,#11011111B,SS1RL ARL ARL AMOV 37H,AS12:JNB INT1,S12AJMP MSS1:RL AMOV 37H,AS13:JNB INT1,S13AJMP M//检测矩阵按键修改时间M1: MOV R7,#0FHACALL JIANCEANJIANCJNE R7,#0FH,SJSZ1AJMP MSJSZ1:MOV A,37H ;检测修改的是哪位JB ACC.5,SJSZ2//修改时十位只能修改为0,1,2 但时个位部位0,1,2,3时不能修改为2 CJNE R7,#00H,SJS1AJMP LED6SJS1:CJNE R7,#01H,SJS2AJMP LED6SJS2:CJNE R7,#02H,MAJMP LED6LED6:MOV A,30HMOV B,#0AHDIV ABMOV 1FH,BMOV B,#0AHMOV A,R7MUL ABADD A,1FHMOV 30H,AMOV A,37HRR AMOV 37H,AAJMP MSJSZ2:JB ACC.4,SJSZ3//修改时个位但时十位为2时只能修改为0,1,2,3MOV A,30HMOV B,#0AHDIV ABCJNE A,#02H,LED5CJNE R7,#00H,SJS4AJMP LED5SJS4:CJNE R7,#01H,SJS5AJMP LED5SJS5:CJNE R7,#02H,SJS6AJMP LED5SJS6:CJNE R7,#03H,MM1AJMP LED5MM1:AJMP MLED5:MOV B,#0AHMUL ABADD A,R7MOV 30H,AMOV A,37HRR AMOV 37H,AAJMP MSJSZ3:JB ACC.3,SJSZ4//修改分十位只能修改为0,1,2,3,4,5 CJNE R7,#00H,SJ1AJMP LED4SJ1:CJNE R7,#01H,SJ2AJMP LED4SJ2:CJNE R7,#02H,SJ3AJMP LED4SJ3:CJNE R7,#03H,SJ4AJMP LED4SJ4:CJNE R7,#04H,SJ5AJMP LED4SJ5:CJNE R7,#05H,MMAJMP LED4MM:AJMP MLED4:MOV A,31HMOV B,#0AHDIV ABMOV 1FH,BMOV A,R7MOV B,#0AHMUL ABADD A,1FHMOV 31H,AMOV A,37HRR AMOV 37H,AAJMP MSJSZ4:JB ACC.2,SJSZ5//修改分个位MOV A,31HMOV B,#0AHDIV ABMOV B,#0AHMUL ABADD A,R7MOV 31H,AMOV A,37HRR AMOV 37H,AAJMP MSJSZ5:JB ACC.1,SJSZ6//修改秒十位只能改为0,1,2,3,4,5 CJNE R7,#00H,SJ10AJMP LED2SJ10:CJNE R7,#01H,SJ20AJMP LED2SJ20:CJNE R7,#02H,SJ30AJMP LED2SJ30:CJNE R7,#03H,SJ40AJMP LED2SJ40:CJNE R7,#04H,SJ50AJMP LED2SJ50:CJNE R7,#05H,MM0AJMP LED2MM0:AJMP MLED2:MOV A,32HMOV B,#0AHDIV ABMOV 1FH,BMOV A,R7MOV B,#0AHMUL ABADD A,1FHMOV 32H,AMOV A,37HRR AMOV 37H,AAJMP MSJSZ6://修改秒个位MOV A,32HMOV B,#0AHDIV ABMOV B,#0AHMUL ABADD A,R7MOV 32H,AMOV 37H,#11011111BAJMP M/****************************************************************/ //万年历设置WANNIANLISHEZHI:MOV 3AH,#0FEH ;转换设置界面MOV 39H,#11011111B ;设置闪烁位MOV 37H,39HMOV 3DH,#0FFH ;开闪烁开关WM:ACALL NYR ;校正万年历JB T1,WS1 ;s20 按下退出设置界面MOV 39H,#0FFH ;关闪烁MOV 3DH,#00H ;闪烁开关关MOV 3AH,#11111101B ;转换成时间设置界面AJMP ZHUXUNHUANWS1:JB 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:JB 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 ;检测修改位JB 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:JB ACC.4,WSJSZ3//修改年个位MOV A,35HMOV B,#0AHDIV ABMOV B,#0AHMUL ABADD A,R7MOV 35H,AMOV A,37HRR AMOV 37H,AAJMP WMWSJSZ3:JB 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:JB ACC.2,WSJSZ5//修改月个位但月十位为1时只能修改为0,1,2 月十位为0时不能修改为0 MOV A,34HMOV B,#0AHDIV 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:JB ACC.1,WSJSZ6//修改日十位只能为0,1,2,3 日个位不为0,1时不能修改为3CJNE R7,#00H,WSJ10AJMP WLED2CJNE R7,#01H,WSJ20AJMP WLED2WSJ20:CJNE R7,#02H,WSJ30AJMP WLED2WSJ30:CJNE R7,#03H,WWMMOV A,33HMOV B,#0AHDIV 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 WLED1MOV 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,KEY30JNB ACC.3,KEY40MOV DPTR,#8000HMOV A,#11111101BMOVX @DPTR,AMOV DPTR,#8000HMOVX A,@DPTRJNB ACC.0,KEY50JNB ACC.1,KEY60JNB ACC.2,KEY70JNB ACC.3,KEY80MOV DPTR,#8000HMOV A,#11111011BMOVX @DPTR,AMOV DPTR,#8000HMOVX A,@DPTRJNB ACC.0,KEY90JNB ACC.1,KEY00JNB ACC.2,TUIJNB ACC.3,KEY0C0RETKEY10: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.0JB T1,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,BDIV ABMOV 43H,AMOV 42H,BMOV A,55HMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#53HMOV 47H,#02HMOV 08H,#0BHAJMP NANJIAN NZ3:CJNE R7,#03H,NZ4MOV 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,#56HMOV 47H,#03HMOV 08H,#0CHAJMP NANJIAN NZ4:CJNE R7,#04H,NZ5MOV A,59HMOV B,#0AHDIV ABMOV 45H,AMOV 44H,BMOV A,5AHMOV B,#0AHDIV ABMOV A,5BHMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#59HMOV 47H,#04HMOV 08H,#0DHAJMP NANJIANNZ5:MOV A,5CHMOV B,#0AHDIV ABMOV 45H,AMOV 44H,BMOV A,5DHMOV B,#0AHDIV ABMOV 43H,AMOV 42H,BMOV A,5EHMOV B,#0AHDIV ABMOV 41H,AMOV 40H,BMOV 09H,#5CHMOV 47H,#05HMOV 08H,#0EHAJMP NANJIANNANJIAN:MOV 3AH,#11111100B ;界面转换成闹钟设置界面MOV 39H,#11011111BMOV 37H,39HMOV 3DH,#0FFH ;开闪烁NM: MOV R1,08HJB T0,XIA1 ;s19 闹钟开关MOV A,@R1CPL AMOV @R1,AXIA1:MOV A,@R1JZ XIA2MOV 46H,#0BHXIA2:MOV 46H,#0AHXIA3:JB 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:JB 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:JB 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,37HJB ACC.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:JB ACC.4,NSJSZ3MOV A,45HCJNE A,#02H,NLED5CJNE R7,#00H,NSJS4AJMP NLED5NSJS4:CJNE R7,#01H,NSJS5AJMP NLED5NSJS5:CJNE R7,#02H,NSJS6AJMP NLED5NSJS6:CJNE R7,#03H,NMM1AJMP NLED5NMM1:LJMP NNMNLED5:MOV 44H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ3:JB ACC.3,NSJSZ4CJNE R7,#00H,NSJ1LJMP NLED4NSJ1:CJNE R7,#01H,NSJ2AJMP NLED4NSJ2:CJNE R7,#02H,NSJ3AJMP NLED4NSJ3:CJNE R7,#03H,NSJ4AJMP NLED4NSJ4:CJNE R7,#04H,NSJ5AJMP NLED4NSJ5:CJNE R7,#05H,NMMAJMP NLED4 NMM:LJMP NMNLED4:MOV 43H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ4:JB ACC.2,NSJSZ5MOV 42H,R7MOV A,37HRR AMOV 37H,AAJMP NMM0NSJSZ5:JB ACC.1,NSJSZ6CJNE R7,#00H,NSJ10AJMP NLED2NSJ10:CJNE R7,#01H,NSJ20AJMP NLED2NSJ20:CJNE R7,#02H,NSJ30AJMP NLED2NSJ30:CJNE R7,#03H,NSJ40AJMP NLED2NSJ40:CJNE R7,#04H,NSJ50AJMP NLED2NSJ50:CJNE R7,#05H,NMM0AJMP NLED2NMM0:LJMP NMNLED2:MOV 41H,R7MOV A,37HRR AMOV 37H,ALJMP NMNSJSZ6:MOV 40H,R7MOV 37H,#11011111BLJMP NMEND5 系统测试软件整体完成后,进行调试和修改,连接单片机,进行系统的测试。