1、设计总说明本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它5V直流电源供电。在硬件方面,除了CPU外,使用6个7段LCD显示器来进行显示,LCD采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LCD能够较为准确地显示时、分、秒,利用四个简单的按键实现对时间的调整。软件方面采用汇编语言编程,整个电子钟系统能完成时间的显示、调时、校时和定时的功能。选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。关键词:单片机,LCD,定时器,闹钟目录1设计要求与实现思路-
2、1 -1.1设计要求- 1 -1.2实现思路- 1 -2电子时钟- 2 -2.1电子时钟简介- 2 -2.2电子时钟的基本特点- 2 -3单片机- 3 -3.1程序存储器- 3 -3.2 MCS-51内部数据存储器- 3 -4控制系统的硬件设计- 4 -4.1器件的选择及功能原理- 4 -4.1.1单片机型号的选择- 4 -4.1.2液晶显示器的选择- 4 -4.1.3按键的选择- 4 -4.1.4电源的选择- 5 -4.1.5计时部分的选择- 5 -4.2总体设计思想及原理- 6 -4.2.1时钟电路的设计- 6 -4.2.2键盘电路设计- 7 -4.2.3闹铃功能的实现- 8 -4.2.4
3、中断服务的设计- 9 -4.2.5显示器驱动电路- 9 -4.3整个电路原理图- 10 -5控制系统的软件设计- 12 -5.1程序设计- 12 -5.2程序流程图- 12 -5.3仿真图- 13 -5.4仿真结果分析- 14 -设计总结- 16 -参考文献- 17 -程序源代码- 18 -1设计要求与实现思路1.1设计要求1)基本功能要求为:字符型LCD(16*2)显示器;显示格式为“时时:分分:秒秒”;一旦时间到,发出声响,同时继电器启动,可控制家电开启和关闭。2)程序执行后工作指示灯LED闪烁,表示程序开始执行,LCD显示“00:00:00”,按下列顺序控制:(1)K1键-设置现在时间(
4、2)K2键-设置闹铃时间(3)K3键-显示闹铃设置的时间(4)K4键-定时“开始”按键,启动定时。1.2实现思路电子钟设计与制作可以采用51单片机系列来完成。采用单片机来实现,由于其功能的实现主要通过软件编程来完成,类比于C语言编程。 电子闹钟的系统框图如下所示:复位、时钟等电路按钮电路6位数码管显示电路闹铃声指示电路电源系统图1-1 电子闹钟的系统框图电子闹钟的主电路指的是图1-1中虚线框内部分,主要涉及到CPU电路和按键按钮电路。主机的设计具体地说有:1)系统时钟电路设计;2)系统复位电路设计;3)按键与按钮电路设计;4)闹铃声指示电路设计。2电子时钟 2.1电子时钟简介时钟是将小时、分钟
5、、秒钟显示于人的肉眼的计时装置。而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。2.2电子时钟的基本特点LCD电子定时闹钟是以单片机为基础的数字电路实现对时、分、秒的数字显示的数字计时装置,它的计时周期24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。一个基本的数字钟电路主要由计数器、校时电路、报时电路、振荡器和显示电路组成。目前电子钟广泛用于各种私人和公众场合,成为我们生活、工作和学习中不可缺少的好帮手。3单片机3.1程序存储器MCS-51单片机的程
6、序存储器用于存放应用程序和表格之类的固定常数。可扩充的程序存储器空间最大为64K字节。程序存储器的使用应注意以下两点:(1)整个程序存储器空间可以分为片内和片外两部分,CPU访问片内和片外程序存储器,可由引脚所接的电平来确定。EA=1,即引脚接高电平时,程序将从片内程序存储器开始执行;当PC值超出片内ROM的容量时,会自动转向片外程序存储器空间执行程序;EA=0,即引脚接低电平时,单片机只执行片外程序存储器中的程序。(2)各中断服务程序的入口地址MCS-51单片机复位后,程序存储器PC的内容为0000H,故系统从0000H单元开始取指令,执行程序。64K程序存储器中有5个单元具有特殊用途,如下
7、:0003H:外部中断0入口地址。000BH:定时器0中断入口地址。0013H:外部中断1入口地址。001BH:定时器1中断入口地址。0023H:串行口中断入口地址。在系统中断相应之后,将自动转各中断入口地址处执行序,而中断服务程序一般无法存放于几个单元之内,因此在中断入口地址处往往存放一条无条件转移指令进行跳转,以便执行中断服务程序。3.2 MCS-51内部数据存储器MCS-51单片机的片内数据存储器单元共有128个,字节地址为00H-7FH。 地址为00H-1FH的32个单元是4组通用工作寄存器区,每个区含8个8位寄存器,编号为R7-R0。地址为20H-2FH的16个单元可进行共128位的
8、位寻址。地址为30H -7FH的单元为用户RAM区,只能进行字节寻址。4控制系统的硬件设计4.1器件的选择及功能原理4.1.1单片机型号的选择由于传统的8031单片机内部没有存储器,需要另扩展外部程序存储器,系统构成较为复杂. 在众多的51系列单片机中,要算 ATMEL 公司的AT89C51更实用,它是低功耗、高性能的CMOS型8位单片机。AT89C51采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期。AT89C51集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。另外,AT89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程序存储
9、器和1000次擦写循环,数据保留时间为10年,是最好的选择。AT89C51单片机内部主要有以下部件:8031CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、并行I/O接口、定时器和串行I/O接口。4.1.2液晶显示器的选择 为减少连接线路的复杂性,在此选用八位一体的共阴数码管,八位一体液晶显示器在内部已将段码相连,位选线则相互独立,可以很方便地外接为动态显示电路。其外部结构如下图4-1: 图4-1 LCD液晶显示器4.1.3按键的选择 按键的选择去下: AT89C5的引脚如下图4-2:图4-2 AT89C51引脚4.1.4电源的选择用5V外部稳压电源来供电。4.1.5计时部
10、分的选择用软件编程来实现计时。4.2总体设计思想及原理设计的总思路如图4-3:图4-3 设计的总流程图4.2.1时钟电路的设计AT89C51系列的单片机的时钟方式分为内部方式和外部方式。内部方式就是在单片机的XTAL1和XTAL2的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,
11、即定时时间。本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用。其电路图见图4-4。 图4-4 时钟电路单片机之所以采用高性能的振荡电路,因为:1)单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率精确度直接影响电子钟计时的准确性。 2)片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和
12、重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。4.2.2键盘电路设计键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。 图4-5 独立按键 图4-6 键盘输入电路4.2.3闹铃功能的实现闹铃功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱
13、动器译码驱动,通过六个七段LCD显示器显示出来。闹铃电路根据计时系统的输出状态产生脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。时十位、个位或分十位、个位改变了设置闹铃标志是否设置了闹铃清除闹铃标志判当前时间是设定时间中断返回中断返回闹铃判别处理N 图4-7 闹钟判别流程图考虑到实用性,在该电子钟的设计中修改定时或调整时间时采用了闪烁,而且以定时20组闹钟。在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存
14、储计数的秒,分,时以及定时时间的序号等。在显示程序段中主要进行了闪烁的处理,采用定时器中断置标志位,再与位选相互结合的方法来控制调时或定时中的闪烁。时, 图4-8 闹钟的实现流程图分,秒显示则是用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。初始化之后,用中断方式对其计数,计数的同时采用了定时器比较的方法,比较当前计数时间与定时时间是否相等,若相等则将闹铃标志位置数。由于定义了定时闹钟组,在这里采用中断组次,每中断一次比较一组闹钟,避免了一次比较中断时间过长,影响下次中断时间。显示之后查询闹铃标志位是否与前面所置数相等,若相等则响铃。为了避免响铃影响显示,采用了每显示几屏以后在
15、显示程序中出现脉冲,驱动喇叭,不会影响显示。之后用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。4.2.4中断服务的设计数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。AT89C51有两个通用定时/计数器。两者均可配置为定时器或事件计数器。另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。用作“定时器”功能时,每经过一个机器周期,寄存器值加1。用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T
16、1上每发生一次1到0的跳变时加1。使用该功能时,外部输入每个机器周期被采样一次。 设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到,中断服务流程图如下图4-9。 图4-9 中断处理流程图 4.2.5显示器驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P0口作位码驱动。74LS245是我们常用的芯片,用来驱动LCD或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74L
17、S245等总线驱动器。 由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。因此,可以用来作为驱动装置。图4-10 74LS245引脚图4.3整个电路原理图图4-11 总电路图定时闹钟以单片机AT89C51为核心来完成,使用12MHZ晶振与单片机AT89C51相连接,通过软件编程的方法实现了以24小时为一个周期同时显示小时、分钟和秒的要求,并在计时过程中具有报时功能,当时间到达整点进行蜂鸣报时。在硬件电路中采用P0口作为6位LCD显示器的驱动接口,这是由于P0口输出驱动电路工作
18、处于开漏状态,它的驱动能力强,故只需外接上拉电阻便可以把LCD显示器点亮。因为共阴的LCD显示器它的驱动电流是分开的,在单片机进行动态扫描的时候不会影响彼此的电流,故该电路中的LCD显示器采用共阴极的显示器。6位LCD显示器的位选线分别由相应的P2.0P2.5控制,相应的段选线由8位的I/O口控制,即P0口。该电子钟设有四个按键: S1、S2、S3和S4键(由上至下依次为S1、S2、S3、S4),他们分别与单片机的P1.1、P1.2、P1.3和P1.4口相连接。S1、S2、S3和S4键Proteus仿真图如下:图4-12 安装控制图5控制系统的软件设计 5.1程序设计 该电子钟的设计中修改定时
19、或调整时间时采用了闪烁。在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一个固定单元用来存储计数的秒、分、时。在显示程序段中主要进行了闪烁的处理,采用定时器中断置标志位,再与位选相互结合的方法来控制调时或定时中的闪烁。时、分、秒的显示则是用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。初始化之后,用中断方式对其计数,计数的同时采用了定时器比较的方法,比较当前计数时间与定时时间是否相等,若相等则将闹铃标志位置数。为了避免响铃影响显示,采用了每显示几屏以后在显示程序中出现脉 图5-1 设计主线冲,驱动喇叭,不会影响显示。之后用查询方式对按键进行
20、判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。 5.2程序流程图 图5-2 主函数流程图程序源代码 ORG 0000H ;开辟代码首地址 LJMP MAIN ORG 000BH ;定时器/计数器T0溢出中断服务子程序入口地址 LJMP TIME ORG 0100H MAIN:MOV SP,#50H ;设置堆栈指针首地址 MOV 20H,#00H ;十六进制转化时分秒 MOV 21H,#00H MOV 22H,#00H MOV 23H,#01H ;闹铃设置时分位 MOV 24H,#0
21、1H MOV 25H,#00H ;定义一个标志位 MOV 30H,#00H ;时分秒十进制转化 MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H MOV 35H,#00H MOV 36H,#01H ;闹铃十进制转化 MOV 37H,#00H MOV 38H,#01H MOV 39H,#00H MOV TMOD,#01H ;选用16位计数器 T0,方式1 MOV TH0,#03CH ;赋初值 MOV TL0,#0B0H MOV IE,#10000111B ;开中断T0,EA=1 SETB TR0 ;T0启动计数 MOV R2,#14H ;计数
22、器 MOV P2,#0FFH LOOP:LCALL TIMEPRO ;调用现在时间与闹铃时间比较程序 LCALL DISPLAY1 ;调用现在时间显示子程序 JB K1,M1 ;判断按键是否按下 LCALL XIAOZHEN1 ;调用消抖程序 MOV C,25H.0 JC A1 A1:CLR 25H.0 LCALL SETTIME ;调用设置现在时间子程序 LJMP LOOP M1:JB K2,M2 LCALL XIAOZHEN2 MOV C,25H.0 JC A2 A2:CLR 25H.0 LCALL SETATIME ;调用闹钟设置程序 LJMP LOOP M2:JB K4,M3 A3:L
23、CALL XIAOZHEN3 MOV C,25H.0 JC A4 A4:CLR 25H.0 M3:LJMP LOOPSETTIME: L0:LCALL DISPLAY1 ;闹钟设置子程序 JB K2,L1 LCALL XIAOZHEN4 MOV C,25H.0 JC A5 A5:CLR 25H.0 INC 22H MOV A,22H CJNE A,#18H,GO12 MOV 22H,#00H MOV 34H,#00H MOV 35H,#00H LJMP L0 L1:JB K3,L2 LCALL XIAOZHEN5 MOV C,25H.0 JC A6 A6:CLR 25H.0 INC 21H M
24、OV A,21H CJNE A,#3CH,GO11 MOV 21H,#00H MOV 32H,#00H MOV 33H,#00H LJMP L0 GO11:MOV B,#0AH DIV AB MOV 32H,B MOV 33H,A LJMP L0 GO12:MOV B,#0AH DIV AB MOV 34H,B MOV 35H,A LJMP L0 L2:JB K4,L0 LCALL XIAOZHEN3 MOV C,25H.0 JC AX AX:CLR 25H.0 RETSETATIME:LCALL DISPLAY2 ;调用闹钟设置,闹铃响时的显示程序 N0:LCALL DISPLAY2 JB
25、K3,N1 LCALL XIAOZHEN6 MOV C,25H.0 JC A7 A7:CLR 25H.0 INC 24H MOV A,24H CJNE A,#24,GO22 MOV 24H,#00H MOV 38H,#00H MOV 39H,#00H LJMP N0 N1:JB K1,N2 LCALL XIAOZHEN7 MOV C,25H.0 JC A8 A8:CLR 25H.0 INC 23H MOV A,23H CJNE A,#60,GO21 MOV 23H,#00H MOV 36H,#00H MOV 37H,#00H LJMP N0 GO21:MOV B,#0AH DIV AB MOV
26、 36H,B MOV 37H,A LJMP N0 GO22:MOV B,#0AH DIV AB MOV 38H,B MOV 39H,A LJMP N0 N2:JB K4,N0 LCALL XIAOZHEN3 MOV C,25H.0 JC A9 A9:CLR 25H.0 RETTIMEPRO:MOV A,21H MOV B,23H CJNE A,B,BK MOV A,22H MOV B,24H CJNE A,B,BK SETB 25H.0 MOV C,25H.0 JC XX XX:LCALL TIMEOUT BK:RET TIMEOUT: X1:LCALL BZ LCALL DISPLAY2 C
27、LR 25H.0 JB K4, X1 RET BZ:CLR P3.7 MOV R7,#250 T2:MOV R6,#124 T3:DJNZ R6,T3 DJNZ R7,T2 SETB P3.7 JB K4,XY LCALL XIAOZHEN3 MOV C,25H.0 JC XY1 XY:RET XY1:LJMP LOOPXIAOZHEN1:LCALL DISPLAY1 ;闹钟的设定值与现行时间的对比及响应 JB K1,XIAOZHEN1 MOV C,K1 JC XIAOZHEN1 LCALL DELAY MOV C,K1 JC XIAOZHEN1 STOP1:MOV C,K1 JNC STOP
28、1 LCALL DELAY MOV C,K1 JNC STOP1 SETB 25H.0 RET XIAOZHEN2:LCALL DISPLAY2 JB K2,XIAOZHEN2 MOV C,K2 JC XIAOZHEN2 LCALL DELAY MOV C,K2 JC XIAOZHEN2 STOP2:MOV C,K2 JNC STOP2 LCALL DELAY MOV C,K2 JNC STOP2 SETB 25H.0 RET XIAOZHEN3:LCALL DISPLAY1 JB K4,XIAOZHEN3 MOV C,K4 JC XIAOZHEN3 LCALL DELAY MOV C,K4
29、JC XIAOZHEN3 STOP3:MOV C,K4 JNC STOP3 LCALL DELAY MOV C,K4 JNC STOP3 SETB 25H.0 RET XIAOZHEN4:LCALL DISPLAY1 JB K2,XIAOZHEN4 MOV C,K2 JC XIAOZHEN4 LCALL DELAY MOV C,K2 JC XIAOZHEN4 STOP4:MOV C,K2 JNC STOP4 LCALL DELAY MOV C,K2 JNC STOP4 SETB 25H.0 RET XIAOZHEN5:LCALL DISPLAY1 JB K3,XIAOZHEN5 MOV C,K
30、3 JC XIAOZHEN5 LCALL DELAY MOV C,K3 JC XIAOZHEN5 STOP5:MOV C,K3 JNC STOP5 LCALL DELAY MOV C,K3 JNC STOP5 SETB 25H.0 RET XIAOZHEN6:LCALL DISPLAY2 JB K3,XIAOZHEN6 MOV C,K3 JC XIAOZHEN6 LCALL DELAY MOV C,K3 JC XIAOZHEN6 STOP6:MOV C,K3 JNC STOP6 LCALL DELAY MOV C,K3 JNC STOP6 SETB 25H.0 RET XIAOZHEN7:LC
31、ALL DISPLAY2 JB K1,XIAOZHEN7 MOV C,K1 JC XIAOZHEN7 LCALL DELAY MOV C,K1 JC XIAOZHEN7 STOP7:MOV C,K1 JNC STOP7 LCALL DELAY MOV C,K1 JNC STOP7 SETB 25H.0 RETDELAY:MOV R4,#14H DL00:MOV R5,#0FFH DL11:DJNZ R5,DL11 DJNZ R4,DL00 RETTIME:PUSH ACC PUSH PSW MOV TH0,#03CH MOV TL0,#0B0H DJNZ R2,RET0 MOV R2,#14H
32、 MOV A,20H CLR C INC A CJNE A,#3CH,GO1 MOV 20H,#0 MOV 30H,#0 MOV 31H,#0 MOV A,21H INC A CJNE A,#3CH,GO2 MOV 21H,#0H MOV 32H,#0 MOV 33H,#0 MOV A,22H INC A CJNE A,#18H,GO3 MOV 22H,#00H MOV 34H,#0 MOV 35H,#0 AJMP RET0 GO1:MOV 20H,A MOV B,#0AH DIV AB MOV 31H,A MOV 30H,B AJMP RET0 GO2:MOV 21H,A MOV B,#0A
33、H DIV AB MOV 33H,A MOV 32H,B AJMP RET0 ;长跳转至恢复现场指令 GO3:MOV 22H,A MOV B,#0AH DIV AB MOV 35H,A MOV 34H,B AJMP RET0 RET0:POP PSW POP ACC RETI DISPLAY1:MOV R0,#30H MOV R3,#0FEH MOV A,R3 PLAY1:MOV P2,A ;现在时间分的显示 MOV A,R0 MOV DPTR,#DSEG1 MOVC A,A+DPTR MOV P0,A LCALL DL1 MOV P2,#0FFH MOV A,R3 RL A JNB ACC.6,LD1 INC R0 MOV R3,A LJMP PLAY1 LD1:RETDISPLAY2:PUSH ACC ;响应中断服务子程序 PUSH PSW MOV R0,#36H MOV R3,#0FBH MOV A,R3 PLAY2:MOV P2,A ;现在时间时的显示 MOV A,R0 MOV DPTR,#DSEG1 MOVC A,A+DPTR MOV P0,A LCALL DL1 MOV P2,#0FFH