基于at89c的电子闹钟设计.docx
《基于at89c的电子闹钟设计.docx》由会员分享,可在线阅读,更多相关《基于at89c的电子闹钟设计.docx(89页珍藏版)》请在冰豆网上搜索。
基于at89c的电子闹钟设计
基于AT89C2051的电子闹钟
1.1电子闹钟的功能与设计方案
1.1.1电子闹钟的功能与设计要求
1.1.1.1电子闹钟的实现形式
电子闹钟既可以通过纯硬件实现,也可以通过软硬件结合实现,根据电子时钟中核心部件——秒信号的产生原理,通常有以下三种形式:
1.采用NE555时基电路的实现形式
采用NE555时基电路或其他振荡电路产生秒脉冲信号,作为秒加法电路的时钟信号或微处理器的外部中断输入信号,可构成电子钟。
由555构成的秒脉冲发生器电路见图1-1。
输出的脉冲信号VO的频率F=1.443/(RA+2RB)×C,可通过调节这3个参数,使输出VO的频率为精确的1Hz。
图1-1 基于555的秒脉冲发生器
2.采用石英钟专用芯片的实现形式
采用石英钟专用计时芯片实现的电子钟,具有实现简单、计时精度高的特点。
石英计时芯片(简称“机芯”)比较多,常见型号的有STP5512F、SM5546A和D60400等。
现结合康巴丝石英钟常用的5512F型为例作一简单介绍。
利用5512F的2秒输出信号作为秒加法电路的计数脉冲,可实现电子时钟。
5512F的引脚图如图1-2所示:
图1-2 5512F的引脚图
其中,引脚7、8为外接晶振及振荡电路,引脚1接电源正极,电源为1.5V,引脚3、4原为指针用步进电机线圈的输出驱动,这里可用3脚作为脉冲输出,频率决定于外接晶振的频率。
3.采用基于微处理器的实现形式
利用微处理器的智能性,可方便实现具有智能的电子钟。
由于微处理器均具有时钟振荡系统,利用系统时钟借助微处理器的定时/计数器可实现电子钟功能。
虽然,系统时钟的误差较大,电子钟的累积误差也可能较大,但可以通过误差修正软件加以修正。
本章讨论的电子钟就是采用这种形式。
1.1.1.2电子闹钟的功能与设计要求
就电子闹钟而言,一般应具有以下基本功能要求:
1.能随意设定走时起始时间。
对电子钟而言,最基本的功能是具有对时功能,即能随意设定走时起始时间。
2.能设定闹铃时间。
电子钟一般都具有闹铃功能,即预设定一个时间,一旦走时到该时间,电子钟能以声或光的形式告警提示(俗称“闹铃”、“打铃”)。
3.能指示秒节奏,即秒指示。
4.12小时/24小时两种制式可选,以适应不同的需要。
5.采用交直流供电电源。
与石英钟不同的是,电子钟一般采用数码管等显示介质,因而必须以交流供电为主,以直流电源为后备辅助电源,并能自动切换。
6.具有走时误差修正能力。
1.1.2设计方案的确定
从以下几个方面来确定电子闹钟的设计方案:
1.微处理器
采用ATMEL的AT89C2051微处理器,是基于以下几个因素:
1)89C2051为51内核,仿真调试软硬件资源丰富;
2)性价比高,货源充足;
3)DIP20封装,体积小,便于产品小型化;
4)为EEPROM程序存储介质,1000次以上擦/写周期,便于编程调试;
5)具有IDLE和POWER-DOWN两种工作模式,便于进行低功耗设计;
6)工作电压范围宽:
2.7~6V,便于交直流供电。
2.显示电路
就时钟而言,通常可采用液晶显示或数码管显示。
由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。
另外,89C2051本身无专门的液晶驱动接口,因此,本时钟采用数码管显示方式。
数码管作为一种主动显示器件,具有亮度高、价格便宜等优点,而且市场上也有专门的时钟显示组合数码管。
3.按键电路
考虑到对时和设定闹铃时间这两种操作的使用频率不是很高,为了精简系统和节省成本,本时钟系统只设两个按键:
1)SET键,对应系统的不同工作状态,具有3个功能:
●在复位后的待机状态下,用于启动设定时间参数(对时或定闹);
●在设定时间参数状态而且不是设定最低位(即分个位)的状态下,用于结束当前位的设定,当前设定位下移;
●在设定最低位(分个位)的状态下,用于结束本次时间设定。
2)+1键,用于对当前设定位(编辑位)进行加1操作,根据12/24小时工作模式和正在编辑的当前位的含义(时十位、时个位、分十位、分个位)自动进行数据的上限和下限判断。
例如,对12小时制,小时的十位只能是0、1,如果当前值为0,则按+1键后为1,再按+1键则又回复到0。
1.2电子闹钟的硬件系统设计
电子闹钟至少应包括秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分。
1.2.1电子闹钟的硬件系统框架
电子闹钟的系统框架如图1-3示。
在系统中,除了按键电路以外,还设计了“是否设定闹铃”、“12/24小时制选择”等按钮电路。
图1-3 时钟系统电路原理框图
1.2.2电子闹钟的主机电路设计
电子闹钟的主电路指的是图1-3中虚线框内部分,主要涉及到微处理器电路和按键按钮电路。
主机的设计具体地说有:
1)系统时钟电路设计;2)系统复位电路设计;3)按键与按钮电路设计;4)闹铃声光指示电路设计。
以下分别讨论:
1.系统时钟电路设计
系统时钟电路的设计如图1-4。
对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。
但由于图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在本闹钟系统的实际应用中一定要注意正确选择参数(30±10PF),并保证对称性(尽可能匹配),选用正牌厂家生产的瓷片或云母电容,如果可能的话,温度系数要尽可能低。
实验表明,这2个电容元件对闹钟的±走时误差有较大关系。
图1-4 系统时钟电路
2.系统复位电路设计
智能系统一般应有手动或上电复位电路。
复位电路的实现通常有两种方式:
1)RC复位电路;2)专用µP监控电路。
前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。
对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。
●专用µP监控电路
专用µP监控电路又称电源监视电路,具有上电时可靠产生复位信号和电源电压跌落到“门槛值”时可靠产生复位信号等功能。
按有效电平分,有高电平输出、低电平输出两种;按功能分,有简单的电源监视复位电路、带“看门狗”定时器(WATCHDOG,又简称“WDT”)的监控电路、和WDT+EEPROM的监控电路等多种类型。
比较常见的生产厂家有MAXIM、PHILIPS、IMP以及DALLS等,51系列微处理器中常用的型号有MAX813L、MAX809、X25043/5等。
●RC复位电路
本系统采用的是这种复位方式。
RC复位电路的实质是一阶充放电电路,现结合图1-5说明这种复位电路的特点。
系统上电时该电路提供有效的复位信号RST(高电平)直至系统电源稳定后撤销复位信号(低电平)。
理论上说,51系列单片机复位引脚只要外加2个机器周期的有效信号即可复位,即只要保证t=RC>2M(机器周期)便可,但实际设计中,通常取C1为10µF以上,R1通常取10K左右。
实践发现R1如果取值太小,例如1K,则会导致RST信号驱动能力变差而无法使系统可靠复位。
另外,从图1-6的复位信号波形图可以明显看出,图1-5中的虚线所接的续流二极管D1对于改善复位性能,起到了重要作用,它的作用是在电源电压瞬间下降时使电容迅速放电,因此一定宽度的电源毛刺(如波形中A点)也可令系统可靠复位。
图1-6为未加二极管和加二极管的复位信号特性对比。
图1-5 RC复位电路
图1-6 加二极管前后的复位信号特性对比
3.按键与按钮电路设计
按键与按钮电路的设计参见系统电原理图中的S1、S2和S3对应部分。
按键与按钮电路设计中关键要考虑的就是按键去抖动问题(简称“去抖”),一般有硬件去抖和软件去抖两种方式。
过去硬件去抖电路通常采用分立元件或触发器实现,目前市场上已有硬件去抖专用接口芯片,例如:
MAXIM公司MAX6816~6818,均为单电源供电,电压为+2.7~5.5V,分别为单输入、双输入和八输入,输出端具有欠压锁定功能。
这里考虑到系统的硬件简化和成本没有采用硬件去抖,而采用软件去抖。
4.闹铃指示电路设计
闹铃指示可以有声或光两种形式。
本系统采用声音指示。
关键元件是蜂鸣器。
蜂鸣器有无源和有源两种,前者需要输入声音频率信号才能正常发声,后者则只需外加适当直流电源电压即可,元件内部已封装了音频振荡电路,在得电状态下即起振发声。
市场上的有源蜂鸣器分为3V、5V、6V等系列,以适应不同的应用需要。
其电路设计参见系统电原理图。
其中PNP小功率三极管Q2采用9012,其最大集电极电流为800mA,完全满足蜂鸣器驱动的需要。
适当调节基极电阻可改变蜂鸣器的发声功率(即响度)。
1.2.3电子闹钟的显示电路设计
显示采用共阳数码管,其目的是为了简化限流电路的设计和实现亮度可调的要求。
4位数码管显示电路见图1-7。
从图中可知,该显示电路采用了与一般的段电流电阻限流方式不同的实现方式,由此减少了4×8=32个限流电阻,简化了硬件系统。
每一笔画段二极管正常发光时的电流一般为10mA左右(当然,电流大小取决于选用的数码管是普亮、高亮还是超高亮类型的不同),其两端压降约为2.0V,也就是说,只要数码管的公共端(COM)加+2.0V以上电压,即可满足每笔画段发光二极管的发光要求,而且适当调节此电压值即可改变发光二极管的电流,从而达到调节亮度的目的。
此电压采用三端可调稳压电路W1(LM317)来实现。
其输入为+5V,按照图中参数,其输出电压由公式1-1决定:
(1-1)
图1-7 4位共阳数码管显示电路
式1-1中,R5为200Ω,R6可调,R4为220Ω,因此输出电压为2.17~2.63V。
但由于输入输出压差至少为2.5V,因此极限电压为2.5V。
为了节约CPU的口线,显示采用了串行通信口的串行显示接口方式,利用串口的0工作方式在发送TXD端口(P31)的时钟信号的作用下通过接收RXD端口(P30)将显示段码串行数据送入8位串入并出移位寄存器74LS164,控制相应的数码管。
图1-7只画出了一个数码管的连接。
端口P32的作用是通过LM317控制数码管显示的开启与关闭,当P32为低电平时Q1关断,317的输出电压低于1.5V,不足以发光,避免了在显示数据刷新时显示的抖动现象。
1.2.4电源设计
由于89C2051通常有-12和-24两种型号,对应的时钟频率分别为12M和24MHz,前者的工作电压为2~6V,后者的工作电压为4~6V,这点在设计选用时应当予以注意。
考虑到交直流两用的要求和三端稳压电路选用的方便(通常的系列为5V,6V,…),选择工作电压为5V。
电源系统设计如图1-8示。
图1-8 闹钟的电源系统原理图
应当说明的是,尽管有很多型号的7805三端稳压集成芯片,其标称最大输出电流均为1.5A,但在实际应用中,该最大输出电流值往往取决于两个方面:
1)足够的散热面积;2)不同的生产厂家。
按照很多开发者的经验,ST公司的7805三端稳压芯片能接近标称值。
在设计中,必须保证7805的输入电压Vi和输出电压Vo的压差大于2.5V,即Vi-Vo≥2.5V,否则失去稳压能力,同时考虑到功耗问题,此压差又不宜太,太大则增加7805本身的功率消耗,增加芯片的温升,不利于安全。
因此,选为9V。
当交流电源失电或失效时,电压为6V的直流电源(电池组或蓄电池)通过二极管投入作用,硅二极管的导通电压降约为0.2V左右,因此满足系统的电源要求。
1.2.5硬件电原理图
系统的硬件电原理图见图1-9。
图1-9 电子闹钟的系统电原理图
1.3电子闹钟的软件系统设计
软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。
关于显示实现和按键处理的软件设计参见本节相应小节。
这里主要讨论秒脉冲的产生原理。
基于软件的秒脉冲信号通常有延时法和定时中断法。
延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。
例如,设定某定时器每100ms中断1次,则10次的周期为1s。
这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。
本系统采用这种方式,实现的关键是定时器工作方式的选择和定时参数的计算设定。
具体内容参见源程序中的相关说明。
本系统中所使用的晶振频率为6MHz。
1.3.1软件系统中的主模块设计
主模块是系统软件的主框架。
结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。
它的合理与否关系到程序最终的功能的多少和性能的好坏。
本系统的主模块的程序框图用图1-10的表示。
具体代码实现以下分别讨论,注意,代码中的有关变量的含义和作用要参阅源程序清单部分的说明。
图1-10 主程序流程框图
1.主模块的ASM51汇编语言实现
以下程序为上述主模块的51汇编语言实现,有关设计思想在程序中均作了详细分析说明。
MAIN:
MOVSP,#60H;堆栈设置
LCALLSYS_INIT;系统初始化
LCALLT0_INIT;定时器初始化
LCALLT1_INIT;闪烁用定时器初始化
LCALLUART_INIT;串口初始化
LCALLDISPLAYP;显示待机符P.
LCALLSETTIME;等待设置当前时间
JBS3,MAIN_00;判是否设置闹铃
LCALLSETWARN;是,则设定闹铃时间
SETBWARNSETTED;设置已设定闹铃时间标志
MOVWARNCNT,#0;闹铃次数清0(否则会闹1分钟)
CLRTFIX;误差开始修正标志初始化
MOVCOUNT,#0
MAIN_00:
LCALLDISPLAY1;必须再次刷新,否则会出现尾位不显示的情况
MAIN_0:
SETBTR0;设置完后开始走时,启动定时器T0
SETBET0;允许T0溢出中断
MAIN_1:
JBFRESH,MAIN_2;时(分)有变化,则刷新显示
SJMPMAIN_3;否则,不更新显示
MAIN_2:
LCALLDISPLAY1;先对时分数据进行HEX2BCD转换后显示
SJMPMAIN_3;进入死循环,只有复位才能重新设置
MAIN_3:
JBCSEC,MAIN_4;判秒到否
SJMPMAIN_1
MAIN_4:
CPLL1;到则进行秒指示
CPLL2
JNBWARNING,MAIN_5
CPLBEEP;开始闹铃
INCWARNCNT;闹铃次数+1
MOVA,WARNCNT
XRLA,#08
JNZMAIN_5;到8次(实际是4次),则停止
CLRWARNING
MOVWARNCNT,#0
MAIN_6:
SETBBEEP
MAIN_5:
MOVR6,#60
LCALLDEL20_0;点亮时间(不能太长,否则影响秒指示,短则太暗)
SJMPMAIN_1
2.主模块的C51语言实现
以下代码为上述主模块的C51语言实现,该实现中没有闹铃时间设定功能。
voidmain(void)
{
sys_init();/*系统初始化*/
t0_init();/*定时器初始化*/
t1_init();
uart_init();/*串口初始化*/
buf[0]=0x0a;/*"P."的段码送显示缓冲区*/
buf[1]=0x0b;
buf[2]=0x0b;
buf[3]=0x0b;
display();/*显示待机符P.*/
settime();/*等待设置当前时间*/
display();/*带闪烁后要加显,否则会出现尾位不显的现象*/
TR0=1;/*设置完后开始走时,启动定时器T0*/
ET0=1;/*允许T0溢出中断*/
while
(1)
{
if(fresh)/*判是否要刷新显示(分或时变化)*/
{
buf[0]=hourh;/*是,则新的时间送显示缓冲区*/
buf[1]=hourl;
buf[2]=minuh;
buf[3]=minul;
display();/*显示刷新*/
if(sec)/*判秒指示要刷新否*/
{
sec=0;/*是,则刷新(闪烁)*/
L1=!
L1;
L2=!
L2;
delay20ms();/*点亮时间不能太长,否则影响秒指示,短则太暗*/
}
}
else
{
if(sec)
{
sec=0;
L1=!
L1;
L2=!
L2;
delay20ms();
}
}
}
}
1.3.2基本显示模块设计
基本显示模块设计的重点是由显示代码取得相应的段码、显示段码数据的串行发送,程序流程如图1-11所示。
其中时个位的段码必须加上小数点,即带小数点显示时个位,目的是以小数点符代替时间分割符“:
”(因为一般的数码管无法显示字符“:
”)。
图1-11 基本显示模块的程序流程图
1.基本显示模块的ASM51语言实现
以下代码为基本显示模块的51汇编语言实现。
DISPLAY:
LCALLHEX2BCD;数据转换
DISPLAY1:
SETBDISPCON;关闭显示
MOVA,HOURH;取出小时数据
ADDA,#30H;加上偏移量
MOVCA,@A+PC;取出段码
MOVSBUF,A;送入74LS164
DL1:
JNBTI,DL1;等待发送完成
CLRTI
MOVA,HOURL
ADDA,#24H
MOVCA,@A+PC
ANLA,#0FEH;显示时分分隔符:
(这里用.代替)
MOVSBUF,A
DL2:
JNBTI,DL2
CLRTI
MOVA,MINUH;分
ADDA,#16H
MOVCA,@A+PC
MOVSBUF,A
DL3:
JNBTI,DL3
CLRTI
MOVA,MINUL
ADDA,#0AH
MOVCA,@A+PC
MOVSBUF,A
DL4:
JNBTI,DL4
CLRTI
CLRDISPCON;打开显示
RET
;****************************************************************
;0~9的段码(共阳数码管)
;****************************************************************
;74LS164的345610111213对应数码管的A,B,C,D,E,F,G,DP
;但是串口方式0发送的首位是最最低位,因此Q0~Q7中的Q0其实是最高位,
SEGTAB:
DB03H,9FH,25H,0DH,99H
DB49H,41H,1FH,01H,09H
DB0FFH
2.基本显示模块的C51语言实现
以下代码为基本显示模块的C51语言实现。
voiddisplay(void)
{
ucharout;
DISPCON=1;/*关闭显示,防止传送数据期间闪烁*/
out=seg[buf[0]];/*取出高位时段码*/
SBUF=out;/*送入74LS164*/
while(!
TI);/*等待发送完成*/
TI=0;
out=seg[buf[1]];/*取出低位时段码*/
out&=0xfe;/*显示时分分隔符:
(这里用.代替)*/
SBUF=out;
while(!
TI);
TI=0;
out=seg[buf[2]];/*分*/
SBUF=out;
while(!
TI);
TI=0;
out=seg[buf[3]];
SBUF=out;
while(!
TI);
TI=0;
DISPCON=0;/*所有数据已送入后开显示*/
}
1.3.3当前编辑位闪烁功能的实现
当前编辑位闪烁功能能使时间设定编辑模块的人机环境更加友善,其实现的原理是:
利用定时器1每100ms的溢出中断,实现每0.5s将闪烁位标志求反;在时间设定模块中根据此标志的状态,分别显示当前时间参数或关闭显示,达到每0.5s亮-灭交替的效果,即闪烁。
上述思想用程序框图表示为图1-12。
定时器1的中断程序思想参见下面代码中的注释说明。
图1-12 当前编辑位闪烁功能实现的程序流程
1.当前编辑位闪烁功能的ASM51语言实现
以下代码为当前编辑位闪烁功能的51汇编语言实现,是从时间设定模块中截取的一部分。
SET_0:
JNBSS,SET_06;判闪烁标志(一亮一灭)
JNBHH,SET_02;为真,则当前位灭
MOVHHBACK,#0AH;灭的代码
MOVHLBACK,HOURL;其他显示位送该缓冲区
MOVMHBACK,MINUH
MOVMLBACK,MINUL
SJMPSET_01
SET_02:
JNBHL,SET_03
MOVHHBACK,HOURH
MOVHLBACK,#0AH;灭的代码
MOVMHBACK,MINUH
MOVMLBACK,MINUL
SJMPSET_01
以下为定时器1的100ms定时溢出中断子程序。
TIMER1:
PUSHACC
MOVTH1,#3CH;100ms定时常数
MOVTL1,#0B0H
INCCOUNT;中断次数加1
MOVA,COUNT
XRLA,#5;判到5