基于单片机控制电铃设计.docx
《基于单片机控制电铃设计.docx》由会员分享,可在线阅读,更多相关《基于单片机控制电铃设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于单片机控制电铃设计
单片机原理与应用
综合实验报告
基于单片机控制的电铃控制器
专业班级:
电子信息工程
姓 名:
胡俊_
学号:
时间:
2014.10.30
指导教师:
左敬龙
2014年10月30日
电铃控制器设计任务书
1.设计目的与要求
设计出一个用于电铃控制器。
准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能:
(1)基本功能
1)显示:
可以显示星期、时、分和秒。
2)打铃:
每天可设置20次,打铃持续时间每次1-90秒可调,每次打铃的间隔时间1-99分钟可调。
3)铃声:
内置蜂鸣器可以发出监控声音。
(2)性能:
时间日误差<1.5秒。
(3)扩展功能
1)可设定单/双休息日不打铃。
2)随季节变化,每天自动调整开与关的时间。
2.设计内容
写出实现该功能的C语言编程,并在KILE软件上仿真,并产生hex文件,通过软件把该程序写入单片机开发板,验证是否实现该功能
3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会。
4.答辩
在规定时间内,完成叙述并回答问题。
1引言………………………………………………………………………………….…1
2总体设计方案……………………………………………………………………….…1
2.1设计思路………………………………………………………………………….…1
2.2设计方案……………………………………………………………………….…2
3程序流程图框……………………………………………………………………….…2
3.1总体程序流程图框…………………………………………………………….……2
3.2时钟打铃程序流程图框…………………………………………………….……3
4设计原理分析…………………………………………………………………….……4
4.1时钟电路的设计……………………………………………………………….……4
4.2控制电路的原理………………………………………………………………….……4
4.3显示电路的原理……………………………………………………………………………5
总结与体会………………………………………………………….…………….….5
参考文献…………………………………………………………......………………….……6
附录1效果图……………………………………………………………………….……7
附录2C语言程序…………………………………………………………………………8
电铃控制器
摘要:
该设计介绍了一种以AT89S51单片机为核心,以七段数码管显示星期;时;分钟和秒,发光二极管作为指示灯标志及按键校时定时的自动打铃控制器。
关键词:
单片机;数码管;电铃;定时;74LS245
1引言
当今时代是一个新技术层出不穷的时代,在电子领域有尤其是自动化自动控制了领域,传统的分立元件或数学逻辑电路构成的控制系统,正以前所未有的速度被单片机智能控制系统所取代。
单片机具有体积小,功能强,成本低,应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂,学校及企业单位大规模的兴起。
学习单片机的最有效的方法就是理论与实践并重。
打铃器由AT89S51及其它器件组成,采用按键控制调时和定时等功能,用7个数码管来分别显示星期、时、分和秒.用5V直流电源,可以设定20多个打铃时间点。
以AT89S51为核心的单片机控制.主要作用:
解除作息管理麻烦、改变人工打铃、人工控制电器落后现象,实行电铃周期性工作的自动化控制.同时设有数字显示器及控制系统体积小,重量轻等优点。
充分发挥单片机体积小,价格便宜,功耗低,可靠性好等特点,充分发挥了单片机的控制优势。
2总体设计方案
2.1设计思路
图1设计思路框图
电铃控制器设计要求具有显示星期、时、分和秒以及设定时间和调整时间等功能,这些基本要求都可以通过软件编程实现。
要实现打铃提示,就需要设置打铃提示电路,
信号输入电路采用按钮开关。
设计思路框图如图1所示。
2.2方案论证
根据设计任务的基本要求,设计了由单片机(AT89S51)作为主控器件,七段数码管作为显示路,七个按键组成的按键操作电路,以及三极管、蜂鸣器组成的报警提示
电路构成的自动打铃器。
时钟电路的构成由单片机及其定时器完成,时间显示电路则由单片机串口输出,最后由七段数码管显示出来。
控制电路主要控制着复位电路、校时以及设置打铃点等操作。
显示电路采用串行静态显示,这种软件编程比较简单。
采用单片机内部时钟,这种方法产生的时钟还可以,但是成本低,而且编写时钟程序简单。
打铃电路电路可以采用蜂鸣器代替电铃,当时间到达打铃时间点时,使单片机发出控制信号,可以直接驱动三极管组成的基本放大电路,使蜂鸣器发出声音。
设计方框图如图2所示
图2设计方框图
3程序流程图框
3.1总体程序流程图
根据硬件设计结果,为满足要求,程序应有主程序、按键处理程序、中断服务程序和显示程序等部分构成。
主程序中主要是程序各部分的初始化;按键处理程序处理六个按键的操作,包括各个按键的响应程序以及按键指示、报警输出等;显示程序显示星期、时、分、秒,主要是时钟显示。
总程序流程图如图3所示
图3总程序流程图
3.2时钟打铃程序流程图
时钟打铃程序使用单片机T0、T1两个定时器中断,两个定时器均为方式一,当定时器T0溢出时响应中断,使毫秒单元加1,当毫秒单元满20时分单元加1,依此类推。
当定时器T1溢出时响应中断,依次比较存储的打铃点,条件符合就输出打铃信号。
中断均需保护现场,返回时恢复现场。
时钟打铃程序流程图如图4所示
N
Y
N
Y
N
Y
N
Y
N
Y
图4时钟打铃程序流程图
4设计原理分析
4.1时钟电路的原理
采用定时器/计数器T0的方式1,由于晶振是11.0592,令TH0=(65536-46080)/256;TL0=(65536-46080)%256,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
为了方便设计每20毫秒使得时钟加一秒,每60秒加一分钟,每60分加一个小时,每24个小时加一天。
4.2控制电路的原理
控制电路采用矩阵式键盘,当无按键动作时,行线处于高电平而列线处于低电平,当有按键按下时,则对应的行线和列线短接,行线电平变为低电平,以此知道有那个按键被按下了。
为了能够通过按键控制电路的运行,通过C语言编程使得S0-S9为数据输入键,S12为定时键(当按下是可以通过S0-S9设定响铃时间),S13为确定键,S11为返回键,通过上述的按键设定响铃时间,设定的数据暂时保存在锁存器中,当设定的时间与时钟电路的时间一致时,蜂鸣器响。
矩阵式电路如下图
4.3显示电路的原理
为了能显示星期、时、分、秒,需要7个数码显示管,其中6个显示管可以通过按键改变显示以显示定时时间。
5结束语
在这课程设计中,我学到了很多课堂上学不到的东西,也深刻的体验到了实践的重要性。
只学习理论而不实践,那理论就是一具空壳。
只有实践才能检验自己所学的理论知识。
实践的好处就在于能帮助你去更好地理解理论知识,平时课堂上不理解的东西,在实践的过程中就能很好的理解。
虽然这次课程设计上机调试没有成功,但是我自己毕竟努力做了。
参考文献
[1]阎石.数字电子技术基础(第三版)[M].:
高等教育,1989
[2]蔡振江.单片机原理及应用.:
电子工业,2007年2月,第1版
[3]童诗白,华成英.模拟电子技术基础.:
高等教育,2001年,第3版
[4]李朝青.单片机原理及接口技术[M].:
航空大学,2005年,第3版
[5]万光毅.单片机实验与实践教程.:
航空航天大学,2006年,第2版
[6]周航慈.单片机应用程序设计基础[M].:
电子工业,1997年7月
[7]朱承高.电工及电子技术手册[M].:
高等教育,1990
[8]廖常初.现场总线概述[J].电工技术,1999.6
附录效果图
C语言程序
#include
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^3;
unsignedcharj,k,a1,a0,b1,b0,c1,c0,ho=1,s,f,m,key=10,temp,qq;
ucharshi20,shi10,fen20,fen10,miao20,miao10,miao30,ok=1,wei,dingshi,change,yidingshi;
ucharbaoshi,baoshijieshu;
unsignedintpp;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(unsignedchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay(ucharshi2,ucharshi1,ucharfen2,ucharfen1,ucharmiao2,ucharmiao1,ucharmiao3)
{
dula=0;
P0=table[miao3];
dula=1;
dula=0;
wela=0;
P0=0x7f;
wela=1;
wela=0;
delay(5);
dula=0;
P0=table[shi2];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[shi1]|0x80;
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[fen2];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[fen1]|0x80;
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=table[miao2];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[miao1];
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
voidkeyscan0()
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xbb:
ok=0;
change=1;
break;
case0x7b:
ok=1;
change=0;
dingshi=0;
break;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
ok=0;
dingshi=1;
break;
case0xd7:
yidingshi=0;//取消定时
break;
}
}
}
}
voidkeyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
wei++;
break;
case0xde:
key=1;
wei++;
break;
case0xbe:
key=2;
wei++;
break;
case0x7e:
key=3;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
wei++;
break;
case0xdd:
key=5;
wei++;
break;
case0xbd:
key=6;
wei++;
break;
case0x7d:
key=7;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
wei++;
break;
case0xdb:
key=9;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}
voidmain()
{
TMOD=0x01;
TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while
(1)
{keyscan0();
if(ok==1)
{TR0=1;
wei=0;
if(pp==20)
{pp=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24)//为24h一个循环,若要12h,只需在此改为12即可。
{
s=0;
ho++;
if(ho==7)//为7天一个循环
{
ho=1;
}
}
}
}
}
a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0,ho);
}
else
{
if(change==1)
{TR0=0;
keyscan();
if(key!
=10)
{
switch(wei)
{
case1:
if(key<3)//小时最高位为2
a1=key;
else
wei--;
break;
case2:
if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key;//当小时最高位为2时,低位最高为4
break;
case3:
if(key<6)//分钟最高位为5
b1=key;
else
wei--;
break;
case4:
b0=key;break;
case5:
if(key<6)//秒最高位为5
c1=key;
else
wei--;
break;
case6:
c0=key;break;
}
key=10;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,b1,b0,c1,c0);
}
if(dingshi==1)
{
TR0=0;
display(shi20,shi10,fen20,fen10,miao20,miao10);
keyscan();
if(key!
=10)
{
switch(wei)
{
case1:
if(key<3)//小时最高位为2
shi20=key;
else
wei--;
break;
case2:
if(a1==1|a1==0)
shi10=key;
else
if(key<5)
a0=key;//当小时最高位为2时,低位最高为4
break;
case3:
if(key<6)//分钟最高位为5
fen20=key;
else
wei--;
break;
case4:
fen10=key;break;
case5:
if(key<6)//秒最高位为5
miao20=key;
else
wei--;
break;
case6:
miao10=key;break;
}
key=10;
}
yidingshi=1;
display(shi20,shi10,fen20,fen10,miao20,miao10,miao30);
}
}
if(yidingshi==1)
{
if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10))
beep=0;
}
if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0==miao10))||(yidingshi==0))//一分钟报时提示
beep=1;
}
}
voidtime0()interrupt1
{TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}