1、 word 文档 可自由复制编辑 工程设计 AT89C51 单片机时钟电路 工程设计 目 录 任 务 书 摘 要 前 言 说 明 书 第 一章电路原理分析 1-1 显示原理 1-2 数码管结构及代码显示 1-3 键盘及读数原理 1-4 连击功能的实现 第 二 章 程序设计思想和相关指令介绍 2-1 数据与代码转换 2-2 计时功能的实现与中断服务程序 2-3 时间控制功能与比较指令 2-4 时钟误差的分析 附录A 电路图 附录B 存储单元地址表 附录C 输入输出口功能分配表 附录D 定时中断程序流程图 附录F 调时功能流程图 附录G 程序清单 摘要 word 文档 可自由复制编辑 单片计算机即
2、单片微型计算机。(Single-Chip Microcomputer),是集 CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而 51 单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。前言 本文通过用对一个能实现定时,时钟,日历显示功能的时间系统的设计学习,详细介绍了51 单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。系统由AT89C51、LED 数码管、按键、二极管
3、等部分构成,能实现时钟日历的功能:能进行时、分、秒的显示。也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现三路开关定时输出等功能。文章后附有电路图,程序清单,各数据存储单元的所在地址,输入输出口对应表。以供读者参考。因作者本人也是个初学者,水平有限,难免有疏落不足之处,敬请老师和同学能给与批评正。说明书 系统由AT89C51、LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由SB0、SB1、SB2、SB3、SB4 完成。其中SB0 为时间校对,定时器调整功能键,按SB 0 进入调整状态。SB1 为功能切换键。第一轮按动SB1
4、依次进入一路、二路、三路定时时间设臵提示程序,按SB3 进入各路定时调整状态。定时时间到,二极管发亮。到了关断时间后灭掉。如果不进入继续按SB1 键,依次进入时间 年 位校对、月 位校对、日 位校对、时 位校对、分 位校对、秒 位校对状态。不管是进入那种状态,按动SB2 皆可以使被调整位进行不进位增量加1 变化。各预臵量设臵完成后,系统将所有的设臵存入RAM 中,按SB1 退出调整状态。上电后,系统自动进入计时状态,起始于 00 时 00 分。SB4 为年月日显示转换键,可使原来显示时分秒转换显示年月日。二、电路原理分析 1.显示原理 电原理图见附图1。由6 个共阴极的数码管组成时、分、秒的显
5、示。P0 口的8 条数据线P0.0 至 P0.7 分别与两个CD4511 译码的ABCD 口相接,P2 口的P2.0 至P2.2 分别通过电阻R10 至R13 与VT1 至VT3 的基极相连接。这样通过P0 口送出一个存储单元的高位、低位BCD 显示代码,通过P2 口送出扫描选通代码轮流点亮LED1 至LED6,就会将要显示的数据在数码管中显示出来。从P0 口输出的代码是BCD 码,从P2 口输出的就是位选码。2.数码管结构及代码显示 word 文档 可自由复制编辑 共阴LED 数码管由8 只发光二极管VD1 至VD8 共阴连接并按 8 字形结构排列而成。这样,我们将这些二极管的正极接高低不同
6、的电位,把所有的负极接地,当正极为高电位时相应的二极管就会导通而发光,从而使数码管呈现不同的字符。而只有P2 相应呈现高电位,VT 个管导通,LED1 的GND 与地相接,LED 位被选中才具备发光的使能条件;可见,在利用P2 口送出位选码,使各位轮流得到发光使能条件的同时,通过P0 口分别送出不同的段选码,就会在LED1 至LED4 中显示出不同的数字来。CD4511是一个用于驱动共阴极 LED(数码管)显示器的 BCD 码七段码译码器,特点如下:具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。可直接驱动LED显示器。CD4511 是一片 CMOS BCD
7、锁存/7 段译码/驱动器,引脚排列如图 2 所示。其中a b c d 为 BCD 码输入,a为最低位。LT为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。BI为消隐功能端,低电平时使所有笔段均消隐,正常显示时,B1端应加高电平。另外 CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。LE是锁存控制端,高电平时锁存,低电平时传输数据。ag是 7 段输出,可驱动共阴LED数码管。另外,CD4511显示数“6”时,a段消隐;显示数“9”时,d段消隐,所以显示6、9这两个数时,字形不太美观 图
8、3是 CD4511和CD4518配合而成一位计数显示电路,若要多位计数,只需将计数器级联,每级输出接一只 CD4511 和 LED 数码管即可。所谓共阴 LED 数码管是指 7 段 LED 的阴极是连在一起的,在应用中应接地。限流电阻要根据电源电压来选取,电源电压5V时可使用300的限流电阻。word 文档 可自由复制编辑 用 CD4511 实现 LED 与单片机的并行接口方法如下图:(略)CD4511 引 脚 图 其功能介绍如下:BI:4 脚是消隐输入控制端,当 BI=0 时,不管其它输入端状态如何,七段数码管均处于熄灭(消隐)状态,不显示数字。LT:3 脚是测试输入端,当 BI=1,LT=
9、0 时,译码输出全为 1,不管输入 DCBA 状态如何,七段均发亮,显示“8”。它主要用来检测数码管是否损坏。LE:锁定控制端,当 LE=0 时,允许译码输出。LE=1 时译码器是锁定保持状态,译码器输出被保持在 LE=0 时的数值。A1、A2、A3、A4、为 8421BCD 码输入端。a、b、c、d、e、f、g:为译码输出端,输出为高电平 1 有效。CD4511 的内部 word 文档 可自由复制编辑 有上拉电阻,在输入端与数码管笔段端接上限流电阻就可工作 1.CD4511 的引脚 CD4511 具有锁存、译码、消隐功能,通常以反相器作输出级,通常用以驱动 LED。其引脚图如 3-2 所示。
10、各引脚的名称:其中 7、1、2、6 分别表示 A、B、C、D;5、4、3 分别表示 LE、BI、LT;13、12、11、10、9、15、14 分别表示 a、b、c、d、e、f、g。左边的引脚表示输入,右边表示输出,还有两个引脚8、16分别表示的是VDD、VSS。2.CD4511 的工作原理 CD4511 的工作真值表如表 3-2 锁存功能 译码器的锁存电路由传输门和反相器组成,传输门的导通或截止由控制端 LE 的电平状态。当 LE 为“0”电平导通,TG2 截止;当 LE 为“1”电平时,TG1 截止,TG2 导通,此时有锁存作用。如图 3-3(3)译码 CD4511 译码用两级或非门担任,为
11、了简化线路,先用二输入端与非门对输入数 据 B、C 进行组合,得出、四项,然后将输入的数据 A、D 一起用或非门译码。(4)消隐 BI 为消隐功能端,该端施加某一电平后,迫使 B 端输出为低电平,字形消隐。消隐控制电路如图 3-4 所示。消隐输出 J 的电平为 J=(C+B)D+BI 如不考虑消隐 BI 项,便得 J=(B+C)D 据上式,当输入 BCD 代码从 1010-1111时,J 端都为“1”电平,从而使显示器中的字形消隐。输 入 输 出 LE BI LI D C B A a b c d e f g 显示 X X 0 X X X X 1 1 1 1 1 1 1 8 X 0 1 X X
12、X X 0 0 0 0 0 0 0 消隐 word 文档 可自由复制编辑 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 2 0 1 1 0 0 1 1 1 1 1 1 0 0 1 3 0 1 1 0 1 0 0 0 1 1 0 0 1 1 4 0 1 1 0 1 0 1 1 0 1 1 0 1 1 5 0 1 1 0 1 1 0 0 0 1 1 1 1 1 6 0 1 1 0 1 1 1 1 1 1 0 0 0 0 7 0 1 1 1 0 0 0 1 1 1 1 1
13、 1 1 8 0 1 1 1 0 0 1 1 1 1 0 0 1 1 9 0 1 1 1 0 1 0 0 0 0 0 0 0 0 消隐 0 1 1 1 0 1 1 0 0 0 0 0 0 0 消隐 0 1 1 1 1 0 0 0 0 0 0 0 0 0 消隐 0 1 1 1 1 0 1 0 0 0 0 0 0 0 消隐 0 1 1 1 1 1 0 0 0 0 0 0 0 0 消隐 0 1 1 1 1 1 1 0 0 0 0 0 0 消隐 1 1 1 X X X X 锁 存 锁存 表 3-2 CD 4511 的真值表 8421 BCD 码对应的显示见下图 :选用共阴极数码管,对于 CD4511,
14、它与数码管的基本连接方式如下图:3 键盘及读数原理 键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去 抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在 word 文档 可自由复制编辑 这里采用软件延时的方法来避开抖动,延时时间20ms.4 连击功能的实现 按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应 的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。三、程序设计思想和相关指
15、令介绍 本系统的主程序主要完成时间显示和定时输出判断功能。而年月日显示和各时间单元进位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。1数据与代码转换。由前述可知,从P2 口输出位选码,从P0 口输出段选码,LED 就会显示出数字来。但P0 口的输出的数据是要BCD 码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0 口去驱动LED 数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD 码行转换后,将各个单元数据的段选代码送入P0 口,给CD4511 译码后去驱动数码管显示。具体转换过程如下:我们先将
16、要显示的数据装入累加器A 中,再将A 中的数据转换成高低两位的BCD 码,再放回A 中,然后将A 中的值输出。如:有一个单元存储了45 这样一位数,则需转换成四位的BCD 码:(0100)(0101)然后放入A 中。A 中BCD 码,高位四位代表 4 低四位代表 5 同时送给两个译码器中,译码后 45 字就在两个LED 中显示出来。2计时功能的实现与中断服务程序 时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0 打开后,进入计时,满100 毫秒后,重装定时。中断一次,满一秒后秒进位,满60 秒后即为1 分钟,分钟单元进位,60 分到了后,时单元进位,24 小时满后,天单元
17、进位。这样然后根据进率,得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED 中显示出来,实现时钟计时功能。累加是用指令INC 来实现的。进入中断服务程序以后,执行PUSH PSW 和PUSH A 将程序状态寄存器PSW 的内容和累加器A 中的数据保存起来,这便是所谓的 保护现场 .以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM 中的任一区间设定,而堆栈的数据存取与一般的RAM 存取又有区别,对它的操作,要遵循 后进先出 的原则。3 时钟误差分析 开启定时器/计数器0,使之开始计时,中断后进入中断程序。自停止计数到、计数又开始,中间
18、执行了7 条指令,也就是延迟了13 个单周期共用时间26us,这样,每个中断的总时间应为为100.026sm,而原来定时是100ms,所以,也就是说每次中断定时多了 26um.这样,可改变计数重装值,使每次中断定时时间为99.974sm,加上原来的7 条指令所用的时间,正好100sm.计数10 次得1s.这样就可得到较精确的计时秒数,然后根据进率,得到 时、分的值。4 时间控制功能与比较指令 系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先将执行设备开启的时间和关闭时间臵入RAM 某一单元,在计时主程序当 word 文档 可自由复制编辑 中执行几条比较指令,如果当前计
19、时时间与执行设备的设定开启时间相等,就执行一条CLR 指令,将对应的那路P3 臵为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB 对应的P3 臵低电位,二极管截止,。实现此控制功能用到的比较指令为CJNE A,#direct,rel,其转移条件是累加器A 中的值与立即数不等则转移。参考文献 1、谢自美,电子线路设计、实验、测试武汉:华中理工大学出版社,2000 2、何书森、何华斌实用数字电路原理与设计速成福州:福建科学技术出版社,2000.6 3、白驹衍,单片计算机及应用北京:电子工业出版社,1999.2 word 文档 可自由复制编辑 word 文档 可自由复制编
20、辑 定时中断程序流程图 word 文档 可自由复制编辑 word 文档 可自由复制编辑 word 文档 可自由复制编辑 程序 SEC EQU 32H;秒即时时间 伪指令 MIN EQU 31H;分 HOUR EQU 30H;时 DAY EQU 35H;日 MON EQU 34H;月 YEAR EQU 33H;年 MIN_1 EQU 41H;分定时器1 路、开存储单元 HOUR_1 EQU 42H;时 DAY_1 EQU 43H;MON_1 EQU 44H;YEAR_1 EQU 45H;word 文档 可自由复制编辑 MIN_11 EQU 40H;分定时器1 路、关存储单元 HOUR_11 EQ
21、U 46H;时 DAY_11 EQU 47H;日 MON_11 EQU 48H;月 YEAR_11 EQU 49H;年;*ORG 0000H ljmp MAIN ORG 0003H;中断转换显示年月日、INT0(SB4 键)LJMP SHOW ORG 000BH;计数中断T0、方式1 LJMP TIME ORG 0013H LJMP CHANGE;调整时间、定时、INT1(SB0 键);-主程序 ORG 0030H MAIN:;-初始化付值 MOV YEAR,#02 MOV MON,#05 MOV DAY,#01 MOV HOUR,#00 MOV MIN,#00 MOV SEC,#00 CLR
22、 40H;定时单元1 路清零 CLR 41H CLR 42H CLR 43H CLR 44H CLR 45H CLR 46H CLR 47H CLR 48H CLR 49H;-开中断 MOV TMOD,#01H;计数、模式1、T0 MOV TL0,#0B0H;100SM 计数定时 MOV TH0,#3CH;clr p3.0 MOV 20H,#0AH;10 次*100SM SETB PT0;T0 为最高级 SETB TR0;允许计数 SETB ET0;允许T0 中断 SETB EX0;允许INT0 中断 word 文档 可自由复制编辑 SETB EX1;允许INT1 中断 SETB EA;开总中
23、断;-显示、定时器启动判断 LOOP:MOV R1,#30H;存储单元 MOV R4,#01H;位选通 MOV R3,#03H;三组显示 NEXT:MOV A,R1;MOV B,#10;将存储单元转换成两高低两组的BCD 码 DIV AB SWAP A ORL A,B MOV P0,A;输出 MOV P2,R4 INC R1;下一单元 MOV A,R4;RL A;位移 MOV R4,A LCALL DE5SM;延时0.5SM DJNZ R3,NEXT;全扫描显示一偏;-判断定时输出(只编写了一路)CJNE R7,#88H,LOOP;是8 则开,否则、定时已关、转;-开 MOV A,YEAR C
24、JNE A,YEAR_1,LOOP_1;年比较,不等转关 MOV A,MON CJNE A,MON_1,LOOP_1 MOV A,DAY CJNE A,DAY_1,LOOP_1 MOV A,HOUR CJNE A,HOUR_1,LOOP_1 MOV A,MIN CJNE A,MIN_1,LOOP_1 CPL P3.0;-关 LOOP_1:MOV A,YEAR CJNE A,YEAR_11,LOOP;年比较 MOV A,MON CJNE A,MON_11,LOOP MOV A,DAY CJNE A,DAY_11,LOOP MOV A,HOUR word 文档 可自由复制编辑 CJNE A,HOU
25、R_11,LOOP MOV A,MIN CJNE A,MIN_11,LOOP CPL P3.0 LJMP LOOP;-年月日显示中断子程序 SHOW:PUSH PSW push ACC PUSH B PUSH 01H PUSH 02H PUSH 03H PUSH 04H MOV R2,#0FFH;中断扫描次数 TURN:MOV R1,#33H MOV R4,#01H MOV R3,#03H NEXT_1:MOV A,R1 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,R4 INC R1 RL A MOV R4,A LCALL DE5SM DJN
26、Z R3,NEXT_1 DJNZ R2,TURN;反复显示一定时间后返回 POP 04H POP 03H POP 02H POP 01H POP B POP ACC POP PSW RETI;-计数中断服务子程序 TIME:PUSH PSW PUSH ACC word 文档 可自由复制编辑 PUSH B PUSH 06H MOV TH0,#3CH;重装计数 MOV TL0,#0BH;DJNZ 20H,OUT;转到中断跳出pop 程序 MOV 20H,#0AH;重装:100*10=1000;-进位程序 INC SEC MOV R6,SEC;CJNE R6,#60,OUT;比较 MOV SEC,#
27、00;INC MIN MOV R6,MIN CJNE R6,#60,OUT MOV MIN,#00 INC HOUR MOV R6,HOUR CJNE R6,#25,OUT MOV HOUR,#00 INC DAY MOV R5,MON CJNE R5,#1,MON_22;是否1 月、不是转2 月 MOV R5,DAY CJNE R5,#32,OUT;本月是否益出 INC MON MOV DAY,#1 LJMP OUT OUT:POP 06H POP B POP ACC POP PSW RETI MON_22:MOV R5,MON CJNE R5,#2,MON_33;是否2 月、不是转3 月
28、MOV A,YEAR;判断是否瑞年 MOV B,#4 DIV AB MOV A,B JNZ OUT_1;不是则转(A 不为零则转)MOV R5,DAY CJNE R5,#30,OUT;如是瑞年、判断是否到29 天 INC MON word 文档 可自由复制编辑 MOV DAY,#1 LJMP OUT OUT_1:MOV R5,DAY CJNE R5,#29,OUT;平年二月判断 INC MON MOV DAY,#1 LJMP OUT MON_33:MOV R5,MON CJNE R5,#3,MON_44 MOV R5,DAY CJNE R5,#32,OUT INC MON MOV DAY,#1
29、 LJMP OUT MON_44:MOV R5,MON CJNE R5,#4,MON_55 MOV R5,DAY CJNE R5,#31,OUT INC MON MOV DAY,#1 LJMP OUT MON_55:MOV R5,MON CJNE R5,#5,MON_66 MOV R5,DAY CJNE R5,#32,OUT INC MON MOV DAY,#1 LJMP OUT MON_66:MOV R5,MON CJNE R5,#6,MON_77 MOV R5,DAY CJNE R5,#31,OUT INC MON MOV DAY,#1 LJMP OUT MON_77:MOV R5,MON
30、 CJNE R5,#7,MON_88 MOV R5,DAY word 文档 可自由复制编辑 CJNE R5,#32,L1 INC MON MOV DAY,#1 L1:LJMP OUT MON_88:MOV R5,MON CJNE R5,#8,MON_99 MOV R5,DAY CJNE R5,#32,L2 INC MON MOV DAY,#1 L2:LJMP OUT MON_99:MOV R5,MON CJNE R5,#9,MON_00 MOV R5,DAY CJNE R5,#31,L3 INC MON MOV DAY,#1 L3:LJMP OUT MON_00:MOV R5,MON CJNE
31、 R5,#10,MON_AA MOV R5,DAY CJNE R5,#32,L4 INC MON MOV DAY,#1 L4:LJMP OUT MON_AA:MOV R5,MON CJNE R5,#11,MON_BB MOV R5,DAY CJNE R5,#31,L5 INC MON MOV DAY,#1 L5:LJMP OUT MON_BB:MOV R5,DAY CJNE R5,#32,L6 INC YEAR MOV MON,#1 MOV DAY,#1 L6:LJMP OUT;-校对时间、定时调整中断 CHANGE:PUSH PSW word 文档 可自由复制编辑 PUSH ACC PUSH
32、 B PUSH 00H mov p2,#00h SHOW_1:MOV A,#01H;显示1 MOV P0,A MOV P2,#0FFH;三组数码管都显示1 路 LCALL READ;调用读p1 口键程序 CJNE A,01H,SHOW_1;去抖后比较 LCALL DE250SM;延时250 秒 CJNE A,#0FBH,ttT1 LJMP SB3_1 ttT1:CJNE A,#0FEH,SHOW_1 AJMP SHOW_2;-二组显示 SHOW_2:MOV A,#02H;显示2 MOV P0,A MOV P2,#0FFH;LCALL READ CJNE A,01H,SHOW_2;去抖后比较 L
33、CALL DE250SM;延时250 秒 CJNE A,#0FBH,T2;不等转去判断此时SB3 按了没 LJMP SB3_2 T2:CJNE A,#0FEH,SHOW_2 AJMP SHOW_3;_-三组显示 SHOW_3:MOV A,#03H;显示3 MOV P0,A MOV P2,#0FFH;位码 LCALL READ CJNE A,01H,SHOW_3;去抖后比较 LCALL DE250SM;延时250 秒 CJNE A,#0FBH,T3;不等转去判断此时SB3 按了没 LJMP SB3_3 T3:CJNE A,#0FEH,SHOW_3 AJMP SHOW_4;-即时年单元调时、显示
34、SHOW_4:MOV A,YEAR;调出年单元 MOV B,#10;BCD 转换 DIV AB SWAP A word 文档 可自由复制编辑 ORL A,B MOV P0,A;MOV P2,#01H;LCALL READ LCALL DE250SM CJNE A,01H,SHOW_4;去抖 CJNE A,#0FEH,KEY2_1;按SB2 转年调整 AJMP MON_CH;按SB1 往下调月单元 KEY2_1:CJNE A,#0FDH,SHOW_4 LCALL YEAR_AD;调用年调整 AJMP SHOW_4;MON_CH:MOV A,MON;月单元调整 MOV B,#10 DIV AB S
35、WAP A ORL A,B MOV P0,A;MOV P2,#02H;LCALL READ LCALL DE250SM CJNE A,01H,MON_CH;去抖 CJNE A,#0FEH,KEY2_2;按SB2 转月调整 LJMP DAY_CH;按SB1 往下调日单元 KEY2_2:CJNE A,#0FDH,MON_CH LCALL MON_AD;调用月调整 LJMP MON_CH;DAY_CH:MOV A,DAY;日单元调整 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A;MOV P2,#04H;LCALL READ LCALL DE250SM CJNE A
36、,01H,DAY_CH;去抖 CJNE A,#0FEH,KEY2_3;按SB2 转日调整 LJMP HOUR_CH;按 SB1 往下调时单元 KEY2_3:CJNE A,#0FDH,DAY_CH LCALL DAY_AD;调用日调整 LJMP DAY_CH HOUR_CH:MOV A,HOUR;时单元调整 word 文档 可自由复制编辑 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A;MOV P2,#01H;LCALL READ LCALL DE250SM CJNE A,01H,HOUR_CH;去抖 CJNE A,#0FEH,KEY2_4;按SB2 转时调整
37、AJMP MIN_CH;按SB1 往下调分单元 KEY2_4:CJNE A,#0FDH,HOUR_CH LCALL HOUR_AD;调用时调整 AJMP HOUR_CH;MIN_CH:MOV A,MIN;分单元调整 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A;MOV P2,#02H;LCALL READ LCALL DE250SM CJNE A,01H,MIN_CH;去抖 CJNE A,#0FEH,KEY2_5;按SB2 转分调整 AJMP SEC_CH;按SB1 往下调秒单元 KEY2_5:CJNE A,#0FDH,MIN_CH LCALL MIN_AD
38、;调用分调整 LJMP MIN_CH;SEC_CH:MOV A,SEC;秒单元调整 MOV B,#10 DIV AB SWAP A ORL A,B P0,A;MOV P2,#04H;LCALL READ LCALL DE250SM CJNE A,01H,SEC_CH;去抖 CJNE A,#0FEH,KEY2_6;按SB2 秒调整 LJMP OUT_A;按SB1 跳出 KEY2_6:CJNE A,#0FDH,SEC_CH word 文档 可自由复制编辑 CLR SEC;归零 LJMP SEC_CH;-按SB2定时器年单元加1 子程序 SB3_2:LJMP SHOW_2;二路没编返回 SB3_3:
39、LJMP SHOW_3;三路没编返回 SB3_1:MOV A,YEAR_1;调时年单元 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#01H LCALL READ LCALL DE250SM CJNE A,01H,SB3_1 CJNE A,#0FBH,KEY2_7;按SB2 转年调整 LJMP MON_111;按SB1 往下调月单元 KEY2_7:CJNE A,#0FDH,SB3_1 INC YEAR_1;1 路年单元加1 MOV R5,YEAR_1 CJNE R5,#09,SB3_1;益出 MOV YEAR_1,#00H AJMP SB3_
40、1;-月单元加1 子程序 MON_111:MOV A,MON_1;调时月单元显示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#02H LCALL READ LCALL DE250SM CJNE A,01H,MON_111 CJNE A,#0FBH,KEY2_8;按SB2 转月调整 LJMP DAY_111 KEY2_8:CJNE A,#0FDH,MON_111 INC MON_1;1 路月单元加1 MOV R5,MON_1 CJNE R5,#13,MON_111;益出 MOV MON_1,#01H word 文档 可自由复制编辑 AJMP
41、MON_111;转到月显;_-日单元加1 子程序 DAY_111:MOV A,DAY_1;调时日单元显示提示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#04H LCALL READ LCALL DE250SM CJNE A,01H,DAY_111 CJNE A,#0FBH,KEY2_9;按SB2 转日调整 LJMP HOUR_111 KEY2_9:CJNE A,#0FDH,DAY_111 INC DAY_1;1 组日单元加1 MOV R5,DAY_1 CJNE R5,#32,DAY_111;益出 MOV DAY_1,#01H AJMP D
42、AY_111;转到日显;-按SB2 时单元加1 子程序 HOUR_111:MOV A,HOUR_1;调时时单元显示提示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#01H LCALL READ LCALL DE250SM CJNE A,01H,HOUR_111 CJNE A,#0FBH,KEY2_10;按 SB2 转时调整 LJMP MIN_111 KEY2_10:CJNE A,#0FDH,HOUR_111 INC HOUR_1 MOV R5,HOUR_1 CJNE R5,#24,HOUR_111;益出 MOV HOUR_1,#00H AJ
43、MP HOUR_111;转到时显;-分单元加1 子程序 MIN_111:MOV A,MIN_1;调时分单元、并显示提示 word 文档 可自由复制编辑 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#02H LCALL READ LCALL DE250SM CJNE A,01H,MIN_111 CJNE A,#0FBH,KEY2_11;按SB2 转分调整 AJMP OFF_CH;按SB3 往下调定时:关单元 KEY2_11:CJNE A,#0FDH,MIN_111 INC MIN_1;1 路分单元加1 MOV R5,MIN_1 CJNE R5,
44、#60,MIN_111;益处 MOV MIN_1,#00H AJMP MIN_111;转到分显年单元调整 OFF_CH:MOV A,YEAR_11;调时年单元 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#01H LCALL READ LCALL DE250SM CJNE A,01H,OFF_CH CJNE A,#0FBH,KEY2_F7;按SB2 转年调整 LJMP MON_OFF;按 SB1 往下调月单元 KEY2_F7:CJNE A,#0FDH,OFF_CH INC YEAR_11;1 路年单元加1 MOV R5,YEAR_11 CJN
45、E R5,#09,OFF_CH;益出 MOV YEAR_11,#00H AJMP OFF_CH;-月单元加1 子程序 MON_OFF:MOV A,MON_11;调时月单元显示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#02H word 文档 可自由复制编辑 LCALL READ LCALL DE250SM CJNE A,01H,MON_OFF CJNE A,#0FBH,KEY2_F8;按SB2 转月调整 LJMP DAY_OFF KEY2_F8:CJNE A,#0FDH,MON_OFF INC MON_11;1 路月单元加1 MOV R5
46、,MON_11 CJNE R5,#13,MON_OFF;益出 MOV MON_11,#01H AJMP MON_OFF;转到月显;_-日单元加1 子程序 DAY_OFF:MOV A,DAY_11;调时日单元显示提示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#04H LCALL READ LCALL DE250SM CJNE A,01H,DAY_OFF CJNE A,#0FBH,KEY2_F9;按SB2 转日调整 LJMP HOUR_OFF KEY2_F9:CJNE A,#0FDH,DAY_OFF INC DAY_11;1 组日单元加1 M
47、OV R5,DAY_11 CJNE R5,#32,DAY_OFF;益出 MOV DAY_11,#01H AJMP DAY_OFF;转到日显;-按SB2 时单元加1 子程序 HOUR_OFF:MOV A,HOUR_11;调时时单元显示提示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#01H LCALL READ LCALL DE250SM CJNE A,01H,HOUR_OFF word 文档 可自由复制编辑 CJNE A,#0FBH,KEY2_F10;按 SB2 转时调整 LJMP MIN_OFF KEY2_F10:CJNE A,#0FDH
48、,HOUR_OFF INC HOUR_11 MOV R5,HOUR_11 CJNE R5,#24,HOUR_OFF;益出 MOV HOUR_11,#00H AJMP HOUR_OFF;转到时显;-分单元加1 子程序 MIN_OFF:MOV A,MIN_11;调时分单元、并显示提示 MOV B,#10 DIV AB SWAP A ORL A,B MOV P0,A MOV P2,#02H LCALL READ LCALL DE250SM CJNE A,01H,MIN_OFF CJNE A,#0FBH,KEY2_F11;按SB2 转分调整 LJMP ON_1;按SB3 往下调定时:开与关 KEY2_
49、F11:CJNE A,#0FDH,MIN_OFF INC MIN_11;1 路分单元加1 MOV R5,MIN_11 CJNE R5,#60,MIN_OFF;益处 MOV MIN_11,#00H LJMP MIN_OFF;转到分显;-开、关定时 ON_1:CJNE A,#0FBH,MIN_OFF K1:MOV A,#88H MOV R7,A MOV P0,A MOV P2,#0FFH;三组都显示开 LCALL READ LCALL DE250SM CJNE A,01H,ON_1;去抖后比较 CJNE A,#0FBH,KEY2_12;按SB2 转关 LJMP OUT_A;按SB3 调出、处于开状
50、态 KEY2_12:CJNE A,#0FDH,K1 k2:MOV A,#00H;显示0 关 MOV R7,A MOV P0,A MOV P2,#0FFH;word 文档 可自由复制编辑 LCALL READ LCALL DE250SM CJNE A,01H,K2;去抖后比较 CJNE A,#0FBH,KEY2_13;按SB2 转开 LJMP OUT_A;SB3 调出、处关状态 KEY2_13:CJNE A,#0FDH,K2;比较按了没 LJMP K1;按了SB2、转开 OUT_A:POP 00H POP B POP ACC POP PSW RETI;_-读取按键程序 READ:MOV A,P1