基于at89c的电子闹钟设计文档格式.docx
- 文档编号:19828489
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:89
- 大小:1.21MB
基于at89c的电子闹钟设计文档格式.docx
《基于at89c的电子闹钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于at89c的电子闹钟设计文档格式.docx(89页珍藏版)》请在冰豆网上搜索。
采用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:
先对时分数据进行HEX2BCD转换后显示
进入死循环,只有复位才能重新设置
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();
/*等待设置当前时间*/
/*带闪烁后要加显,否则会出现尾位不显的现象*/
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)
}
}
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
MOVA,MINUH;
分
ADDA,#16H
DL3:
JNBTI,DL3
MOVA,MINUL
ADDA,#0AH
DL4:
JNBTI,DL4
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;
/*显示时分分隔符:
(这里用.代替)*/
out=seg[buf[2]];
/*分*/
out=seg[buf[3]];
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;
以下为定时器1的100ms定时溢出中断子程序。
TIMER1:
PUSHACC
MOVTH1,#3CH;
100ms定时常数
MOVTL1,#0B0H
INCCOUNT;
中断次数加1
MOVA,COUNT
XRLA,#5;
判到5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 at89c 电子 闹钟 设计