基于单片机的数字钟系统设计说明.doc
目录1 作品的背景与意义 12 功能指标设计 23 作品方案设计 3 3.1程序语言的比较 3.1.1方案一 汇编语言 3.1.2方案二 C语言 3.2显示方案比较 3.2.1 方案一lcd1602液晶显示 3.2.2 方案二 数码管显示 3.3 主要核心器件知识简介 3.3.1 SST89E516RD 3.3.2 74hc573 3.3.3 74hc2544 系统整体框图5 软件设计 5.1 主程序流程图 5.2 主函数 5.3 主函数需调用的各个子模块 5.3.1 查看时间、日历、闹钟模块 5.3.2 修改时间模块 5.3.3 修改日历模块 5.3.4 设定闹钟模块 5.4 精确的"1秒"计时模块 5.5 刷新数码管模块 5.6 获得键值模块6 系统测试 6.1测试环境 6.2测试步骤 6.2.1第一次调试 6.2.2第二次调试 6.2.3第三次调试 6.2.4第四次调试附录1 系统电路图附录2 系统软件代码附录3 系统器件清单1 作品的背景与意义首先,数字钟是日常生活中常见的简单系统,相对于传统的机械时钟具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。其次,由于单片机具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,使单片机在电子和一些自动化行业中应用也越来越广泛。利用单片机实现的电子钟具有编程灵活,并便于功能的扩展,很精确。2 功能指标设计数字钟实现功能:1具备一个精确的1秒定时器;2可根据1秒定时器,在LED上显示带小时、分钟、秒的时钟,实现正常走时秒分时日月年进位;3能够自动区分平闰年和大小月;4具备小时、分钟的修改按键,可分别调整小时、分钟、秒;5具备显示日期功能,并且能分别直接修改年,月,日;6具备5个闹钟,可分别查看和修改闹钟时间;也可分别设置闹钟开关,且当闹钟鸣叫时,可人为关掉闹钟。3 方案选择3.1采用的程序语言的方案选择3.1.1方案一、汇编优点: 能够直接访问与硬件相关的存储器或I/O口; 能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁; 能够最大限度地发挥硬件的功能缺点: 编写的代码非常难懂,不好维护; 很容易产生bug,难于调试;3.1.2方案二、c语言优点: 简洁紧凑,适用围大,可移植性好 可结构化编程 运算符、数据类型丰富缺点: 在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷; 在语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。结论:由于想要了解和掌握汇编语言的具体编写过程,且可以直接通过汇编语控制端口,更好地了解芯片的工作原理,故而选择了汇编语言。3.3 主要核心器件知识简介3.3.1 SST89E516RDSST89E516RD 是8位集成存储器的51系列兼容单片机。单片机是典型的嵌入式微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。3.3.2 74hc57374HC573 是八进制 3 态非反转透明锁存器。为三态允许控制端,低电平有效LE为锁存控制端,高电平有效1D8D为数据输入端1Q8Q 为数据输出端3.3.3 74HC24574HC245:总线收发器,典型的CMOS型三态缓冲门电路。总线收发器,典型的CMOS型三态缓冲门电路。为输出使能端,低电平有效DIR为输出方向控制端A0A7为数据输入/输出端B0B7为数据输入/输出端4 系统整体框图AT89C52主控制模块键盘修改,设置,查看LED显示时间显示模块蜂鸣器闹钟模块位选、段选复位电路时钟振荡电路5 软件设计:5.1主流程图程序开始时初始化:对定时器T1装入初值,外部中断INT1进行初始化,开启定时器和外部中断后进入主函数刷新数码管,扫描键盘,并判断闹钟的开启状态,和是否让蜂鸣器鸣叫。若没有闹钟开着,也没有对相应键的按下,则在主函数中循环。 5.2主函数5.3子模块5.3.1查看模块5.3.2修改时间模块刷新数码管显示当前时间,并不断扫描键盘,若有键按下则依据键值修改时间,若按下键16则中断返回。5.3.3修改日历模块刷新数码管,显示当前日期,并不断扫描键盘,若有键按下则依据当前键值修改日期,日子的最大允许日期是不同的,应先判断平闰年和大小月,若按下键16则返回主函数。5.3.4设定闹钟模块刷新数码管,显示每个闹钟的前一状态,并不断扫描键盘,若有键按下则依据键值修改闹钟的时分秒的值,若按下7则闹钟不开启,若按下8则闹钟开启。5.4精确的"1s"计时模块5.5刷新数码管模块LED灯的每段对应一个二极管,此是共阴极设计的,对其输入高电平则可以使相应的段亮起来。首先应先位选,将要显示的十进制数值译成二进制码后对该位的各段赋予高低电平即可。5.6获得键值为了获得用户按下的按键所对应的键值,可先向行接口输出一个第0行为"0" ,其它行均为"1"的行码,然后读入列码并判其是否为"全1" ,若不是"全1"就表示在第0行中有键被按下,且读入的列码中出现"0"的位置代表该按键所处的列编号,输出行码中"0"的位置代表该按键所处的行编号,据键值公式可获取相应的键值;若读入的列码为"全1" ,就再对下一行进行类似的处理,如此逐行分析处理,直至所有行处理完毕,返回主函数。6、系统测试6.1测试环境 室温27度6.2 测试步骤本次数字钟实验共四次进行调试,出现问题和解决办法如下:6.2.1第一次调试第一次调试查看日历、闹钟和精确的秒加1:1中断T0不能实现精确的秒加1;2查看闹钟和日历时定时器不工作、时间没走; 3查看闹钟时无法判断该闹钟是否开启;从第一次调试来看,可以看出对定时器工作原理不是很理解,应加深对定时器的理解再设置初值;无法判断闹钟是否开启是因为最开始没想到设定闹钟开启标志,经过修正就解决了。6.2.2 第二次调试 第二次调试外部中断修改时间: 1不能正常进入外部中断程序,出现bug; 2通过按键该时间,稍微按下某键就使数值变化很多,与实际不相符;每次在线调试没有完全退出,外部中断1对应引脚电平保持为之前状态导致再次进程序在线调试不能正常进外部中断的程序;获得键值后,修改时、分、秒,可是按着键的过程中使对应的时、分、秒不断增一或减一,最后想到键释放才把键值给到单片机,实现按一次加减一的功能。 6.2.3 第三次调试第三次调试设置闹钟、判断闹钟: 1闹钟时间设定好后不能通过按键使闹钟开启或关闭; 2蜂鸣器响时不能通过按键退出;经过第一次调试后设定好了闹钟标志,但是进设置闹钟程序时,由于没想清楚如何通过按键开启或关闭闹钟的同时可以退出修改闹钟程序,纠结于是否人性而难以下手;蜂鸣器想时并没有扫描键盘,最后想到用特殊按键退出。 6.2.4 第四次调试第四次调试修改日历: 1由于使用汇编导致该部分代码相当复杂,算法不易实现;2修改日子时没先判断当前平闰年和大小月导致出现诸如20XX2月29号的与实际不相符的情况;汇编有优点,但难以实现复杂算法导致当时写修改日历模块相当辛苦,代码也显的杂乱无章。最后是耐心地一处一处地检查错误的。附录1 系统电路图附录2 系统软件代码/*/*/KEY EQU 0F8FFH ;按键地址LED_SEG EQU 0FAFFH ;液晶段数据LED_SEL EQU 0FBFFH ;液晶段片选KH EQU 21H ;保存按键行值KK EQU 22H ;按键值地位KV EQU 23H ;保存按键列位KT EQU 24H ;临时保存按键状态HOU EQU 25H SEC EQU 26H MIN EQU 27HHB EQU 28H ;数据高位LB EQU 29H ;数据低位DATE_TIME EQU 2AH ;记录时间、日期模式 ,3表示时间,4表示日期LP0 EQU 2BH ;定时器1循环次数LP1 EQU 2CH ;定时器2循环次数YEARH EQU 2DHYEARL EQU 2EHMON EQU 2FHDAY EQU 30HFLASH EQU 31H ;设置标记变量FLASH_BITE EQU 32H ;设置位标记变量FLASH_FIGURE EQU 33H ;设置位数值标记变量SIGN EQU 34H ;闰年标记BOOL EQU 35H ;是否按下LP3 EQU 36HLP4 EQU 37HBITE EQU 38HLP2 EQU 39HH_LB EQU 3AHH_HB EQU 3BH LP5 EQU 3CH ;闹钟个数LP6 EQU 4FHLP7 EQU 50HLP8 EQU 51HLP_H EQU 52HLP_L EQU 53HBP BIT P1.0 ;闹钟LED_1 BIT P1.1ON_OFF0 BIT 00HON_OFF1 BIT 01HON_OFF2 BIT 02HON_OFF3 BIT 03HON_OFF4 BIT 04H BOOL_H BIT 05HBOOL_L BIT 06H/*/ORG 0000HLJMP MAINORG 000BH ;定时器1中断入口,产生秒基准时间并实现时间日期自增LJMP SERVEORG 001BH ;定时器2中断入口,LJMP REDRAW/*/ORG 1000HMAIN:MOV SP,#60HMOV BOOL,#0HMOV LP0,#14HMOV LP1,#250MOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0H;MOV TH1,#03CHMOV TL1,#0B0HMOV LP7,#2 ;定时器1循环次数MOV LP8,#50 ;MOV SIGN,#0FFHMOV FLASH,#0MOV YEARH,#20MOV YEARL,#12MOV MON,#2MOV DAY,#29 MOV HOU,#23MOV SEC,#53MOVMIN,#59MOV R4,#0DFHMOV DATE_TIME,#3H MOV FLASH_BITE,#0FFHMOV LP5,#0MOV LP_H,#70MOV LP_L,#70SETB BPSETB ON_OFF0SETB ON_OFF1SETB ON_OFF2SETB ON_OFF3SETB ON_OFF4SETB BOOL_HSETB BOOL_LMOV 3DH,#0MOV 45H,#0MOV 4AH,#0MOV 3FH,#1MOV 47H,#1MOV 4CH,#1/*定时器初始化*/SETB ET0 ;允许T0中断SETB ET1 ;禁止T1中断SETB EA ;CPU开放中断CLR TR1 ;关闭定时器T1SETB TR0 ;开启定时器T0/*/WHILE: LCALL LPKEY_NUM: ;按键处理 MOV DPTR,#KEYMOV A,#0HMOVX DPTR,AMOV A,FLASHJZ SETTR0MOV A,DATE_TIMECJNE A,#4,CLRTR0SETTR0: SETB TR0JMP JUDGE CLRTR0:CLR TR0JUDGE: ;扫描是否有键按下MOV DPTR,#KEYMOVX A,DPTRANL A,#0FHMOV R1,#0EFHMOV R2,#4HMOV KT,ACJNE A,#0FH,FINDMOV BOOL,#0JMP WHILEFIND: ;查询按下的键MOV A,R1RR AMOV R1,AMOV DPTR,#KEYMOVX DPTR,ANOPNOPMOV DPTR,#KEYMOVX A,DPTRANL A,#0FHMOV KV,AXRL A,KTJZ PRO0DJNZ R2,FINDPRO0: ;计算键值MOV A,BOOLJNZ RETURN3MOV BOOL,#1HMOV KH,R2DEC KHMOV A,KVCPL AANL A,#0FHMOV B,#2HDIV ABCJNE A,#4H,PRO1MOV KV,#3HJMP PRO2 PRO1:MOV KV,APRO2:MOV A,KHMOV B,#4HMUL ABADD A,KVMOV KK,AKEYPRO: ;键功能处理MOV A,KKCJNE A,#0AH,KEYPRO1KEYPRO1:JC DIGPROKEYTBL: ;功能键处理MOV DPTR,#JMPTBLCLR C SUBB A,#0AHRL A JMP A+DPTRJMPTBL:;功能键入口地址表前四行AJMP CALAJMP TIMAJMP SETTINGAJMP YESAJMP ALARMAJMP ON_OFF_ALMDIGPRO: ;数字键处理 MOV FLASH_FIGURE,A MOV A,FLASH JZ RETURN3 LCALL PRO_CHANGE JMP SETTING1 RETURN3:LJMP RETURN1CAL:MOV P1,#0FFH;日期模式MOV A,DATE_TIMECJNE A,#4,CLASETJMP RETURN1CLASET:MOV DATE_TIME,#4HJMP YESTIM:MOV P1,#0FFH;时间模式MOV LP5,#0MOV A,DATE_TIMECJNE A,#3,TIMSETJMP RETURN1TIMSET:MOV DATE_TIME,#3HJMP YESSETTING: ;设置SETTING1:;判断当前模式MOV A,DATE_TIMECJNE A,#4H,SETTIMESETDATE:MOV A,FLASHCJNE A,#8,INCFJMP YESINCF: INC FLASH MOV B,FLASH MOV A,#0FEHLOOP4:RR ADJNZ FLASH,LOOP4MOV FLASH,BMOV FLASH_BITE,AJMP RETURN1SETTIME:MOV A,FLASHCJNE A,#6,INCF2JMP YESINCF2: INC FLASHMOV B,FLASHMOV A,#0BFHLOOP5:RR ADJNZ FLASH,LOOP5MOV FLASH,BMOV FLASH_BITE,AJMP RETURN1RETURN4:JMP RETURN1YES: ;确认键MOV FLASH,#0HMOV FLASH_BITE,#0FFHJMP RETURN1ALARM:MOV DATE_TIME,#3MOV A,LP5CJNE A,#5,NORMALMOV LP5,#0NORMAL:INC LP5MOV A,LP5MOV 44H,AMOV A,#0FEHRLP:RR ADJNZ 44H,RLPMOV P1,ANEX1:MOV A,LP5DEC AMOV DPTR,#ALM_TBLRL AJMP A+DPTRALM_TBL:AJMP L0AJMP L1AJMP L2AJMP L3AJMP L4L0:MOV C,ON_OFF0MOV LED_1,CAJMP YESL1:MOV C,ON_OFF1MOV LED_1,CAJMP YESL2:MOV C,ON_OFF2MOV LED_1,CAJMP YESL3:MOV C,ON_OFF3MOV LED_1,CAJMP YESL4:MOV C,ON_OFF4MOV LED_1,CAJMP YESON_OFF_ALM:MOV A,LP5CJNE A,#0,NEXJMP RETURN1NEX:DEC AMOV DPTR,#ON_OFF_TBLRL AJMP A+DPTRON_OFF_TBL:AJMP O0AJMP O1AJMP O2AJMP O3AJMP O4O0:CPL ON_OFF0AJMP NEX1O1:CPL ON_OFF1AJMP NEX1O2:CPL ON_OFF2AJMP NEX1O3:CPL ON_OFF3AJMP NEX1O4:CPL ON_OFF4AJMP NEX1 RETURN1:LJMP WHILESERVE: ;定时器1中断服务子程序PUSH ACCPUSH PSWPUSH DPHPUSH DPLMOV TH0,#03CHMOV TL0,#0B0HDJNZ LP0,SERVE2JMP SERVE3SERVE2:JMP SERVE1SERVE3:MOV LP0,#014HMOV LP6,#5ALM_LP: MOV A ,LP6DEC ARL AMOV DPTR,#A_TBLJMP A+DPTRA_TBL:AJMP AL1AJMP AL2AJMP AL3AJMP AL4AJMP AL5AL1: ON_OFF0,C_ALMJMP FIND_OUTAL2: ON_OFF1,C_ALMJMP FIND_OUTAL3: ON_OFF2,C_ALMJMP FIND_OUTAL4: ON_OFF3,C_ALMJMP FIND_OUTAL5: ON_OFF4,C_ALMJMP FIND_OUTFIND_OUT:MOV DPTR,#ALM_HMOV A,LP6MOVC A,A+DPTRMOV R0,AMOV A,R0CJNE A,HOU,C_ALMMOV DPTR,#ALM_MMOV A,LP6MOVC A,A+DPTRMOV R0,AMOV A,R0CJNE A,MIN,C_ALMMOV DPTR,#ALM_SMOV A,LP6MOVC A,A+DPTRMOV R0,AMOV A,R0CJNE A,SEC,C_ALMSETB TR1CLR BPC_ALM:DJNZ LP6,ALM_LPINC SECMOV A,SECCJNE A,#3CH,SERVE1MOV SEC,#0HINC MINMOV A,MINCJNE A,#3CH,SERVE1MOV MIN,#0HINC HOUMOV A,HOUCJNE A,#18H,SERVE1MOV HOU,#0HINC DAY MOV A,MON ;当月最大天数判断DEC AMOV DPTR,#DAY_NUMMOVC A,A+DPTRMOV 44H,AINC 44HMOV A,MONCJNE A,#2,PROLEAP1MOV A,SIGNCJNE A,#1,PROLEAP1INC 44H PROLEAP1:MOV A,DAYCJNE A,44H,SERVE1MOV DAY,#1HINC MONMOV A,MON ;月处理CJNE A,#13,SERVE1MOV MON,#1HINC YEARLMOV A, YEARL ;年处理CJNE A,#99,SERVE1MOV YEARL,#0HINC YEARH SERVE1:POP DPLPOP DPHPOP PSWPOP ACCRETI LIGHT: ;按参数点亮数码管MOV A,#0HMOV DPTR,#LED_SEGMOVX DPTR,AMOV A,R4XRL A,FLASH_BITEJNZ L_H BOOL_H,PRO_LP_HL_H:MOV A,R4MOV DPTR,#LED_SELMOVX DPTR,AMOV A,HBMOV DPTR,#STR_NUMMOVC A,A+DPTRMOV DPTR,#LED_SEGMOVX DPTR,ALCALL DELAY_2MSMOV A,R4XRL A,FLASH_BITEJNZ PRO_LPRO_LP_H:MOV A,LP_HJZ PRO_BOOL_HDEC LP_HJMP PRO_LPRO_BOOL_H: CPL BOOL_HMOV LP_H,#70PRO_L:MOV A,#0HMOV DPTR,#LED_SEGMOVX DPTR,AMOV A,R4RR AMOV R4,AXRL A,FLASH_BITEJNZ L_L BOOL_L,PRO_LP_LL_L:MOV A,R4MOV DPTR,#LED_SELMOVX DPTR,AMOV A,LBMOV DPTR,#STR_NUMMOVC A,A+DPTRMOV DPTR,#LED_SEGADD A,#80HCJNE R5,#4,TRAP0SUBB A,#80HJMP TRAPTRAP0:CJNE R5,#1,TRAPSUBB A,#80HTRAP:MOVX DPTR,ALCALL DELAY_2MSMOV A,R4XRL A,FLASH_BITEJNZ RETURNXPRO_LP_L:MOV A,LP_LJZ PRO_BOOL_LDEC LP_LJMP RETURNXPRO_BOOL_L: CPL BOOL_LMOV LP_L,#70RETURNX:RETREDRAW:;定时器1中断服务子程序PUSH ACCPUSH PSWPUSH DPHPUSH DPLMOV TH1,#03CHMOV TL1,#0B0HMOV A,LP8JNZ RE1MOV LP8,#50CLR TR1SETB BPJMP RERE1:DJNZ LP7,REDEC LP8MOV LP7,#2CPL BP RE:POP DPLPOP DPHPOP PSWPOP ACCRETILP:;显示子程序LCALL PROLEAPMOV R5,DATE_TIMECJNE R5,#4H,TIMEDATE:MOV R4,#7FHDATE1:MOV A,R5XRL A,#4HJZ PROYHMOV A,R5XRL A,#3HJZ PROYLMOV A,R5XRL A,#2HJZPROMMOV A,R5XRL A,#1HJZ PRODPROYH:LCALL PRO_DATE_YH JMP DATE2PROYL:LCALL PRO_DATE_YL JMP DATE2PROM:LCALL PRO_DATE_M JMP DATE2PROD:LCALL PRO_DATE_DDATE2:LCALL LIGHTMOV A,R4RR AMOV R4,ADJNZ R5,DATE1JMP RETURNTIME:MOV R4,#0DFHTIME1:MOV A,R5XRL A,#3HJZ PROT1MOV A,R5XRL A,#2HJZPROT2MOV A,R5XRL A,#1HJZ PROT3PROT1:LCALL PRO_TIME_HJMP TIME2PROT2:LCALL PRO_TIME_MJMP TIME2PROT3:LCALL PRO_TIME_STIME2:LCALL LIGHTMOV A,R4RR AMOV R4,ADJNZ R5,TIME1RETURN:RETPRO_DATE_YH:MOV A,YEARHLCALL PRORETPRO_DATE_YL:MOV A,YEARLLCALL PRORETPRO_DATE_M:MOV A,MONJNZ PRO_MINC MONPRO_M:LCALL PROMOV A,HBCJNE A,#0,MO1RETMO1:CJNE A,#1,MO2MO5:MOV A,LBCJNE A,#3,MO3MO3:JNC MO4 RETMO4:MOV LB,#2JMP CALCUMO2:MOV HB,#1JMP MO5CALCU:MOV A,#10ADD A,LBMOV MON,ARETPRO_DATE_D:MOV A,DAYJNZ PRO_DINC DAYPRO_D:MOV DPTR,#DAY_NUMMOV A,MONDEC AMOVC A,A+DPTRMOV 44H,AMOV A,MONCJNE A,#2,PROLEAP2MOV A,SIGNCJNE A,#1,PROLEAP2INC 44H PROLEAP2:MOV A,44HMOV R0,ACJNE A,DAY,DXDX:JNC D2LCALL PROMOV 40H,HBMOV 41H,LBMOV A,DAYLCALL PROMOV A,HBCJNE A,40H,D1D1: JC D2 CJNE A,40H,D3 MOV A,LB CJNE A,41H,D0 D0:JC D2D3:MOV DAY,R0D2:MOV A,DAYLCALL PRORETPRO_TIME_H:MOV DPTR,#ALM_HMOV A,LP5MOVC A,A+DPTRMOV R0,AMOV A,R0LCALL PROMOV A,HBCJNE A,#2,NEXT_H1NEXT_H1:JC NEXT_H2CJNE A,#2,NEXT_H4NEXT_H5:MOV A,LBCJNE A,#4,NEXT_H3NEXT_H3:JC NEXT_H2MOV LB,#3MOV A,HBMOV B,#10MUL ABADD A,LBMOV R0,AJMP NEXT_H2NEXT_H4:MOV HB,#2JMP NEXT_H5NEXT_H2:RETPRO_TIME_M:MOV DPTR,#ALM_MMOV A,LP5MOVC A,A+DPTRMOV R0,AMOV A,R0LCALL PROMOV A,HBCJNE A,#6,N