单片机时钟计时器的设计论文.docx
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机的时钟计时器论文
目录
一.容摘要
二.关键词和引言
三.时钟计时器设计
1方案设计
2原理分析
四.实验器材
五.利用 protel99设计电路原理图
1原理图
2PCB图
六调试及性能分析
七.心得体会
八.参考文献
九.时钟计时器使用说明书
1.产品概述
2.技术参数
3.工作原理
4.结构特征
5.使用和维护
十.时钟计时器技术说明书
1.产品概述
2.技术参数
4.结构特征
十一、附录时钟计时器汇编程序清单
一.容摘要:
时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用 LED 显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
本文利用单片机实现数字时钟计时功能的主要容,其中 AT89C52 是核心元件同时采用数码管动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确 ,显示直观等特点。
它的计时周期为 24 小时,显满刻度为“23 时 59 分 59 秒”,另外具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
本文主要介绍用单片机部的定时 / 计数器来实现电子时钟的方法,本设计由单片机 AT89C52 芯片和 LED 数码管为核心,辅以必要的电路,构成了一个单片机电子时钟
二.关键词:单片机、数码管、端口、时钟、动态显示。
引言 :
单片机自 20 世纪 70 年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
单片机体积小、重量轻、抗
干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发
较为容易。
由于具有上述优点,在我国,单片机已广泛地应用在工业
自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电
一体化设备等各个方面。
这次设计通过对它的学习、应用,以 AT89S52
芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由直
流电源供电,通过数码管能够准确显
数字时钟是现代社会应用广泛的计时工具,在航天、电子等科研单位,工厂、医院、学校等企事业单位,各种体育赛事及至我们每个人的日
常生活中都发挥着重要的作用。
本系统是基于AT89C52 单片机设计的一个具有六位LED 显示的数字时实时钟,采用独立式按键进行时间调整,同时引入一个部充电电源在停止外部供电时,仍具有部计时的功能。
该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优
点
三.时钟计时器设计
一、方案设计:
1.我们采用了动态显示的方法来实现LED 显示器的数字显示即
时钟的 6 位显示。
2.单片机采用了AT89C52 系列,这种单片机具有足够的空余硬
件资源,可以实现其他的扩充功能。
3、AT89C52 提供以下标准功能: 8k 字节 Flash 闪速存储器, 256
字节部 RAM,32 个 I/O 口线,3 个 16 位定时 / 计数器,一个 6 向量两级中断结构,一个全双工串行通信口,片震荡器及时钟电路。
同时,AT89C52 可降至 0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止 CPU 的工作,但允许 RAM,定时 / 计数器,串行通信口及中断系统继续工作。
掉电方式保存
RAM 中的容,但震荡器停止工作并禁止其他所有部件工作直到下
一个硬件复位。
AT89C52 的功能与 C51 的功能基本上是相同的。
(1)、中断源
MCS-51 单片机是一个多中断源的单片机,有五个中断源:外部
中断 0、定时器 0 中断、外部中断 1、定时器 1 中断和串行接收或发
送中断。
各中断源的中断处理程序入口地址如下表 1 所示:
表 1 中断向量表
入口地址
中断源
外部中断 00003H
定时器 0000BH
外部中断 10013H
定时器 1001BH
串行口0023H
(2)、中断控制
A、中断的开放或禁止是由中断允许寄存器IE 控制的。
IE 的格式如下:
EA ES ET1EX1ET0EX0
EA-中断总允许位。
EA=1,开放总中断,而各个中断源的中断请允
许还是禁止,分别由各自的中断允许位确定;EA=0,禁止一切中断。
ES-串行口中断允许位。
ET1 和 ET0分别是定时器 T1 和 T0 的中断允许位。
EX1 和 EX0 分别是外部中断1(INT1)和外部中断 0(INT0)的中断
允许位。
以上五个中断允许位的意义是:0 为禁止中断 ,1 为允许中断。
B、中断源优先级控制-中断优先级寄存器IP。
MCS-51 单片机有高、低两个中断优先级, 5 个中断源可由程序设置
为高优先级中断或低优先级中断,实现二级中断嵌套。
一个正在执行的低优先级中断源的中断服务程序,能被高优先级中断源所中断,但不能被同级别的另一个中断源所中断。
MCS-51 单片机的 5 个中断
源的优先级由中断优先级寄存器IP 的相应位设定。
IP 格式如下:
PS PT1PX1PT0PX0 3.时钟计时器电路系统的总体设计框图如图 1 所示。
图1
二、原理分析;
1.采用了 AT89C52 单片机最化应用设计;采用共阳 7 段 LED 显示器;P0 口输出段码数据; P2.0----P2.5 口作列扫描输出 ;P1.0、P1.1、P1.2、和 P1.3 口接 4 个按钮开关,用于调时及功能设置;为了提供
共阳 LED 数码管的列扫描驱动电压,用三极管 9012 作电源驱动输出;采用 12MHz 晶振,来提高秒计时的精确性。
2.计时采用了定时器T0 中断来实现。
秒表使用定时器T1 中断来完成。
主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。
程序的设计主程序执行流程如图3
图 3;
3.显示子程序;
时间显示子程序每次显示 6 个连续存单元的十进制BCD 码数据,首地址在地址在调用显示程序先指定。
存中 50H-----55H为闹钟定时单元,60H---65H为秒表计时单元,70H---75H 为时钟显示单元。
由于采用 7 段共阳 LED 数码管动态扫描实现数据显示,所以显示用十进制BCD 码数据的对应段码存放在在 ROM 表中。
显示时,先取出存地址中的数据,然后查得对应的显示用段码
从P0 口输出, P2 口将对应的数码管选中供电,就能显示该地址单元的数据值。
为了显示小数点及“--- ”、“A”等特殊字符,在显示
.
班级和计时时应采用不同的显示子程序。
4.定时器 T0 中断服务程序;
定时器 T0 用于时间计时,定时溢出中断周期为50ms,中断进入先进行定时中断初值校正,当中断累计 20 次时,对秒计数单元进行加 1 操作。
时钟计数单元地址分别在70H—— 71H(秒),76H---77H (分),78H---79 (时)中,最大计时值为23 时 59分 59 秒。
7AH 单元存放“熄灯符”数据(#0AH ),用于时间调整时的闪烁功能。
在计数单元中,采用十进制BCD 码计数,满 10 进位。
T0 中断计时程序流程如图4;
.
图4;
5.定时器 T0 中断服务程序;
T1 中断程序用于批示时间调整单元的闪亮或秒表计数,在时间时间状态下,每过0。
3S 左右,将对应应单元的显示数据换成“熄灭符”数据(#AH )。
这样,在调整时间时,对应调整单元的显示数据会间隔闪亮。
在作秒表计时时,每 10MS 中断 1 次,计数单元加 1,每 100 次为 1S。
秒表计计数单元地址在 60H——— 61H(10 毫秒)、62H ——63H(秒)、64H- ——— 65H(分)中,最大计数值为 99 分 59.99
秒。
T1 中断服务程序如图5;
图5
6.调时功能程序;
1. 按下P1.0口按键,若按下时间小于1S 则进入省电状态;否则进
.
入调分状态,等待操作,此时计时器停止走动。
当再按下P1.0 口按
键时,若按下时间小于 0.5S,则时间加 1 分钟;若按下时间大于 0.5 要,则进入小时调整状态。
按下 P1.1 按键时,可进行减 1 调整。
在小时调整状态下,当按键按下的时间大于 0.5S 时,退出时间调整状
态,时钟从 0S 开始计时。
2.秒表功能程序;在正常时钟状态下,若按下 P1.1 口按键,则进行时
钟/ 秒表显示功能的转换,秒表中断计时程序启动,显示首地址改为
60H,LED 将显示秒表计时单元60H----65H 中的数据。
按下 P1.2 口
的按键开关,可实现秒表清0,秒表启动,秒表计时暂停功能;当再
按下 P1.1 口按键时,关闭 T1 秒表中断计时,显示首地址又改为70H,恢复正常时间的显示功能。
四.实验器材
器件名称规格型号数量
电阻5108
电阻 4.7k6
电阻10k5
电解电容47uF\25V1
电解电容10u\16V1
电解电容2200uf|25v1
电解电容33uf/25V1
陶瓷电容1031
陶瓷电容302
.芯片AT89C521
芯片插座40 脚3
芯片插座20 脚1
三极管90126
二极管IN40074
数码管共阳型6
晶振12MHz1
单面覆铜板16cm*12cm1五.利用 protel99 设计电路原理图
1.原理图
2.PCB图
.
六.调试及性能分析
1硬件调试
1.硬件调试时可先检查印制板及焊接的质量情况,在检查无误
后可通电检查 LED 显示器的点亮状况。
若亮度不理想,可以调整 P0
口的电阻大小,一般情况下取 200 欧姆电阻即可获得满意的亮度效果。
2.软件调试
3.性能分析
按照设计程序分析, LED 显示器动态扫描的频率约为 167Hz, 实际使用观察时完全没有闪烁。
上电时具有一个滚动显示子程序,可以方便的显示制作日期等信息。
七、心得体会
在这次的课程设计中我遇到了些问题,如:数码管一直显示 00 而不跳动,原因就是少了返回指令 SJMP;电路焊接短路时会导致数码管全亮,而不显示数字。
在解决这些问题时也是一个再次学习的过程。
从开始接到论文要求到时钟的实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战,这也是我在大学期间独立完成的最大的项目。
在这段时间里,我学到了很多知识也有很多感受,我开始了独立的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。
这次论文的经历也会使我终身受益,我感受到做论文是要用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,
没有自己的研究,就不会有所突破。
通过设计,我在老师的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。
在此,忠心感谢老师以及许多同学的指导和支持。
八、参考文献;
1、《单片机课程设计指导》楼然苗、光飞,北京:北京航
空航天大学出版社, 2007.7
2.《单片机原理及应用》何桥,北京:中国铁道出版社,2007.12
3、《单片机教程习题与解答》俊谟,迎新北京:北京航空航天大学出版社
2003.3
4.《单片机控制工程实践技术》付家才北京化学工业出版社2004.3
九.时钟计时器使用说明书
一、概述
由芯片 AT89C52 构成的时钟计时器,具有体积小,成本低,
抗干扰能力强,面向控制,可以实现分机各分布式控制等优点。
它广泛应用于各种继电器、电磁开关,控制器、廷时器、定时器等的时间
测试。
目前所使用的电秒表大多是指针式或集成电路型的,结构相对复杂、测试功能单一。
本仪器还具有实时时钟、手动计时的功能。
(正常工作电压 5V)
二、技术参数
1.兼容 MCS51 指令系统·8k可反复擦写(>1000次)Flash R OM
2. 32 个双向 I/O 口·256x8bit部RAM
3. 3个 16 位可编程定时 / 计数器中断·时钟频率 0-12MHz
4. 2个串行中断·可编程 UART 串行通道
5. 2个外部中断源·共 6 个中断源
6. 2 个读写中断口线·3级加密位
7.低功耗空闲和掉电模式·软件设置睡眠和唤醒功
三、工作原理
系统硬件设计
时钟计时器采用 AT89C52 单片机最小化应用设计; P1 口输出段码数据;P2.0~P2.5 作列扫描输出;P1.1、P1.1,P1.2 和P1.3 接按钮开关,用于调时及功能设置;采用 12MHZ 的晶振 AT89C52 作为主控芯片,定期的读取时钟芯片 DS1302 中的时间并把小时和肥以示在 6 位 LED 中,显示时间。
四、结构特征
它体积小,外形尺寸: 16cm*12cm 、无外观修饰,完全裸露部
元件、操作方便,便于安装、拆卸与维修。
五、使用和维护
1、使用
(1)与输入信号端连接,接 5V 直流电。
(2)调时功能按下 P1.0 口按键,若按下时间小于 1s,则进入省电
状态;否则进入调分状态,等待操作,此时计时器停止走动。
当再按下 P1.0 口按键时,若按下时间小于 0.5s,则时间加 1 分<
钟> ;若按下时间大于0.5s,则进入< 小> 时调整状态。
按下P1.1 时。
在< 小> 时调整状态下,当按键按下的时间大于 0.5s 时,退出时间调整状态,时钟从 0s 开始计时。
(3)在正常时钟状态下,若按下 P1.1 口按键,则进行时钟 / 秒表显示功能的转换,秒表中断计时程序启动,显示首址改为60H,
LED将显示秒表计时单元60H-65H 中的数据。
按下P1.2 口说我按键开关,可实现秒表清0、秒表启动、暂停功能;再按下P1.1 口时,关闭T1 秒表中断计时,显示首址又改为70H,恢复正常时间的显示功能。
2、维护
(1)断电情况下,用万用表检是否有元器件松动,有松动则
进行烙牢;
(2)用万用表检测元器件是否接触良好;
(3)检测输入电压是否是5V。
(4)不使用时断开电源,确保电路安全;
(5)尽量保持元件清洁、牢固 .
十.时钟计时器技术说明书
一、产品概述
由芯片AT89C52 构成的时钟计时器,这种单片机具有足够
的空余硬件资源,可以实现其他的扩充功能。
考虑使用电池供电,
时钟显示有 6 位。
采用动态扫描法实现数码管的显示。
电源电压
为5V。
单片机具有体积小,成本低,抗干扰能力强,面向控制,可以
实现分机各分布式控制等优点。
它广泛应用于各种继电器、电磁开关,控制器、廷时器、定时器等的时间测试。
目前所使用的电秒表大多是指
针式或集成电路型的,结构相对复杂、测试功能单一。
本仪器还具有实
时时钟、手动计时的功能。
二、技术参数
1.芯片 AT89C52 图
2.兼容 MCS51 指令系统·8k可反复擦写(>1000 次) Flash RO M
3.32 个双向 I/O 口·256x8bit 部 RAM
4. 3个 16 位可编程定时 / 计数器中断·时钟频率 0-24MHz
5. 2个串行中断·可编程 UART 串行通道
6.2个外部中断源·共 6 个中断源
7.2个读写中断口线·3 级加密位
8.低功耗空闲和掉电模式·软件设置睡眠和唤醒功
三、工作原理
时钟计时器采用 AT89C52 单片机最小化应用设计; P1 口输出段码数据; P2.0~P2.5 作列扫描输出; P1.1、P1.1,P1.2 和 P1.3 接按钮开关,用于调时及功能设置;采用12MHZ 的晶振AT89C52 作为主控芯片,用于产生时钟信号。
四、结构特征
它体积小,外形尺寸: 16cm*12cm 、无外观修饰,完全裸露部
元件、操作方便,便于安装、拆卸与维修。
时钟正面图
时钟反面
附录
AT89C52 时钟程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*****************************************************************************************
****;
;以下程序能用于24 小时计时 ,能作为秒表使用,能定时闹铃 1 分钟 (也可关 ).
;使用方法 :开机后在00:00:00 起开始计时 ,(1)长按 P1.0 进入调分状态:分单元闪烁
;按 P1.0 加 1,按 P1.1 减 1.再长按 P1.0 进入时调整状态,时单元闪烁 ,加减调整同调分.
;按长按退出调整状态. (2) 按下 P1.1 进入秒表状态:按 P1.2 暂停 ,再按 P1.2 秒表清零 ,
再按
;P1.2 秒表又启动 ,按 P1.1 退出秒表回到时钟状态. (3)按 P1.3 进入设定闹时状态: 00:00: -, 可进
;行分设定 ,按 P1.2 分加 1,再按 P1.3 为时调整 ,00:00:- ,按 P1.2 时加 1,按 P1.1 闹铃有效 ,
显示为 00:00:-0, 再按
;P1.1 闹铃无效 (显示 00:00:- ,),按 P1.3 调闹钟结束 .在闹铃时可按P1.3 停闹 ,不按闹铃1分钟 .
;定时器 T0、 T1 溢出周期为 50MS ,T0 为秒计数用, T1 为调整时闪烁及秒表定时用,;P1.0、P1.1、P1.2、P1.3 为调整按钮, P0 口为字符输出口, P2 为扫描口, P1.7 为蜂呜器口,采
用共阳显示管。
;50H-55H 为闹钟定时单元,60H-65H为秒表计时单元,70H-75H 为显示时间单元,7 6H-79H 为分时计时单元。
;03H 标志 =0 时钟闪烁, =1 秒表,05H=0 ,不闹铃, =1 要闹铃 .07H 每秒改
变一次 ,用作间隔呜叫.
;*****************************************************************************************
******;
DISPFIRST EQU30H;显示首址存放单元
BELL EQU P1.7;小喇叭
CONBS EQU2FH;存放报时次数
;
;****************************************
;;中断入口程序;;
;****************************************
;
ORG 0000H;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H;外中断 0 中断程序入口
RETI;外中断 0 中断返回
ORG 000BH;定时器 T0 中断程序入口
LJMP INTT0 ;跳至 INTTO 执行
ORG 0013H;外中断 1 中断程序入口
RETI;外中断 1 中断返回
ORG 001BH;定时器 T1 中断程序入口
LJMP INTT1 ;跳至 INTT1 执行
ORG 0023H;串行中断程序入口地址
RETI;串行中断程序返回
;
;****************************************
;;以下程序开始;;
;****************************************
;整点报时用
QQQQ: MOV A,#10H
MOV B,79H
MUL AB
ADD A,78H
MOV CONBS,A
BSLOOP: LCALL DS20MS
LCALL DL1S
LCALL DL1S
LCALL DL1S
DJNZ CONBS,BSLOOP
CLR08H;清整点报时标志
AJMP START1
;
;****************************************
;;主程序开始;;
;****************************************
;
START: LCALL ST;上电显示年月日及班级学号
MOV R0,#00H;清 00H-7FH 存单元
MOV R7,#80H;
CLEARDISP: MOV@R0,#00H;
INC R0;
DJNZ R7,CLEARDISP;
MOV20H,#00H;清 20H (标志用)
MOV7AH,#0AH;放入 "熄灭符 "数据
MOV TMOD,#11H;设 T0、 T1 为 16 位定时器
MOV TL0,#0B0H;50MS 定时初值( T0 计时用)
MOV TH0,#3CH;50MS 定时初值
MOV TL1,#0B0H;50MS 定时初值( T1 闪烁定时用)
MOV TH1,#3CH;50MS 定时初值
SETB EA;总中断开放
SETB ET0;允许 T0 中断
SETB TR0;开启 T0 定时器
MOV R4,#14H;1 秒定时用计数值( 50MS×20)
MOV DISPFIRST,#70H ;显示单元为 70-75H
;以下主程序循环
START1: LCALL DISPLAY;调用显示子程序
JNB P1.0,SETMM1;P1.0 口为 0 时转时间调整程序
JNB P1.1,FUNSS;秒表功能, P1.1 按键调时时作减 1 加能
JNB P1.2,FUNPT;秒表 STOP,PUSE,CLR
JNB P1.3,TSFUN;定时闹铃设定
JB08H, QQQQ
.
AJMP START1;P1.0 口为 1 时跳回 START1
;
FUNPT: LJMP FUNPTT
;以下闹铃时间设定程序,按 P1.3 进入设定
TSFUN: LCALL DS20MS
JB P1.3,START1;
WAIT113: JNB P1.3,WAIT113;等待键释放
JB05H,CLOSESP;闹铃已开的话,关闹铃
MOV DISPFIRST,#50H ;进入闹铃设定程序,显示50-55H 闹钟定时单元
MOV50H,#0CH;"-"闹铃设定时显示格式00:00: -
MOV51H,#0AH;"黑 "
;
DSWAIT:SETB EA
LCALL DISPLAY
JNB P1.2,DSFINC;分加 1
JNB P1.0,DSDEC;分减 1
JNB P1.3,DSSFU;进入时调整
AJMP DSWAIT
;
CLOSESP: CLR 05H;关闹铃标志
CLR BELL
AJMP START1
DSSFU: LCALL DS20MS;消抖
JB P1.3, DSWAIT
LJMP DSSFUNN;进入时调整
;
SETMM1:LJMP SETMM;转到时间调整程序SETMM
;
DSFINC :LCALL DS20MS;消抖
JB P1.2, DSWAIT
DSWAIT12: LCALL DISPLAY;等键释放
JNB P1.2, DSWAIT12
CLR EA
MOV R0,#53H;
LCALL ADD1;闹铃设定分加1
MOV A,R3;分数据放入A
CLR C;清进位标志
CJNE A,#60H,ADDHH22;
ADDHH22: JC DSWAIT;小于 60 分时返回
ACALL CLR0;大于或等于60 分时分计时单元清0
.
AJMP DSWAIT
DSDEC :LCALL DS20MS;消抖
JB P1.0, DSWAIT
DSWAITEE: LCALL DISPLAY;等键释放
JNB P1.0, DSWAITEE
CLR EA
MOV R0,#53H;
LCALL sub1;闹铃设定分减 1
LJMP DSWAIT
;以下秒表功能 / 时钟转换程序
;按下 P1.1 可进行功能转换
FUNSS: LCALL DS20MS
JB P1.1,START11
WAIT11:JNB P1.1,WAIT11
CPL03H
JNB03H,TIMFUN
MOV DISPFIRST,#60H;显示秒表数据单元
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
MOV TL1,#0F0H;10MS 定时初值()
MOV TH1,#0D8H;10MS 定时初值
SETB TR1
SETB ET1
START11:LJMP START1
TIMFUN:MOV DISPFIRST,#70H;显示时钟数据单元
CLR ET1
CLR TR1
START12:LJMP START1
;以下秒表暂停清零功能程序
;按下 P1.2 暂停或清 0,按下 P1.1 退出秒表回到时钟计时
FUNPTT: LCALL DS20MS
JB P1.2,START12
WAIT22:JNB P1.2,WAIT21
CLR ET1
CLR TR1
WAIT33:JNB P1.1,FUNSS
JB P1.2,WAIT31
LCALL DS20MS
JB P1.2,WAIT33
.
WAIT66:JNB P1.2,WAIT61
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
WAIT44:JNB P1.1,FUNSS
JB P1.2,WAIT41
LCALL DS20MS
JB P1.2,WAIT44
WAIT55:JNB P1.2,WAIT51
SETB ET1
SETB TR1
AJMP START1
;以下键等待释放时显示不会熄灭用
WAIT21:LCALL DISPLAY
AJMP WAIT22
WAIT31:LCALL DISPLAY
AJMP WAIT33
WAIT41:LCALL DISPLAY
AJMP WAIT44
WAIT51:LCALL DISPLAY
AJMP WAIT55
WAIT61:LCALL DISPLAY
AJMP WAIT66
;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1 秒计时程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0 中断服务程序
INTT0: PUSH ACC;累加器入栈保护
PUSH PSW;状态字入栈保护
CLR ET0;关 T0 中断允许
CLR TR0;关闭定时器 T0
MOV A,#0B7H;中断响应时间同步修正
ADD A,TL0;低 8 位初值修正
MOV TL0,A;重装初值(低8 位修正值)
MOV A,#3CH;高 8 位初值修正
ADDC A,TH0;
MOV TH0,A;重装初值(高8 位修正值)
SETB TR0;开启定时器 T0
DJNZ R4, OUTT0;20 次中断未到中断退出
.
ADDSS:MOV R4,#14H;20 次中断到( 1 秒)重赋初值
CPL07H;闹铃时间隔呜叫用
MOV R0,#71H;指向秒计时单元( 71H-72H )
ACALL ADD1;调用加 1 程序(加 1 秒操作)
MOV A,R3;秒数据放入 A( R3 为 2 位十进制数组合)
CLR C;清进位标志
CJNE A,#60H,ADDMM;
ADDMM:JC OUTT0;小于 60 秒时中断退出
ACALL CLR0;大于或等于 60秒时对秒计时单元清 0
MOV R0,#77H;指向分计时单元(76H-77H )
ACALL ADD1;分计时单元加 1 分钟
MOV A,R3;分数据放入 A
CLR C;清进位标志
CJNE A,#60H,ADDHH;
ADDHH: JC OUTT0;小于 60 分时中断退出
ACALL CLR0;大于或等于 60分时分计时单元清0
LCALL DS20MS;正点报时
SETB08H
MOV R0,#79H;指向小时计时单元( 78H-79H )
ACALL ADD1;小时计时单元加 1 小时
MOV A,R3;时数据放入 A
CLR C;清进位标志
CJNE A,#24H,HOUR;
HOUR: JC OUTT0;小于 24 小时中断退出
ACALL CLR0;大于或等于 24小时小时计时单元清 0
OUTT0: MOV72H,76H;中断退出时将分、时计时单元数据移
MOV73H,77H;入对应显示单元
MOV74H,78H;
MOV75H,79H;
LCALL BAOJ
POP PSW;恢复状态字(出栈)
POP ACC;恢复累加器
SETB ET0;开放 T0 中断
RETI;中断返回
;
;****************************************
;;闪动调时程序秒表功能程序;;
;****************************************
;T1 中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1:PUSH ACC;中断现场保护
PUSH PSW;
JB03H, MMFUN;=1 时秒表
MOV TL1,#0B0H;装定时器 T1 定时初值
MOV TH1,#3CH;
DJNZ R2,INTT1OUT;0.3 秒未到退出中断( 50MS 中断 6次)
MOV R2,#06H;重装 0.3 秒定时用初值
CPL02H;0.3 秒定时到对闪烁标志取反
JB02H,FLASH1;02H 位为 1 时显示单元 "熄灭 "
MOV72H,76H;02H 位为 0 时正常显示
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
INTT1OUT:POP PSW;恢复现场
POP ACC;
RETI;中断退出
FLASH1:JB01H,FLASH2;01H 位为 1 时,转小时熄灭控制
MOV72H,7AH;01H 位为 0 时, "熄灭符 "数据放入分
MOV73H,7AH;显示单元( 72H-73H ),将不显示分数据
MOV74H,78H;
MOV75H,79H;
AJMP INTT1OUT;转中断退出
FLASH2:MOV72H,76H;01H 位为 1 时, "熄灭符 " 数据放入小时MOV73H,77H;显示单元( 74H-75H ),小时数据将不显示
MOV74H,7AH;
MOV75H,7AH;
AJMP INTT1OUT;转中断退出
;
MMFUN :CLR TR1
MOV A,#0F7H;中断响应时间同步修正,重装初值( 10 ms)
ADD A,TL1;低 8 位初值修正
MOV TL1,A;重装初值(低 8 位修正值)
MOV A,#0D8H;高 8 位初值修正
ADDC A,TH1;
MOV TH1,A;重装初值(高 8 位修正值)
SETB TR1;开启定时器 T0
MOV R0,#61H;指向秒计时单元( 71H-72H )
ACALL ADD1;调用加 1 程序(加 1 秒操作)
CLR C;
MOV A,R3;
JZ FSS1;加 1 后为 00,C=0
AJMP OUTT01;加 1 后不为 00 ,C=1
FSS1:ACALL CLR0;大于或等于 60秒时对秒计时单元清 0
MOV R0,#63H;指向分计时单元(76H-77H )
ACALL ADD1;分计时单元加 1 分钟
MOV A,R3;分数据放入 A
CLR C;清进位标志
CJNE A,#60H,ADDHH1;
ADDHH1: JC OUTT01;小于 60 分时中断退出
LCALL CLR0;大于或等于 60 分时分计时单元清 0
MOV R0,#65H;指向小时计时单元( 78H-79H )
ACALL ADD1;小时计时单元加 1 小时
OUTT01:
POP PSW;恢复状态字(出栈)
POP ACC;恢复累加器
RETI;中断返回;
;****************************************
;;加 1 子程序;;
;****************************************
;
;
ADD1: MOV A,@R0;取当前计时单元数据到A
DEC R0;指向前一地址
SWAP A;A 中数据高四位与低四位交换
ORL A,@R0;前一地址中数据放入 A 中低四位
ADD A,#01H;A 加 1操作
DA A;十进制调整
MOV R3,A;移入 R3 寄存器
ANL A,#0FH;高四位变 0
MOV@R0,A;放回前一地址单元
MOV A,R3;取回 R3 中暂存数据
INC R0;指向当前地址单元
SWAP A;A 中数据高四位与低四位交换
ANL A,#0FH;高四位变 0
MOV@R0,A;数据放入当削地址单元中
RET;子程序返回
;
;****************************************
;;分减 1 子程序;;
;****************************************
;
SUB1: MOV A,@R0;取当前计时单元数据到A
DEC R0;指向前一地址
SWAP A;A 中数据高四位与低四位交换
ORL A,@R0;前一地址中数据放入 A 中低四位
JZ SUB11
DEC A;A 减 1 操作
SUB111: MOV R3,A;移入 R3 寄存器
ANL A,#0FH;高四位变 0
CLR C;清进位标志
SUBB A,#0AH
SUB1111: JC SUB1110
MOV@R0,#09H;大于等于 0AH ,为 9
SUB110:MOV A,R3;取回 R3 中暂存数据
INC R0;指向当前地址单元
SWAP A;A 中数据高四位与低四位交换
ANL A,#0FH;高四位变 0
MOV@R0,A;数据放入当削地址单元中
RET;子程序返回
;
SUB11: MOV A,#59H
AJMP SUB111
SUB1110:MOV A,R3;移入 R3 寄存器
ANL A,#0FH;高四位变 0
MOV@R0,A
AJMP SUB110
;****************************************
;;时减 1子程序;;
;****************************************
;
SUBB1:MOV A,@R0;取当前计时单元数据到A
DEC R0;指向前一地址
SWAP A;A 中数据高四位与低四位交换
ORL A,@R0;前一地址中数据放入 A 中低四位
JZ SUBB11;00 减 1 为 23(小时)
DEC A;A 减 1 操作
SUBB111:MOV R3,A;移入 R3 寄存器
ANL A,#0FH;高四位变 0
CLR C;清进位标志
SUBB A,#0AH;时个位大于 9 为 9
SUBB1111: JC SUBB1110;
MOV@R0,#09H;大于等于 0AH ,为 9
SUBB110: MOV A,R3;取回 R3 中暂存数据
INC R0;指向当前地址单元
SWAP A;A 中数据高四位与低四位交换
ANL A,#0FH;高四位变0
MOV @R0,A;时十位数数据放入
RET;子程序返回
;
SUBB11: MOV A,#23H
AJMP SUBB111
SUBB1110:MOV A,R3;时个位小于0A 不处理
ANL A,#0FH;高四位变0
MOV@R0,A;个位移入
AJMP SUBB110
;****************************************
;;清零程序;;
;****************************************
;对计时单元复零用
CLR0: CLR A;清累加器
MOV@R0,A;清当前地址单元
DEC R0;指向前一地址
MOV@R0,A;前一地址单元清0
RET;子程序返回
;
;****************************************
;;时钟时间调整程序;;
;****************************************
;当调时按键按下时进入此程序
SETMM:cLR ET0;关定时器 T0 中断
CLR TR0;关闭定时器 T0
LCALL DL1S;调用 1 秒延时程序
LCALL DS20MS;消抖
JB P1.0,CLOSEDIS;键按下时间小于 1 秒,关闭显示(省电)
MOV R2,#06H;进入调时状态,赋闪烁定时初值
MOV70H,#00H;调时时秒单元为 00秒
MOV71H,#00H
SETB ET1;允许 T1 中断
SETB TR1;开启定时器 T1
SET2:JNB P1.0,SET1;P1.0 口为 0(键未释放),等待
SETB00H;键释放,分调整闪烁标志置1 SET4:JB P1.0,SET3;等待键按下
LCALL DL05S;有键按下,延时0.5 秒
LCALL DS20MS;消抖
JNB P1.0,SETHH;按下时间大于 0.5秒转调小时状态
MOV R0,#77H;按下时间小于0.5 秒加 1 分钟操作
LCALL ADD1;调用加 1 子程序
MOV A,R3;取调整单元数据
CLR C;清进位标志
CJNE A,#60H,HHH;调整单元数据与60 比较
HHH: JC SET4;调整单元数据小于60 转 SET4循环
LCALL CLR0;调整单元数据大于或等于60 时清 0
CLR C;清进位标志
AJMP SET4;跳转到 SET4循环
CLOSEDIS: SETB ET0;省电( LED 不显示)状态。
开 T0 中断
SETB TR0;开启 T0 定时器(开时钟)CLOSE:JB P1.0,CLOSE;无按键按下,等待。
LCALL DS20MS;消抖
JB P1.0,CLOSE;是干扰返回 CLOSE 等待
WAITH:JNB P1.0,WAITH;等待键释放
LJMP START1;返回主程序( LED 数据显示亮)SETHH:CLR00H;分闪烁标志清除(进入调小时状态)
SETB01H;小时调整标志置 1
SETHH1:JNB P1.0,SET5;等待键释放
SET6:JB P1.0,SET7;等待按键按下
LCALL DL05S;有键按下延时0.5 秒
LCALL DS20MS;消抖
JNB P1.0,SETOUT;按下时间大于0.5 秒退出时间调整
MOV R0,#79H;按下时间小于0.5 秒加 1 小时操作
LCALL ADD1;调加 1 子程序
MOV A,R3;
CLR C;
CJNE A,#24H,HOUU;计时单元数据与 24 比较
HOUU:JC SET6;小于 24 转 SET6循环
LCALL CLR0;大于或等于24 时清 0 操作
AJMP SET6;跳转到 SET6循环
SETOUT: JNB P1.0,SETOUT1;调时退出程序。
等待键释放
LCALL DS20MS;消抖
JNB P1.0,SETOUT;是抖动,返回SETOUT 再等待
CLR01H;清调小时标志
CLR00H;清调分标志
CLR02H;清闪烁标志
CLR TR1;关闭定时器 T1
CLR ET1;关定时器 T1 中断
SETB TR0;开启定时器 T0
SETB ET0;开定时器 T0 中断(计时开始)
LJMP START1;跳回主程序
SET1:LCALL DISPLAY;键释放等待时调用显示程序(调分)
AJMP SET2;防止键按下时无时钟显示
SET3:LCALL DISPLAY;等待调分按键时时钟显示用
JNB P1.1, FUNSUB;减 1 分操作
AJMP SET4;调分等待
SET5:LCALL DISPLAY;键释放等待时调用显示程序(调
小时)
AJMP SETHH1;防止键按下时无时钟显示
SET7:LCALL DISPLAY;等待调小时按键时时钟显示用
JNB P1.1, FUNSUBB;小时减 1 操作
AJMP SET6;调时等待
SETOUT1:LCALL DISPLAY;退出时钟调整时键释放等待
AJMP SETOUT;防止键按下时无时钟显示
;FUNSUB,分减 1 程序 ?
FUNSUB:LCALL DS20MS;消抖
JB P1.1,SET41;干扰,返回调分等待
FUNSUB1: JNB P1.1,FUNSUB1;等待键放开
MOV R0,#77H;
LCALL SUB1;分减 1 程序
LJMP SET4;返回调分等待
;
SET41: LJMP SET4;
;FUNSUBB,时减 1 程序;
FUNSUBB:LCALL DS20MS;消抖
JB P1.1,SET61; 干扰,返回调时等待
FUNSUBB1: JNB P1.1,FUNSUBB1; 等待键放开
MOV R0,#79H;
LCALL SUBB1; 时减 1 程序
LJMP SET6; 返回调时等待
;
SET61: LJMP SET6
;***************************************
;;显示程序;;
;***************************************
; 显示数据在70H-75H单元,用六位LED 共阳数码管显示,P0 口输出段码数据,P2口作
;扫描控制,每个 LED 数码管亮 1MS 时间再逐位循环。
DISPLAY: MOV R1,DISPFIRST;指向显示数据首址
MOV R5,#0FEH;扫描控制字初值
PLAY: MOV A,R5;扫描字放入 A
MOV P2,A;从 P2 口输出
MOV A,@R1;取显示数据到 A
MOV DPTR,#TAB;取段码表地址
MOVC A,@A+DPTR;查显示数据对应段码
MOV P0,A;段码放入 P1 口
MOV A,R5;。