基于AT89C51的电铃系统.docx
《基于AT89C51的电铃系统.docx》由会员分享,可在线阅读,更多相关《基于AT89C51的电铃系统.docx(33页珍藏版)》请在冰点文库上搜索。
基于AT89C51的电铃系统
基于AT89C51的电铃系统
1电子闹铃的任务和设计要求
1.1电子闹铃的设计任务
设计一电子闹铃,该闹铃可设定起始走时时间和闹铃时间。
1.2电子闹铃的设计要求
就电子闹铃而言,一般应具有以下基本功能要求:
(1)能随意设定走时起始时间。
对电子闹铃而言,最基本的功能是具有对时功能,即能随意设定走时起始时间。
(2)能设定闹铃时间。
电子时钟一般都具有闹铃功能,预设一个时间,一旦走时到该时间,电子闹铃能以声或光的形式打铃提示。
(3)能指示秒节奏,即秒指示。
(4)12小时|24小时两种形式可选择,以适应不同的需要。
(5)采用交流供电电源。
电子闹铃一般采用数码管等显示介质,所以必须采用以交流供电为主,以直流电源为后备辅助电源,并能自动切换。
(6)具有走时误差修正能力。
1.3电子闹铃设计的研究基础
利用单片机的智能型,可方便地实现具有智能的电铃设计。
由于微处理器均具有时钟振荡系统,利用系统时钟借助微处理器的定时器|计数器可实现电铃的功能。
虽然系统时钟的误差较大,电子钟的累积误差也可能较大,但可以通过误差修正软件加以修正。
2电子闹铃系统设计方案的确定
2.1电子闹铃系统方案的提出
电子闹铃既可以通过纯硬件设计实现,也可以通过软硬件结合的形式实现,根据电子闹铃的核心部件—秒信号的产生原理,通常有三种形式。
2.2电子闹铃系统方案的比较
(1)采用石英钟专用芯片的实现形式采用石英钟专用计时芯片实现的闹铃
具有实现简单、计时精度高的特点。
石英计时芯片比较多,常见的型号有STP5512F、SM5546A和D60400等。
(2)采用NE555石基电路的实现形式
采用NE555石基电路或其他振荡电路产生秒脉冲信号,作为秒加法器电路的时
钟信号或微处理器的外部中断输入信号,可构成电子闹铃。
由555构成的秒脉冲发生器电路如图1所示。
输出的脉冲信号V的频率f=1.443|(R1+2R2)C,可通过调节这3个参数,使输出V的频率为精确的1Hz图1基于555的秒脉冲发生、
(3)采用基于单片机的实现形式
利用单片机的智能性,方便地实现具有智能的电子闹铃的设计。
由于微处器具有时钟振荡系统,利用系统时钟借助微处理器的定时器|计数器可实现电子闹铃功能。
虽然误差较大,但可以通过误差修正软件加以修正。
2.3电子闹铃系统设计方案的确定
2.3.1微处理器
采用ATMEL的AT89C51微处理器,是因为:
(1)AT89C51为51内核,仿真调试软硬件资源丰富;
(2)性价比较高,货源充足;
(3)AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压;
(4)为1000次以上擦|写周期,方便程序调试;
(5)高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容;
(6)工作电压范围宽,便于交直流供电。
2.3.2显示电路
就时钟而言,通常采用液晶显示或数码管显示。
对于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块,一半多采用并行接口,对微处理器的接口要求较高,占用资源多。
而且,89C51本身没有专门的液晶驱动接口,因此,本系统采用数码管显示方式。
数码管是一种主动显示器件,亮度高、价格便宜,而且市场上也有专门的时钟显示组合数码管。
2.3.3按键电路
考虑到对时和设定闹铃时间这两种操作的使用频率并不是很高,为了节省成本和精简系统,采用独立式按键。
如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。
如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。
键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改,用于对当前设定位进行加1操作,根据12|24小时工作模式和正在编辑的当前位的含义(时十位、时个位、分十位、分个位)自动进行数据的上限和下限的判断。
3电子闹铃系统方案设计
3.1电子闹铃的硬件系统设计
电子闹铃至少包括秒时间显示电路、按键电路、供电电路、闹铃指示电路等几部分。
3.1.1电子闹铃的硬件系统框架[1]
电子闹铃的系统框架如图2所示。
在系统中,除了按键电路以外,还设计了“是否设定闹铃”、“12|24小时制选择”等按钮电路。
图2电子闹铃的系统框图
3.1.2电子闹铃的主机电路设计
电子闹铃的主电路指的是图2中除了电源的部分,主要涉及到微处理器电路和按键按钮电路。
主机的设计具体地说有:
(1)系统时钟电路设计;
(2)系统复位电路设计;(3)按键与按钮电路设计;(4)闹铃声光指示电路设计。
1.系统时钟电路设计图3系统时钟电路
系统时钟电路的设计如图3所示。
图中的C1、C2电容起着系统时钟频率微调和稳定的作用,所以本闹铃系统的实际应用中一定注意正确选择参数(30
10pF),并保证电路的对称性。
2.系统复位电路设计
复位电路的实现通常有两种方式:
即专用uP监控电路和RC复位电路。
前者电路实现简单,成本低,但复位可靠性相对较低;后者成本较高,但可靠性高,尤其是高可靠重复复位。
本系统采用后者即RC复位电路。
RC复位电路是实质是一阶充放电电路。
系统上电时该电路提供有效的复位信号RST(高电平)直至系统电源稳定后撤消后复位信号(低电平)。
从理论上说,51系列单片机复位引脚只要外加两个机器周期的有效信号即可复位,即只要保证t=RC>2M(机器周期)便可。
3.按键与按钮电路设计[2]
按键与按钮电路设计中关键要考虑的就是按键去抖动问题,一般有硬件去抖和软件去抖两种方式。
以往硬件去抖电路一般采用分立元件或触发器实现,现在已有硬件去抖专用接口芯片,例如:
MAX6816-6818,均为单电源供电,电压为2.7
5.5V,分别为单输入、双输入、和八输入,输出端具有欠压锁定功能。
本系统考虑硬件简化和成本,采用软件去抖。
如图4所示:
图4键盘输入电路
4.闹铃声光指示电路设计
闹铃指示可以有声或光两种形式,本系统采用声音指示。
关键元件是蜂鸣器
蜂鸣器有有源和无源两种,前者需要输入声频信号才能正常发声,后者则只需外加直流电源电压即可;元件内部已封装了音频振荡电路,在得电状态即起振发声。
市场上的有源蜂鸣器分为3V、5V、6V等系列。
其电路设计参见系统电原理图。
其中PNP小功率三极管Q1采用9012,其最大集电极电流为800mA,完全满足蜂鸣器的需求。
适当调节基极电阻即可改变蜂鸣器的响度。
3.1.3电子闹铃的显示电路设计
显示采用共阳数码管,目的是为了简化电路的设计和实现亮度可调的要求。
8位数码管显示电路如图5所示。
图58位共阳数码管显示电路
为了节约CPU的端口数,显示采用了串行通信口的串行显示接口方式,利用串口的0工作方式,在发送TXD端口(P31)的时钟信号的作用下,通过接受RXD端口(P30)将显示段码串行数据送入8位串入并出移位寄存器74LS245,控制相应的数码管。
3.1.4电源设计
由于89C51通常有-12和-24两种型号,对应的时钟频率分别为12MHz和24MHz,前者的工作电压为2
6V,后者的为4
6V,这点是在设计选用时该考虑和注意的。
考虑到交直流两用的要求和三端稳压电路选用的方便,选择工作电压为5V。
电源系统设计如图6所示。
在设计中,必须保证三端稳压集成芯片7805的输入电压Vi和输出电压Vo的压差大于2.5V,即Vi
Vo
2.5V,否则会失去稳压能力。
同时考虑到功耗问题,此压差又不宜太大,太大则增加7805本身的功率消耗,增加芯片的温升,不利于安全。
所以,选9V。
当交流电源失电或失效时,电压为6V的直流电压通
过二级管投入作用,硅二极管的导通电压降约为0.2V,因此满足系统的电源要求。
图6闹铃的电源系统原理图
3.1.5硬件电原理图[3]
系统的硬件电原理图如图7所示。
图7电子闹铃系统的硬件原理图
3.2电子闹铃的软件系统设计
软件设计的重点是在秒脉冲信号的产生、显示的实现及按键的处理等方面。
基于软件的秒脉冲信号通常有延时法和定时中断法。
延时法一般采用查询方法,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其脉冲的精度不高。
中断法的原理是,利用单片机内部的定时器溢出中断来实现。
例如,设定某定时器每100ms中断1次,则10次的周期为1s。
这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。
本系统即采用这种方式,实现的关键的定时器工作方式的选择和定时参数的计算设定。
本系统所使用的晶振频率为6MHz。
3.2.1软件系统中的主模块设计
主模块是系统软件的主框架。
结构化程序一般有“自上而下”和“自下而上”两种方式,前者的核心就是主框架的构建。
它的合理与否关系到程序最终功能的多少和性能的好坏。
本系统的主模块框图可用图8来表示。
图8主模块的程序框图
3.2.2中断定时器的设计
数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。
AT89C51有两个通用定时/计数器。
两者均可配置为定时器或事件计数器。
另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。
用作“定时器”功能时,每经过一个机器周期,寄存器值加1。
用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。
使用该功能时,外部输入每个机器周期被采样一次。
设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到:
X=
-
X:
计数初值t:
定时时间T:
机器周期
中断服务流程图如下图9:
图9中断服务流程图
3.2.3闹铃子函数的设计
闹钟时间的判别主要是通过设定时间和实时时间的逐位对比确定是否
进行闹铃。
如图10所示:
图10闹铃判断流程图
3.2.4计时函数的设计
计时函数部分,主要是通过单片机定时中断来计时,复产生一次中断标志位flag加1,当flag加满20次为1秒,然后把flag清0,把秒存储单元加1。
然后再依次判断分、时。
如图11所示:
图11计时流程图
3.2.5键盘扫描函数的设计
这些函数主要判断是否有按键按下,并根据相应按键按下的情况调用相关函数执行,其流程图如下图所示:
图12键盘扫描流程图
3.2.6时间和闹钟的设计
此部分主要是通过判断cnt在不同值时通过调用加1、减1子函数对时间和闹钟的时、分、秒进行设置。
在闹钟设置时,判断按键S4按下情况,进行闹钟的开启与关闭,相关流程图如下图:
图13时间|闹钟设置流程图
4电子闹铃系统调试和仿真
4.1仿真软件介绍[4]
Protues软件是英国Labcenterelectronics公司出版的EAD工具软件。
不仅具有EAD软件仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具,真正实现了虚拟物理原型功能,在目标板还没投产前,就可以对所设计的硬件系统的功能、合理性和性能指标进行充分调整,并可以在没有硬件电路的情况下,进行相应的程序设计和调试,可由仿真原理图直接导出绘制成印制电路板。
受到单片机研究者,教学者的青睐。
4.2电子闹铃系统仿真实现[5]
硬件部分设置了的三个按键S1、S2、S3、S4。
当按键S1第一次按下时,停止计时进入闹钟1的秒设置,当按键S1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当S1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按S1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按S1第十、第十一、第十二次按下时分别进入时间的秒、分、时设置,在S1按下的各阶段,可用按键S2、S3进行时间和闹铃时间的时、分、秒进行加减设置;当按键S1第十三次按下时恢复到时间显示功能。
当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。
在各个闹钟设置阶段,如果有S4按下,则相应闹钟功能关闭或开启;如在闹铃时有S4按下则提前停止闹铃。
图14运行仿真图
5总结
5.1设计小结
在自己的不懈努力下,完成了电子闹铃的设计,功能上基本达标:
时钟的显示,调时功能、校时功能、闹铃功能、闹钟设功能。
其精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷;校时功能保证了时钟准确和可靠性,闹钟响铃还有扩展成音乐闹钟的余地。
硬件设施合乎要求,软件设计可以配合硬件实现要求的功能。
但是由于时间比较短,前期设计出现部分不足:
如位选闪烁功能不能实现、闹钟的开启与关闭、间断蜂鸣声等。
这些只是软件设计时相应功能部分还不完善造成。
不过经仔细思考和程序的完善,最终将软件设计改进,并完全可以很好实现所有要求的功能。
5.2设计体会
在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯,做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,这是我在这次课程设计中的最大收获。
5.3展望
无可否认机械时代已经过去,电子时代已经到来。
做为新时代的我们,更应该提高自身能力,适应新时代的发展。
知识来自实践,多去生活中探询所需要的。
对于上述所提到的研究课题,我们应尽量考虑到人的因素,增强时钟的实用性和操作性,为使用者提供切实的方便,营造一种舒适的生活氛围。
所以,在设计的时候,应该从多方面、多角度去考虑问题,而且应该进一步提高时钟的质量。
6参考文献
[1]李全利,迟荣强.单片机原理及接口技术[M].北京高等教育出版社,2004.
[2]凌玉华,单片机原理及应用系统设计[M].长沙中南大学出版社,2006.
[3]张毅刚,MCS-51单片机应用设计[M].哈尔宾哈尔宾工业大学出版社,1997.
[4]王为青,程国钢,单片机KeilCX51应用开发技术[M].北京人民邮电出版社,2007.
[5]张靖武,周灵彬,单片机系统的Protues设计与仿真[M].北京电子工业出版社,2007.
7附录
相关源程序如下:
//****************************头文件
********************************
#include
#include
//****************************宏定义
********************************
#defineucharunsignedchar
#defineuintunsignedint
//****************************位声明
********************************
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitfmq=P2^1;
//************************数码管显示的数值
**************************
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
//012345
0x82,0xf8,0x80,0x90,0xbf,0xff};
//6789-灭
//****************************函数声明
******************************
voidjia();
voidjian();
//********************数组定义,数组内含有8个数值
******************
uchartable1[8],table2[8],table3[8],table4[8];
//**************************时间显示初始值
**************************
ucharshi=12,fen=0,miao=0;
//**************************定义全局变量
****************************
ucharshi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;
ucharshi4,fen4,miao4;
ucharflag,flag1,wss,cnt,cnt1,alm1,alm2,alm3;
//1秒等时位闪次数校时闹1闹2闹3
uintflag2;
//蜂鸣
//*********************延时函数,用于扫描动态数码管
*****************
voiddelay(uchari)
{ucharx,y;
for(x=i;x>0;x--)
for(y=120;y>0;y--);
}
//*******************************初始化函数
*************************
voidinit()
{TMOD=0x01;//工作方式1
TH0=0x3c;//定时时间为:
50ms(65536-50000)/256
TL0=0x0b0;//(65536-50000)%256
ET0=1;//打开定时器
EA=1;//开总中断
TR0=1;//启动定时器
}
//********************显示函数,用于显示定时时间
*****************
voiddisplay()
{uchari,j;
if(cnt!
=10||wss==0)
{table1[0]=miao%10;//分离秒的个位与十位
table1[1]=miao/10;
}
else
{table1[0]=table1[1]=11;}
if(cnt!
=11||wss==0)
{table1[3]=fen%10;//分离分的个位与十位
table1[4]=fen/10;
}
else
{table1[3]=table1[4]=11;}
if(cnt!
=12||wss==0)
{table1[6]=shi%10;//分离时的个位与十位
table1[7]=shi/10;
}
else
{table1[6]=table1[7]=11;}
table1[2]=table1[5]=10;
j=0x7f;
for(i=0;i<=7;i++)//从秒到时的扫描
{P3=j;
P0=table[table1[i]];//显示数值
delay(10);
j=_cror_(j,1);//循环右移
}
}
//*******************显示1函数,用于显示定时1时间
*****************
voiddisplay1()
{uchari,j;
if(alm1==0)
{if(cnt!
=1||wss==0)
{table2[0]=miao1%10;//以下含义同上
table2[1]=miao1/10;
}
else
{table2[0]=table2[1]=11;}
if(cnt!
=2||wss==0)
{table2[3]=fen1%10;
table2[4]=fen1/10;
}
else
{table2[3]=table2[4]=11;}
if(cnt!
=3||wss==0)
{table2[6]=shi1%10;
table2[7]=shi1/10;
}
else
{table2[6]=table2[7]=11;}
}
elsetable2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;
table2[2]=table2[5]=10;
j=0x7f;
for(i=0;i<=7;i++)
{P3=j;
P0=table[table2[i]];
delay(10);
j=_cror_(j,1);
}
}
//********************显示子函数,用于显示定时2时间
******************
voiddisplay2()
{uchari,j;
if(alm2==0)
{if(cnt!
=4||wss==0)
{table3[0]=miao2%10;//以下含义同上
table3[1]=miao2/10;
}
else
{table3[0]=table3[1]=11;}
if(cnt!
=5||wss==0)
{table3[3]=fen2%10;
table3[4]=fen2/10;
}
else
{table3[3]=table3[4]=11;}
if(cnt!
=6||wss==0)
{table3[6]=shi2%10;
table3[7]=shi2/10;
}
else
{table3[6]=table3[7]=11;}
}
elsetable3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;
table3[2]=table3[5]=10;
j=0x7f;
for(i=0;i<=7;i++)
{P3=j;
P0=table[table3[i]];
delay(10);
j=_cror_(j,1);
}
}
//***************显示子函数,用于显示定时3时间数值****************//
voiddisplay3()
{uchari,j;
if(alm3==0)
{if(cnt!
=7||wss==0)
{table4[0]=miao3%10;//分离秒的个位与十位
table4[1]=miao3/10;
}
else
{table4[0]=table4[1]=11;}
if(cnt!
=8||wss==0)
{table4[3]=fen3%10;//分离分的个位与十位
t