资源描述
目 录
第1章 引言 1
第2章 整体设计思路 2
第3章 电路设计 3
3.1整体设计 3
3.2 分块设计 4
3.2.1 键盘电路设计 4
3.2.2 显示电路 5
3.2.3 复位电路: 6
3.2.4蜂鸣器电路设计 7
3.2.5按键电路设计 8
第4章 程序设计 9
4.1程序思路 9
4.2程序设计步骤 9
4.3程序的主要模块 10
4.3.1延迟程序 10
4.3.3 主程序 13
4.3.4显示程序 14
第5章 功能仿真 15
5.1仿真过程: 15
5.1.1仿真图的绘制 15
5.1.2功能的实现 16
第6章 电子钟设计中遇到的问题及其解决方法 18
心得体会 19
参考文献 20
附录A 整体电路图 21
附录B.源程序清单: 22
电气信息学院课程设计评分表 35
第1章 引言
现在是一个信息的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。电子技术的应用波及到了各个领域,无处不在,无所不能,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化钟表给人们带来了极大的方便。
本课题的主要内容就是结合单片机的强大功能,在一块普通的电子时钟集成多种功能,方便人们的日常生活,该功能是通过单片机、8断数码管以及一些简单辅助电路实现的。由于之前没有做过单片机实现多功能电子时钟方面的内容,所以在做设计时总遇到了很多问题。
近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用而来石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
第2章 整体设计思路
针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第3章 电路设计
3.1整体设计
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用六个数码管分别显示小时、分钟和秒,通过动态扫描进行显示,从而避免了译码器的使用,使电路更加简单。单片机采用AT89C51系列,这种单片机应用简单,适合电子钟设计。
电路的总体设计框架如下:
单片机
输入部分
晶振和复位
输出部分
图3.1 电路模块图
3.2 分块设计
这部分主要分为:键盘电路设计、显示电路、复位电路、蜂鸣器电路设计、按键电路设计。
3.2.1 键盘电路设计
在电子钟的键盘电路设计中,设置相应的置数功能,通过外部设备的输入,如按键,实现时间的修改。除此之外,调整闹铃也需要按键进行输入。在选用输入端口时,将P3引脚与按键相连进行输入。
图3.2 键盘电路设计
3.2.2 显示电路
图3.3 显示部分
在实际电路中采用单个数码管相连进行显示,先把数码管的1、2、4、5、6、7、9、10对应相连,然后把各晶体管的3和8引脚各自相连,P1.6~P1.0分别接a~g,P2作为选通端P2.0~P2.5分别从左到右接各数码管的3、8端。采用动态显示, 即一位一位地轮流点亮各位显示器,因此P2.0~P2.5轮流置0。持续时间为1ms。
3.2.3 复位电路:
图3.4 复位电路
单片机的RST管脚为主机提供一个外部复位信号输入端口。复位信号是高电平有效,高电平有效的持续时间应为2个机器周期以上。
但前几的复位方式有上电自动复位和手工复位两种。图3.4所示是51系列单片机常用的上电复位和手动复位组合电路,只要VCC上升时间不超过1ms,它们都能很好的工作,复位以后,单片机内各部件恢复到初始状态。
3.2.4蜂鸣器电路设计
图3.5 蜂鸣电路
设计要求定时(闹钟)时间到时要有声音提醒信号产生,可选择一只蜂鸣器来实现这一功能。压电式蜂鸣器(H)工作时约需10mA的驱动电流,并设计一个相应的驱动及控制电路,电路设计如图3.5所示。蜂鸣器作为三极管VT的集电极负载,当VT导通时,蜂鸣器发出鸣叫的声音;VT截止时,蜂鸣器不发声。R是限流电阻。
蜂鸣器电路与单片机的接口:VT的基极接到单片机P3口的P3.7管脚,P3.7管脚作为输出口使用。当P3.7=0时,VT导通时,使蜂鸣器的两个管脚间获得将近5V的直流电压,蜂鸣器中有电流流过,而产生蜂鸣音;当P3.7=1时,VT截止,蜂鸣器的两管脚间的直流电压接近于0V,蜂鸣器不发出声。
3.2.5按键电路设计
图3.6 键盘接口电路图
(1)电子时钟应用系统工作应具备两项基本功能,一是随时输入定时(闹钟)时间;二是随时对当前时间进行调整。要实现这一功能,可以接入接盘输入电路。
(2)本例只需要7个按键,因此选择独立式键盘。如图3.6所示,电路由按键和接地组成,按键可以采用轻触开关,按键分别命名为K1,K2,K3,K4,K5,K6,K7.并通过它来实现控制LED数码管动态扫描来实现时间显示功能和时间调整。
(3)按键去抖动的处理 由于机械点的弹性作用,在闭合及断开的瞬间均伴随一连串的抖动,而按键稳定闭合时间的长短由操作人员的按键动作决定的,一般为零点几秒至数秒。而这里采取软件去抖动法。
第4章 程序设计
4.1程序思路
程序的总体思路是:
1、点复位键后,进行时间显示,从0时0分0秒开始。
2、按下按键1时,进行调时,此时按下4调整时,按下5调整分,若2秒钟未按键,则不再等待,恢复走时,持续按键时大约0.3秒步进1,下同。
3、按下2键时进行闹铃调整,用4、5键分别调时和分,此时只有前四位进行显示,即闹铃功能精确到分,2秒钟无按键则返回时间显示,时间到达闹铃所定时间时P0.7输出高电平,蜂鸣器响,按下按键2或3时蜂鸣器停止。
4、按3键时进行定时的设定,同样,分别通过4、5调整分和秒,若两秒未按键则不进行定时,设定之后再次按下3键则进行倒计时,倒计时时间未到时若按下1键则进行时间显示;若倒计时时间到则P0.7为高电平,蜂鸣器响。定时的最大值为59分59秒。
在程序设计时,尽量改进算法,算法的改进可以使相对误差减小,或者可以使占用空间减小。另外,分块的设计思想要贯穿始终,整个程序较为繁杂,某些程序段会反复用到,因此采取的方法是写出多个程序段,通过跳转指令进行调用。
4.2程序设计步骤
在程序设计过程中,我遇到了很多困难,这部分也是让我学到很多东西的地方。
首先,我学习了定时器的相关知识,计数器的使用是很重要的组成部分,在这个设计中选择计数器T0。T0的工作方式有:
方式0:不推荐
方式1:16位计数器,常用
方式2:自动重装初值的8位定时/计数器
方式3:T0相当于两个独立的8位定时/计数器
此程序采用方式1,方式1的定时时间t为t=(216-M)*12/fosc。其中M为定时器初值,若M为0则t=65536*12/2*106=65.536ms。因此可取50ms为计时单位,初值M应为50*10-3*106=216-M。M=15536=11110010110000=3CB0。即定时器初值为TH0=03CH,TL0=0B0H。定时器中断20次为一秒,这部分在中断程序中用到。
其次,我参看了文献中的设计思路,做到胸有成竹后再进行具体的程序书写工作。认真学习了教科书中关于汇编语言编程的问题,熟悉了汇编语言的编程方法和语法习惯。
第三步就是进行具体的程序编写工作。
4.3程序的主要模块
4.3.1延迟程序
在动态扫描时,必然用到延迟程序,这里使用延迟1ms的程序,此程序需要反复调用。此段程序是很简单的,但就是在这段简单的程序上,也会出现问题,若用
D_1MS:
MOV R7,#500
DJNZ R7,$
RET
则会出现警告,因为R7是8位寄存器,所能存储的最大值应为255,所以应改为:
D_1MS:
MOV R7,#2
D_5:
MOV R2,#250
DJNZ R2,$
DJNZ R7,D_5
RET
4.3.2 中断服务子程序:
中断服务程序中,总体思路是:由于初值是3CB0H,所以装满定时器需要50ms的时间,从而20次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。另外,由于要实现倒计时功能,因此在中断程序中还要加入减1的寄存器,需要时将其进行显示。基于以上考虑,以R3为倒计时中的秒,R4为倒计时的分,当秒加1时R3减1,减到0之后,秒赋值为59,分减1,直到分为0。再显示走时部分。
流程框图如下:
给T0赋值
中断20次
R3赋值为60
分=0,秒=0,时加一
秒加一
R3、R4都为0时倒计时结束,蜂鸣器响,显示走时状态
秒=60
Y
秒=0时加1
N
时=24
分=60
Y
N
Y
N
分=0,秒=0,时=0
返回
R3=0
Y
R3、R4减一
N
图4.1 中断程序思路
4.3.3 主程序
主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用声音程序,该段程序如下:
MAIN:
JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整
JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时
JNB P3.2,NLTZ1;按下2键进行闹铃设置
JNB P3.3,DSTZ;按下3键进行定时设置
ACALL DISP;
MOV A, HOUR;
SUBB A, 38H;
JZ FEN;
AJMP DSPD2;
FEN:
MOV A, MINUTE;
SUBB A, 37H;
JZ SHENGYIN1;
DSPD2:
MOV A, R4;
JZ S_PD;
AJMP MAIN;
S_PD:
MOV A, R3;
JZ SHENGYIN1;
AJMP MAIN;
4.3.4显示程序
6个晶体管轮流进行显示,分别显示1ms,这依赖的是人们视觉的惰性,该段程序如下:
DISP:;走时的显示程序,包括调时时的显示
MOV DPTR,#LEDTAB
MOV A,SECOND
MOV B,#10
DIV AB;A存十位B存个位
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_S
ACALL D_1MS;显示秒十位
SETB SEC_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_G
ACALL D_1MS;显示秒个位
SETB SEC_G
……
以此类推,进行时和分的显示
第5章 功能仿真
这部分工作可能遇到的困难是很多的,程序庞大很可能出现各种问题。在仿真工作中,首先要对仿真软件有足够的了解并能够正确熟练地运用。
5.1仿真过程:
通常在仿真过程中会遇到很大的麻烦。在程序汇编通过之后程序不一定是正确的,比如我刚开始进行仿真时数码管并不进行显示,结果发现应该是置0的置1了,应该置1的置0了。改正之后发现虽然走时程序正常了,但是调时中出现了大量的问题,更不要说闹铃和定时程序了。在整个毕业设计的过程中程序的修改贯穿始终,在修改的过程中一定要条理清晰,认真细心。
5.1.1仿真图的绘制
在使用Proteus进行仿真时,仿真图不用画出数码管驱动程序,其他部分与设计的硬件图相仿。绘制结果如下:
图5.1 仿真图
5.1.2功能的实现
在绘制仿真图之后,要向单片机装入程序,从而使单片机开始工作并带动整个电路工作,装入过程为:点击单片机,选择所编译程序的输出hex文件,确定即可。此时单片机会按照程序所设定的功能进行工作,在仿真过程中会遇到各种问题。这里列出仿真结果:
(1)走时仿真:
图5.2 走时状态下的仿真结果
(2)闹钟设定的仿真:
图5.3 闹铃仿真结果。
第6章 电子钟设计中遇到的问题及其解决方法
在电子钟设计中程序比较长,遇到了各种各样的问题,比如跳转距离过长出现语法错误。因此修改程序的时间很长,有语法错误,也有仿真时功能无法实现的问题,在此不能一一说明,只能对个别问题加以阐述。
由于在走时调整、闹铃调整及定时设定时,按下键时每0.2秒步进1,这就需要每0.2秒对按键输入进行一次扫描,因此开始时,我用的是延迟0.2秒再返回按键扫描程序的方法,但是可以想到,进行单纯的延迟时,不会有显示,在仿真时功能没有实现。后来我采用的是反复调用若干次显示程序以实现延迟,较好地解决了这个问题。虽然现在回过头来发现这个问题很简单,但当时是百思不得其解。我从中学到:任何简单的事情都会有出错的可能,有些时候人的思路中的一些错误是自己难以发现的,在工作和生活中要多对自己的想法提出质疑。
不光是这种明显的问题很多,有些细微的问题也一样出现了,但解决起来并不容易。
在最后阶段发现蜂鸣器不响,此时连接方法是蜂鸣器直接连接在了P0.7引脚。考虑到单片机的输出电流比较小,虽然P0.7引脚的电平已经达到2V以上,也无法驱动蜂鸣器。于是我设想加上驱动电路。作此修改之后,蜂鸣器发出响声。
当然这个解决问题的过程不是一下子解决的在这个过程中,我进行了相当多的尝试和摸索,最终找到了解决途径。,蜂鸣器就不会再响了。
心得体会
回顾起此次单片机课程设计,让我感慨良多,从选题到定稿,从理论到实践,在整整两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多书本上所没有学到过的知识。
两周以来,整日埋头于电路程序的设计,分析,组装,绘制,仿真,总结以及打印材料等工作,。其实一开始真不知道该从何入手,短短几天内,在各位老师的耐心知道和同学的帮助之下,开始在脑海里有了大致的模块,就这样整天埋在图书馆,面对电脑搜索资料,一块一块的电路慢慢拼成,于是又开始查找相关的资料,分析电路,根据自己的目的有效地编制程序,对比之下有进一步的完善,在形成电路大致模块下又进一步尽可能的减小成本,知道最终电路以自己最理想的形式出现。
在本次设计的过程中,我发现很多的问题,单片机课程设计的重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉得写好一个程序不是一件简单的事情。
通过这次实习,我真正学到了不少东西,真正体会到了理论联系实际的重要性。课堂教学考虑到大多数同学的需求,主要强调基本知识,基本理论,基本方法,基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
参考文献
1 潘永雄.新编单片机原理与应用. 第2版.西安:西安电子科技大学出版社2006
2 何立民.我国单片机应用技术发展趋势及展望.自动化与仪表
3 向继文,廖立新.基于AT89S51 的电子钟系统设计.机电产品开发与创新,2007
4 张静.基于单片机数字钟的设计.办公自动化杂志,2006
5 樊金荣,谢智文.数字倒计时秒表的设计与实现.中南民族大学计算机科学学院院报,2005
6 魏立峰,王宝兴.单片机原理与应用技术[M].北京:北京大学出版社,2006.
7 马立国. AD7888与AT89C51单片机接口应用技术.集成电路通讯,2007
8 周兴华.一款电路极简的单片机电子钟设计详解.电子制作,2003
9 郭长立.DDJ-Ⅱ型多功能单片机计时器的改进设计.仪表技术,2004
附录A 整体电路图
图附A
附录B.源程序清单:
MS5 EQU 30H ;5ms定义单元
SHI EQU 31H ;时单元定义
FEN EQU 32H ;分单元定义
MIAO EQU 33H ;秒单元定义
BUF EQU 34H ;从34H开始连续存放时十位,时个位,一杠,分十位,分个位…………
HH EQU 40H ;闹钟小时
FF EQU 41H ;闹钟分
MM EQU 42H ;闹钟秒
DENG BIT P3.5 ;闹钟指示灯
BIAOZ BIT P3.6 ;开关闹钟
SPK BIT P3.7 ;蜂鸣器
ALB EQU 20H.0 ;闹钟标志
K1 BIT P1.0
K2 BIT P1.1
K3 BIT P1.2
K4 BIT P1.3
K5 BIT P1.4
K6 BIT P1.5
K7 BIT P1.6
MOV SP,#60H
;--------------------------------------------
ORG 00H
AJMP MAIN
ORG 0BH
AJMP TIME0
MAIN:
SETB DENG
CLR ALB
ACALL CHUSHI
ACALL INTO
LOOP:
ACALL NAOPRO
ACALL CONV
ACALL DISPLAY
JB K6,LOOP1
ACALL BIAO
SJMP LOOP
LOOP1:
JB K1,LOOP2
ACALL SETTIME
SJMP LOOP
LOOP2:
JB K4,LOOP3
ACALL SETNAO
SJMP LOOP
LOOP3:
JB K7,LOOP
ACALL RST
SJMP LOOP
;------------------------------------------------------------
CHUSHI: ;设置初始时间
MOV SHI,#0
MOV FEN,#0
MOV MIAO,#0
MOV MS5,#0
MOV HH,#0 ;闹钟初始值
MOV FF,#0
MOV MM,#0
RET
;------------------------------------------------------------
INTO: ;定时器T0初始化
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
MOV IE,#82H
SETB TR0
RET
;--------------------------------------------------------------------
TIME0: ;中断服务
PUSH ACC
MOV TL0,#(65536-49980)MOD 256 ;考虑到软件因素 减少赋定时器为49980
MOV TH0,#(65536-49980)/256
INC MS5
MOV A,MS5
CJNE A,#20,TT1
MOV MS5,#0
INC MIAO
MOV A,MIAO
CJNE A,#60,TT1
MOV MIAO,#0
INC FEN
MOV A,FEN
CJNE A,#60,TT1
MOV FEN,#0
INC SHI
MOV A,SHI
CJNE A,#24,TT1
MOV SHI,#0
MOV FEN,#0
MOV MIAO,#0
TT1:
POP ACC
RETI
;--------------------------------------------------------
CONV: ;转换子程序
MOV A,SHI ;转换小时 存到34 35H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+1,A
MOV A,FEN ;转换分 存到36 37H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF+3,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+4,A
MOV A,MIAO ;转换秒 存到38 39H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF+6,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+7,A
MOV BUF+2,#0BFH ;第三个位置显示一杠
MOV BUF+5,#0BFH ;第五个位置显示一杠
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;阳码表
;-------------------------------------------------------------------
DISPLAY: ;显示子程序
MOV R1,#BUF
MOV A,#01H
MOV R2,#8
Dp1:MOV P2,A
PUSH ACC
MOV A,@R1
MOV P0,A
ACALL DELAY
POP ACC
RL A
INC R1
CJNE R1,#BUF+8,DY
MOV R1,#BUF
DY:DJNZ R2,Dp1
RET
;------------------------------------------------------------------
BIAO:CPL ALB ;闹钟开关
CPL BIAOZ
BIAO1:ACALL CONV
ACALL DISPLAY
JNB K6,BIAO1
RET
;---------------------------------------------------------------------
SETTIME: ;设置时间
CLR TR0
TT:ACALL DISPLAY ;设置小时
TS:JNB K1,TT
TSS:ACALL DISPLAYS
JNB K1,TF
JNB K2,JIAS
JNB K3,JIANS
JNB K5,QUE
SJMP TSS
JIAS:INC SHI ;加时子程序
MOV A,SHI
CJNE A,#24,K2S
MOV SHI,#0
K2S:ACALL CONV
ACALL DISPLAY
JNB K2,K2S
SJMP TSS
JIANS:DEC SHI ;减时子程序
MOV A,SHI
CJNE A,#255,K3S
MOV SHI,#23
K3S:ACALL CONV
ACALL DISPLAY
JNB K3,K3S
SJMP TSS
QUE:ACALL BZ
SETB TR0
QQ:ACALL CONV
ACALL DISPLAY
JNB K5,QQ
LJMP LOOP
;------------------------------------------------
TM:ACALL DISPLAY ;设置秒
JNB K1,TM
TMM:ACALL DISPLAYM
JNB K1,TS
JNB K2,JIAM
JNB K3,JIANM
JNB K5,QUE
JMP TMM
JIAM:INC MIAO ;加秒
MOV A,MIAO
CJNE A,#60,K2M
MOV MIAO,#0
K2M:ACALL CONV
ACALL DISPLAY
JNB K2,K2M
JMP TMM
JIANM:DEC MIAO ;减秒
MOV A,MIAO
CJNE A,#255,K3M
MOV MIAO,#59
K3M:ACALL CONV
ACALL DISPLAY
JNB K3,K3M
JMP TMM
;-------------------------------------------------------------
TF:ACALL DISPLAY ;设置分钟
JNB K1,TF
TFF:ACALL DISPLAYF
JNB K1,TM
JNB K2,JIAF
JNB K3,JIANF
JNB K5,QUE
JMP TFF
JIAF:INC FEN ;加分钟
MOV A,FEN
CJNE A,#60,K2F
MOV FEN,#0
K2F:ACALL CONV
ACALL DISPLAY
JNB K2,K2F
JMP TFF
JIANF:DEC FEN ;减分钟
MOV A,FEN
CJNE A,#255,K3F
MOV FEN,#59
K3F:ACALL CONV
ACALL DISPLAY
JNB K3,K3F
JMP TFF
;------------------------------------------------------------
DISPLAYS: ;时闪子程序
MOV R3,#20
DISS:MOV R1,#BUF+2
MOV A,#04H
MOV R2,#6
ACALL DP1
DJNZ R3,DISS
MOV R3,#20
DIS2:MOV R1,#BUF
MOV A,#01H
MOV R2,#8
ACALL DP1
DJNZ R3,DIS2
RET
DISPLAYF: ;分闪子程序
MOV R3,#20
DISF:MOV R1,#BUF+5
MOV A,#20H
MOV R2,#6
ACALL DP1
DJNZ R3,DISF
MOV R3,#20
ACALL DIS2
RET
DISPLAYM: ;秒闪子程序
MOV R3,#20
DISM:MOV R1,#BUF
MOV A,#01H
MOV R2,#6
ACALL DP1
DJNZ R3,DISM
MOV R3,#20
ACALL DIS2
RET
;-------------------------------------------------
SETNAO: ;设置闹钟时间
TTN:ACALL CONVNAO
ACALL DISPLAY ;闹设置小时
TSN:JNB K4,TTN
TSSN:ACALL DISPLAYS
JNB K4,TFN
JNB K2,JIASN
JNB K3,JIANSN
JNB K5,QUEN
SJMP TSSN
JIASN:INC HH ;闹加时子程序
MOV A,HH
CJNE A,#24,K2SN
MOV HH,#0
K2SN:ACALL CONVNAO
ACALL DISPLAY
JNB K2,K2SN
SJMP TSSN
JIANSN:DEC HH ;闹减时子程序
MOV A,HH
CJNE A,#255,K3SN
MOV HH,#23
K3SN:ACALL CONVNAO
ACALL DISPLAY
JNB K3,K3SN
SJMP TSSN
QUEN:ACALL BZ
SETB TR0
LJMP LOOP
;------------------------------------------------
TMN:ACALL CONVNAO
ACALL DISPLAY ;闹设置秒
JNB K4,TMN
TMMN:ACALL DISPLAYM
JNB K4,TSN
JNB K2,JIAMN
JNB K3,JIANMN
JNB K5,QUEN
JMP TMMN
JIAMN:INC MM ;闹加秒
MOV A,MM
CJNE A,#60,K2MN
MOV MM,#0
K2MN:ACALL CONVNAO
ACALL DISPLAY
JNB K2,K2MN
JMP TMMN
JIANMN:DEC MM ;闹减秒
MOV A,MM
CJNE A,#255,K3MN
MOV MM,#59
K3MN:ACALL CONVNAO
ACALL DISPLAY
JNB K3,K3MN
JMP TMMN
;-------------------------------------------------------------
TFN:ACALL CONVNAO
ACALL DISPLAY ;闹设置分钟
JNB K4,TFN
TFFN:ACALL DISPLAYF
JNB K4,TMN
JNB K2,JIAFN
JNB K3,JIANFN
JNB K5,QUEN
JMP TFFN
JIAFN:INC FF ;闹加分钟
MOV A,FF
CJNE A,#60,K2FN
MOV FF,#0
K2FN:ACALL CONVNAO
ACALL DISPLAY
JNB K2,K2FN
JMP TFFN
JIANFN:DEC FF ;减分钟
MOV A,FF
CJNE A,#255,K3FN
MOV FF,#59
K3FN:ACALL CONVNAO
ACALL DISPLAY
JNB K3,K3FN
JMP TFFN
;---------------------------------------------
RST: ;复位
MOV SHI,#0
MOV FEN,#0
MOV MIAO,#0
MOV MS5,#0
RET
;---------------------------------------------
NAOPRO: ;检查闹钟
JB ALB,TI3
RET
TI3:MOV A,SHI
MOV B,HH
CJNE A,B,BK
MOV A,FEN
MOV B,FF
CJNE A,B,BK
MOV A,MIAO
MOV B,MM
CJNE A,B,BK
ACALL TIMEOUT
BK:RET
;--------------------------------
CONVNAO: ;转换子程序
MOV A,HH ;转换小时 存到34 35H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+1,A
MOV A,FF ;转换分 存到37 38H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF+3,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+4,A
MOV A,MM ;转换秒 存到40 41H
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV BUF+6,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+7,A
MOV BUF+2,#10111111B ;第三个位置显示一杠
MOV BUF+5,#10111111B ;第五个位置显示一杠
RET
;----------------------------------
TIMEOUT: ;闹钟指示灯亮
MOV R0,#30
X4:MOV R3,#2
X3:MOV R4,#10
X1:CPL DENG
ACALL CONV
JB K5,X9
SJMP X6
X9:ACALL DISPLAY
DJNZ R4,X1
JB K5,X8
SJMP X6
X8:ACALL BZ
DJNZ R3,X3
JB K5,X7
SJMP X6
X7:MOV R4,#95
X2:CPL DENG
ACALL CONV
JB K5,X10
SJMP X6
X10:ACALL DISPLAY
DJNZ R4,X2
DJNZ R0,X5
SETB DENG
LJMP LOOP
X5:JB K5,X4
X6:SETB DENG
RET
;---------------------------------------------
BZ: ;蜂鸣器
MOV R5,#100
BZ2:CPL SPK
ACALL DELAYB
DJNZ R5,BZ2
RET
DELAYB: ;蜂鸣延时1MS
MOV R6,#2
DLB:MOV R7,#98
DJNZ R7,$
DJNZ R6,DLB
展开阅读全文