
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次设计中以单片机的发展过程和发展方向为背景,介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法,74LS1译码器的工作原理和与LED连接的方法。
本次做的数字钟是以单片机(ATC51)为核心,结合相关的元器件(共阴极LED数码显示器、数码管驱动器74LS1等),再配以相应的软件,是它具有星期,时,分,秒显示的功能,并且时,分,秒还可以调整。此次设计电子数字钟是为了了解电子数字钟的原理,从而学会制作电子数字钟。而且通过电子数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。通过它可以进一步学习与掌握单片机原理与使用方法。
关键词:单片机ATC51 共阴极LED数码显示器 74LS1驱动芯片
二、系统总体方案设计
本次设计课题为智能电子数字时钟的设计,采用ATC51单片机内部定时器实现数字时钟的定时功能,采用单片机的串口和74LS1扩展并口实现LED静态驱动。电子时钟系统的整体框图如图2-1所示。
图2-1 电子时钟的整体框图
2.1主控芯片ATC51简介
ATC51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位处理器和ISP Flash存储单元,功能强大的微型计算机的ATC51可为许多嵌入式控制应用系统提供高性价比的解决方案。其引脚图如图2-2所示。
图2-2 ATC51引脚图
2.2.电子时钟功能及工作原理
2.2.1电子时钟功能及方案介绍
电子时钟设置6个按键通过程序控制来完成电子时钟的启、停及时间调整。调整时钟时只设计了星期加键、时加键、分加键以及秒加键,没有设置减秒减分减时键,可通过循环调节得到正确的调节数值。
S/T键控制电子时钟的启、停; H键调整时;
M键调整分; S键调整秒;
W键设置星期; RES键复位键。
可调整运行的电子时钟具有三种工作状态:“P.”状态、运行状态、调整状态。
(1)“P.”状态,依靠上电或按复位键RES进入。在此状态下,按W、H、M、S键均无效,按S/H键有效,进入运行状态;
(2)运行状态,按奇数次S/H键进入。在此状态下,按W、H、M、S键均无效,只有按S/H键有效,按下S/H键后,退出运行状态,进入调整状态;
(3)调整状态,按偶数次S/H键进入。在此状态下,按S/H、W、H、M、S键均有效,如按下S/H键,则退出调整状态,进入运行状态;按下W、H、M、S键,则分别对星期、时、分、秒加1,调整结束后必须按S/H键,即可退出调整状态,进入运行状态;
基本功能要求:“P.”稳定地显示在LED显示器的最左端数码管(LED6)上,无S/H键按下(在“P.”状态下,按下W、H、M、S键无效),则不进入电子时钟的运行状态,继续显示“P.”。按下S/H 键后,电子时钟以起始时间:0星期00时00分00秒开始运行。再次按下S/H 键后,电子时钟退出运行状态,进入调整状态,利用W、H、M、S键把电子时钟的显示时间修改为当前实时时间,时间修改正确后可再次按下S/H键,电子时钟则退出调整状态,进入运行状态。
计时方案:利用ATC51单片机内部的定时/计数器进行中断定时,配合软件延时实现星期、时、分、秒的计时。
键盘/显示方案:ATC51的P3.0、P3.1口外接一个74LS1扩展芯片,用74LS1芯片的八个端口作LED的段码输出口。采用静态显示方式,通过对LED八个端口输入的不同的二进制数据使得它的时间显示也不同,从而可以得到我们所要的时间显示。对于四十个管脚的ATC51来说,LED八个段选管脚太多,于是我选用74LS1芯片来扩展主芯片的管脚。74LS1是数据移位寄存器,具有串行输入,并行输出的特点。
P0.0~P0.4端外接五个按键S/H、W、H、M、S,S/H键控制电子时钟的启、停,W、H、M、S键分别调整星期、时、分、秒。RST口接一个复位键RES,当发现系统运行不正常,进入死循环,显示数值严重失真时,按复位键,其内部功能为使单片机复位,强行使单片机从头开始运行,跳出出错区。
2.2.2时钟计时的基本方法
利用ATC51单片机的可编程定时/计数器、中断系统来实现时钟计数。
(1)计数初值计算:把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而计数可用软件方法实现。假设使用T/C0,方式1,50ms定时,fosc=12MHz。则初值X满足(216-X)×1/12MHz×12μs =50000μs
X=15536→0011110010110000→3CB0H,则TH0=3CH,TL0=0BOH。
(2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒),就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数;
(4)从秒到分,从分到时和从时到星期的计时是通过累加和数值比较实现。
2.2.3电子时钟的时间显示
电子时钟的时钟时间在7个数码管上进行显示,因此,在内部RAM中设置显示缓冲区共7个单元,数据存放在30H-37H内存单元中。其中30H、31H单元存放秒数据,32H-33H单元存放分数据,34H-35H单元存放时数据,36H单元存放星期数据。如表2-1所示。
表2-1数码管的数据存储表
| LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 |
| 36H | 35H | 34H | 33H | 32H | 31H | 30H |
| 星期 | 时十位 | 时个位 | 分十位 | 分个位 | 秒十位 | 秒个位 |
本系统共有两部分构成,其中硬件部分由电源输入部分、晶振部分、键盘输入部分、复位部分、显示部分、定时部分组成,软件部分对应的由主程序、初始化程序、LED显示程序、键盘扫描程序、键功能程序、定时中断程序等组成。单片机上位复电后,从头开始执行程序,时钟频率由外部晶振频率提供。单片机控制整个装置的运行,对时钟芯片初始化;读时钟芯片;判断时钟芯片是否更新;对驱动芯片74LS1操作及数码管的显示;键盘扫描等。
3.1电子时钟电路原理图
电子时钟的电路图由电源输入电路、晶振电路、键盘输入电路、复位电路等电路组成。本系统采用ATC51单片机作为主控制芯片,LED显示采用了静态扫描方式实现,采用共阴极数码管,由芯片74LS1进行驱动。为了提高计时精度,所采用的晶振频率为12MHz。
电子时钟原理图 (见附录)。
3.2电源输入的电路原理图
电子时钟主控制部分电源需要用5V直流电源供电,把频率为50Hz、有效值为220V过电源变压器、整流电路、滤波电路、稳压电路转换成稳定的直流电压。 由于输入电压为电网电压,一般情况下所需直流电压的数值和电网电压的有效值相差较大,因而电源变压器的作用显现出来起到降压作用。降压后还是交流电压,所以需要整流电路把交流电压转换成直流电压。由于经整流电路整流后的电压含有较大的交流分量,会影响到负载电路的正常工作。需通过低通滤波电路滤波,使输出电压平滑。稳压电路的功能是使输出直流电压基本不受电网电压波动和负载电阻变化的影响,从而获得稳定性足够高的直流电压。本电路使用集成稳压芯片7805解决了电源稳压问题,如图3-1所示。
图 3-1 电源输入的电路原理图
3.3晶振电路
晶振电路如图3-2所示。XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
图3-2 晶振电路的电路图
3.4 整点报时电路
3.4.1报时电路的原理
(1)生活中我们常常到各种各样的报警声,例如“嘀、嘀、…”就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为1KHz,则报警声时序图如图3-3所示:
图3-3报警声时序图
(2)由于要产生上面的信号,把上面的信号分成两部分,一部分为1KHZ方波,占用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时间了。
3.4.2电路的接法
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。第一级为差分放大电路,使用镜像电流源作为差分放大电路有源负载,可使单端输出电路的增益近似等于双端输出电容的增益;第二级为共射放大电路,以增大放大倍数;第三级可以消除交越失真。
(1)把“单片机系统”区域中的P3.4端口用导线连接到“音频放大模块LM386”区域中的SPK IN端口上。
(2)在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧的喇叭;
图 3-4 报时电路原理图
3.5 键盘输入电路
键盘可分为两类:非编码键盘和编码键盘;常见的非编码键盘有两种结构:式键盘和矩阵式键盘。本设计采用式键盘作为电子时钟的按键。单片机P1.0-P1.4接按键S/H、W、H、M、S,RET接按键RES。按键电路如图3-5所示。
图3-5 按键电路
四、系统软件设计
4.1电子时钟程序流程框图
4.1.1主程序流程框图
主程序功能主要是初始化、正常显示时间和判断功能转换键。初始化包括数据堆栈区、定时/计数器的初始化、ATC51芯片的初始化及时间、显示数据的初始化。定时/计数器的初始化:包括对TMOD、TCON以及根据定时时间对时间初值的设置。显示时间调用显示子程序。当P1.0端口的S/H键按下时,转入调时功能。主程序流程图如图4-1所示。
图4-1 主程序流程框图
4.1.2键扫子程序流程框图
键盘扫描程序是通过CPU来对外围键盘电路进行查询。该程序能够解决的问题有:
(1)是否有键按下;
(2)若有键按下,判断是哪一个键并确定其键值或键号;
(3)去抖动:一个电压信号是通过机械触点的闭合、断开过程来实现信号传递的。抖动时间一般为5~10ms。按键的稳定闭合期为几百毫秒到几秒钟时间。为了保证CPU对按键闭合仅做一次键输入处理,必须去除抖动影响,通常硬件或软件延时10ms处理。
去抖之后再次进行查询。然后通过按键的键号执行相应的功能。键扫子程序流程框图图4-2所示。
图4-2 键扫子程序流程框图
4.1.3定时中断程序流程框图
定时中断是电子时钟的核心。定时/计数器T0和T1的工作方式设置为:
(1)T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。
(2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
时钟的最小计时单位是秒,60s进位为1min,60min进位为1h,24h进位为1天。T0用于产生最小单位1s,定时时间为50ms,中断累计20次即为1s。计数单元中每逢60进位。定时中断程序流程如图4-3所示。
图4-3 中断服务程序流程框图
4.1.4调时程序流程框图
进行时间调整时,正在被调整的时间的间隔符以闪烁的形式表现。调整时间的方法是:按下S/H键,进入调时状态,按下W键,星期单元加1,加至8时变为1(7过后即显示1,不显示8);按下H键,时单元加1,在加至24时变为00(23过后即显示0,不显示24);按下M键,分单元加1,加至60时变为00(59过后即显示00,不显示60);按下S键,秒单元加1,秒如分一样,加至60时变为00,在调节好时间后,按下S/H键,保存操作者对时钟时间的修改并退出调时模式进入正常运行状态,时间正常显示。调时程序流程图如图4-4所示。
W键按下
4.2 程序清单
本设计的程序主要采用大学所学的知识,参考课本《单片机原理及应用》一书,编写而成。汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。
程序当中包含P点显示、键扫子程序、键功能子程序、显示程序、中断定时程序等一些子程序,并且在程序中添加了适当的标注。
;主程序
ORG 0000H ;复位起始地址
AJMP START ;跳转至主程序
ORG 000BH ;TIMER0中断矢量地址
AJMP TIMER0 ;跳转至T0中断子程序
START: MOV SP,#6FH ;设置堆栈从6F开始
MOV 30H,#00H ;显示码寄存器初值为00H
MOV 2AH,#00H ;'天'寄存器初值为00H
MOV 2BH,#00H ;'时'寄存器初值为00H
MOV 2CH,#00H ;'分'寄存器初值为00H
MOV 2DH,#00H ;'秒'寄存器初值为00H
MOV TMOD,#01H ;设T0工作方式为1
MOV TH0,#0ECH ;定时器及时中断时间为5000us
MOV TL0,#78H
MOV IE,#82H ;T0中段使能,总的中段使能
MOV R4,#0C8H ;实现计时1s功能
SETB TR0 ;启动定时器T0
;LOOP段为主程序中用于循环的扫描按键以检测外界输入对天,时,分,秒
;的设置和修改
LOOP: JB P0.0,NEXT2 ;P0.0(秒值修改键)是否被按下?
;不是,则跳至NEXT2检查P0.1
ACALL DELAY1 ;去抖动
JB P0.0,NEXT2 ;P0.0(秒值修改键)不是否被按下,
;则跳转至NEXT2检查P0.1
NEXT1: JNB P0.0,NEXT1 ;P0.0(秒值修改键)是否被放开?
MOV A,2DH ;将秒寄存器的值放入A
ADD A,#01 ;A的内容加1
DA A ;十进制调整
MOV 2DH,A ;将A的值放回秒寄存器
CJNE A,#3CH,NEXT2 ;是否等于60秒?不是,则跳至
; NEXT2
MOV 2DH,#00 ;是则重新设置秒寄存器的值为00
NEXT2: JB P0.1,NEXT4 ;P0.1(分值修改键)是否被按下?
;不是,则跳至NEXT4检查P0.2
ACALL DELAY1 ;去抖动
JB P0.1,NEXT4 ;P0.1(分值修改键)不是否被按下,
;则跳转至NEXT4检查P0.2
NEXT3: JNB P0.1,NEXT3 ;P0.1(分值修改键)是否被放开?
MOV A,2CH ;将分寄存器的值放入A
ADD A,#01
DA A
MOV 2CH,A ;将A的值放回分寄存器
CJNE A,#3CH,NEXT4 ;是否等于60分?不是,则跳至
;NEXT4
MOV 2CH,#00 ;是则重新设置分寄存器的值为00
NEXT4: JB P0.2,NEXT6 ;P0.2(时值修改键)是否被按下?
;不是,则跳至NEXT6检查P0.3
ACALL DELAY1 ;去抖动
JB P0.2,NEXT6 ;P0.2(时值修改键)不是否被按下,
;则跳转至NEXT4检查P0.2
NEXT5: JNB P0.1,NEXT5 ;P0.2(时值修改键)是否被放开?
MOV A,2BH ;将时寄存器的值放入A
ADD A,#01
DA A
MOV 2BH,A ;将A的值放回时寄存器
CJNE A,#18H,NEXT6 ;是否等于24时?不是,则跳至
;NEXT6
MOV 2BH,#00 ;是则重新设置时寄存器的值为00
NEXT6: JB P0.3,LOOP ;P0.3(天值修改键)是否被按下?
;不是,则跳至LOOP检查P0.0
ACALL DELAY1 ;去抖动
JB P0.3,LOOP ;P0.3(分值修改键)不是真正被按下,
;则跳转至LOOP检查P0.0
NEXT7: JNB P0.1,NEXT7 ;P0.3(天值修改键)是否被放开?
MOV A,2AH ;将寄存器的值放入A
ADD A,#01
DA A
MOV 2CH,A ;将A的值放回天寄存器
CJNE A,#07H,LOOP ;是否等于7天?不是,则跳至
;LOOP
MOV 2AH,#00 ;是则重新设置天寄存器的值为00
AJMP LOOP
;T0中断子程序。每5000us中断一次,在该子程序中判断是否1s计时到,并做
;相应调整和处理(CLK_CHANGE子程序和CONVERT子程序),同时实现每
;5000s的显示更新。
TIMER0: MOV TH0,#0ECH ;定时器及时中断时间为5000us
MOV TL0,#78H
PUSH ACC ;保留现场的值
PUSH PSW
DJNZ R4,TIMLP1 ;计时1s到否?不到1s,则跳
;至TIMLP1
MOV R4,#0C8H
ACALL CLK_CHANGE ;调用计时子程序
;CLK_CHANGE
ACALL CONVERT ;调用数码转换及存储子程序
;CONVERT
TIMLP1: ACALL DISP ;调用显示子程序DISP
POP PSW ;恢复现场的值
POP ACC
RETI
;DISP子程序实现天,时,分,秒计时制在数码管上的输出驱动显示。每一次
;调用(相隔5000us)只驱动显示7个数码管中的一个。
DISP: MOV A,30H ;扫描显示位码载入A
ADD A,#20H ;扫描显示位码作为偏移量,再加上
;显示缓冲区
;首地址20H,的戴显示数据的实际
;地址
MOV R1,A ;存入扫描显示指针R1
MOV A,30H ;扫描显示位码载入A
SWAP A ;A中低4位交换到高4位(P1高4
;位为显示位码,低4位为显示数据值)
ORL A,@R1 ;得“显示位码—显示段码”
MOV P2,A ;输出至P2显示
INC 30H ;扫描偏移量指针加1
MOV A,30H
CJNE A,#07H,DSPEND ;扫描显示完否?不是,则跳至
;DSPEND
MOV 30H,#00H ;是,则扫描显示位移量置为0
DSPEND: RET
;CLK_CHANGE子程序为计时1s到各天,时,分,秒数据的处理程序
CLK_CHANGE:
MOV A,2DH ;2DH单元为秒寄存器
ADD A,#1 ;加1秒
DA A ;十进制调整
MOV 2DH,A ;存入秒寄存器
CJNE A,#60,CLKEND ;是否超过60秒?不是,则跳至
; CLKEND
MOV 2DH,#00H ;是,则重设为00
MOV A,2CH ;2CH单元为分寄存器,其处理类同秒
ADD A,#1
DA A
MOV 2CH,A
CJNE A,#60,CLKEND ;是否超过60分?不是,则跳至
;CLKEND
CALL RING ;调用正点报时
MOV 2CH,#00H ;是,则重设为00
MOV A,2BH ;2BH单元为时寄存器
ADD A,#1
DA A
MOV 2BH,A
CJNE A,#24,CLKEND ;是否超过24时?不是,则跳至
; CLKEND
MOV 2BH,#00H ;是,则重设为00
MOV A,2AH ;2AH单元为秒寄存器
ADD A,#1
DA A
MOV 2AH,A
CJNE A,#07,CLKEND ;是否超过7天?不是,则跳至
;CLKEND
MOV 2AH,#00H ;是,则重设为00
CLKEND: RET
;CONVERT子程序实现天,时,分,秒计时值转换为BCD码并存储在以20H
;为起始地址的显示输出数据单元里,即显示缓冲区20H至26H单元
CONVERT: MOV R1,#20H ;送显示缓冲区首地址值到R1指针
MOV A,2DH ;将秒寄存器的内容存入A
ANL A,#0FH ;取秒值的个位,并存入20H单元
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2DH ;将秒寄存器的内容存入A
ANL A,#0F0H ;取秒值的十位,并存入21H单元
SWAP A
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2CH ;将分寄存器的内容存入A
ANL A,#0FH ;取分值的个位,并存入22H单元
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2CH ;将分寄存器的内容存入A
ANL A,#0F0H ;取分值的十位,并存入23H单元
SWAP A
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2BH ;将时寄存器的内容存入A
ANL A,#0FH ;取时值的个位,并存入24H单元
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2BH ;将时寄存器的内容存入A
ANL A,#0F0H ;取时值的十位,并存入25H单元
SWAP A
MOV @R1,A
INC R1 ;目标地址指针的修改
MOV A,2AH ;将天寄存器的内容存入A
ANL A,#0FH ;取天值,并存入26H单元
SWAP A
MOV @R1,A
RET
;整点报时子程序
RING: SETB P0.4 ;蜂鸣器开始鸣叫
ACALL DELAY2
CLR P0.4
RET
;延时5ms子程序
DELAY1: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
;延时1秒子程序
DELAY2: MOV R5,#200
DEL1: MOV R6,#10
DEL2: MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
END
五、结论
本设计从经济实用的角度出发,采用美国Atmel公司的单片机ATS51与显示驱动芯片74LS245作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、电源输入等电路并用汇编编写主控芯片的控制程序,研制了一款可以调时并带有闹钟功能的电子时钟。使用单片机制作的电子时钟具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于车站、办公室及家庭等场所,有一定的实用性。此电子时钟严格按照要求设计,基本达到了预期效果,能够正确的显示时分秒的计时,算上是一次比较成功的设计了。
通过这次的毕业设计,使我明白:知识,不仅仅是要学会,更重要的是要会用,要懂得怎么用。在刚开始做毕业论文时,我一筹莫展,根本不知道如何下手,甚至连论文的格式都不太清楚。但是,通过不断的查阅资料,询问老师,研究一些优秀的论文,我终于得到了我想要的东西,思路有了,格式明白了。虽然我的论文还不算太成熟,思路简单,电子时钟实现的功能较少,但是,我依然很高兴,因为这篇论文是我一个月的劳动成果,它使我将大学三年当中学到的知识更好的融汇在一起,也使我发现了自己还有许多知识没有很好的掌握,又一次让我明白了知识的重要性。我会在以后的工作、学习、生活当中更加认真的学好知识,为实现自己的人生理想打好坚实的基础。
六、参考文献
[1] 张文灼.单片机应用技术.机械工业出版社,2009
[2] 张 伟.Protel 99SE实用教程.人民邮电出版社,2008
[3] 童诗白 华成英.模拟电子技术基础.北京:高等教育出版社,2000
[4] 李 华.MCS-51系列单片机使用接口技术.北京航空航天大学出版社,1993.
[5] 邱关源.电路.北京:高等教育出版社,1999
[6] 何立民.单片机应用技术选编.北京:北京航空大学出版社,1998
[7] 李瀚荪.电路分析基础.北京:高等教育出版社1991
[8] 张思发 吴让仲.计算机组成原理及汇编语言.北京:高等教育出版社 2003
[9] 温希东 路勇.计算机控制技术.西安电子科技大学出版社 2005
