作息时刻操纵器.docx
《作息时刻操纵器.docx》由会员分享,可在线阅读,更多相关《作息时刻操纵器.docx(23页珍藏版)》请在冰豆网上搜索。
作息时刻操纵器
作息时刻操纵器
摘要
本设计是采纳单片机AT89S52而设计的作息时刻操纵器本。
要紧通过软件来实现,采纳AT89S52单片机芯片、直接驱动LED显示电路。
外接4个按钮组成键盘,AT89S52为51内核。
另外,AT89S52本身无专门的液晶驱动接口,因此,本作息时刻操纵器采纳数码管显示方式。
数码管作为一种主动显示器件,具有亮度高、价钱廉价等优势,而且市场上也有专门的时钟显示组合数码管,接线简单,利用方便。
相较与一些以数字计数芯片为核心的硬件设计系统而言,该设计操作更为简单,工作加倍稳固,本钱也进一步降低。
该作息时刻操纵器由四位七段数码管来显示当前的时刻,即显示时和分,用LED灯的闪烁来表示秒,本设计中LED1灯闪烁的时刻距离设定为1s,即每分钟闪烁60次。
该作息可操纵器外围的按键电路由4个按键组成,其中S1作为时刻和闹钟加调整而S2作为时刻和闹钟的减调整,S3作为校时的功能按键,S4作为闹钟调整和响铃时刻功能按键。
由于冬季与夏日作息时刻别离用加和减来调整是为了校时和响铃时刻加倍方便和快捷。
另外在设计中又加入正点报时功能起到提示的功能。
关键词:
单片机AT89S52,LED数码管,LED灯
1概述
作息时刻操纵器的设计
作息时刻钟的设计大体组成由电源模块、微处置器模块、时刻获取模块、键盘模块和数据显示模块组成。
在本方案设计选择时能够选择小规模数字集成电路;咱们可采纳AT89S52单片机,因为此单片机的工作频率在12MHz左右,而且内部还有按时、计数器,能够产生精准的1S按时,由次能够用按时中断的方式产生精准的1S时刻,秒位不断的加1,再设计分、时的进制,使产生进位。
本设计只需要单片机最小系统加上显示电路,再设计简单的程序算法就能够够实现。
在显示电路上,采纳数码管就能够够将年时分显示出来,通过发光二极管闪烁来表示秒计数。
作息时刻操纵器的应用
良好的作息适应使咱们学习效率高的保证,本次设计作息时刻操纵器简单有效,能够依照自己的需要来设定自己的作息时刻,达到预按时刻以后单片性能够驱动蜂鸣器,从而起到提示自己按时作息的作用。
而且响铃时刻也能够依照自己的需要设定。
另外在程序中还加入整点报时功能。
作息时刻操纵器采纳加、减校时使校时上下可调。
减少了自己设定闹钟和校时调剂的时刻
作息时刻操纵器的要求
【1】设计制作一个单片机数字钟及操纵电路。
【2】利用4位七段显示器来显示此刻的时刻。
显示格式为“时分”,由LED闪动作为秒计数表示。
【3】能够设定作息时刻,并进行到时提示。
【4】能够依照预先设定好的作息时刻表自动启停操纵电路,完成对外部设备的实时操纵。
【5】能够设置此刻的时刻及显示按时设置时刻。
2系统设计方案
系统整体设计
在系统的整体设计中,系统硬件的设计能够依照系统的各个功能,把整个系统划分成假设干个模块,别离对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。
本系统涉及到的硬件模块有:
按键电路、复位电路、显示电路。
系统电源供电方式采纳USB供电。
作息时刻操纵器的显示电路是有四个数码管显示,别离显示时和分,而秒的显示有发光二极管的闪动来表示,闪一次就为一秒。
依照以上设计思路,系统的整体设计框图如以下图所示。
最小系统设计
单片机尽管集成了很多电路,但仍旧不能独立运行,必需要外连一些电路,才能是单片机运行起来。
这种能是单片机正常工作的最简电路咱们叫做单片机最小系统。
图2-2中,有40个引脚确实是AT89S52单片机,它的核心是MCS-51单片机。
第一是单片机的时钟电路,通过连接一个晶振和两个30pF电容,组成了单片机的时钟电路。
晶振是一种能够输出为定的震荡周期的元件,通过它单片机才能有时刻概念才能够去读指令;第二是单片机的复位电路,通过一个10uF电容和一个的电阻组成。
单片机的9因较为复位功能引脚。
当那个引脚又持续两个以上机械周期的高电平常,单片机就会复位。
咱们电路设计是,电容充电刹时是导通电流通过电容器,然后向电阻方向放电,这是电容的“-”端就用一个很高的电势。
电容充电时刻是有限,被选择适合的电容,其充电时刻就会大于2us,这时,复位条件就成立了。
最小系统如以下图:
数码管动态显示
作息时刻操纵器的显示,采纳的是数码管动态显示,也即将所有的位数码管的段选线并连在一路而有位选线操纵哪一名数码管有效。
如此一来不管几个数码管咱们就能够够用一个P0口来实现所有数码管的段选。
而P1口的前四位来作为位选。
如此一来就大大简化了硬件电路节省了I/O端口。
选亮数码管采纳动态扫描显示。
所谓动态扫描显示即连番向列位数码管送出字形码和相应的位选,利用数码管的余晖和人眼视觉暂留作用,是人的感觉仿佛是个位数码管同时都在显示。
动态显示的亮度比静态显示要差一些。
数码管连接如以下图所示
蜂鸣器驱动电路
因为单片机的I/O口的输出电流过小从而无法驱动蜂鸣器,是蜂鸣器响铃。
因此咱们利用三极管的放大作用来驱动蜂鸣器,当单片机的P3^0输出高电平常PNP截止蜂鸣器不发声,当P3^0输出低平常PNP导通器发声。
按键扫描电路
本次设计采纳四个按键来实现电路的校时和闹铃设定。
S1作为时刻和闹钟加调整而S2作为时刻和闹钟的减调整,S3作为校时的功能按键,S4作为闹钟调整和响铃时刻功能按键。
当有按键按下时,就会是相连的I/O口显现低电平,单片机就会扫描到是哪个按键按下,让后进入函数来显示案件的功能。
本次按键扫面电路中,咱们还在程序中加入了避免按键彼此之间干扰程序,在其他按键按下时其他键按下或不按,按下的键都不受阻碍,另外还加入避免按键抖动的程序,增加了按键扫描的准确性。
3软件设计
按时器0的初始化
单片机的按时器的工作原理是利用了寄放器的溢出来触发中断的,因此在写按时器的时候就要去算计数的增量,再依照单片机的晶振的频率就能够够算出确信的时刻了。
按时器要紧用到了2个寄放器,一个为TCON,另一个为是用来操纵按时器的启动与停止的.TMOD是用来设置按时器的模式的.她们的具体的位说明,下面有一张图片,一看便清楚了。
写单片机按时器的步骤:
1,对TMOD赋值,以确信T0和T1的工作方式。
2,计算初值,并将其写入TH0、TL0或TH一、TL1。
3,中断方式时,那么对IE赋值,开放中断。
4,使TR0或TR1置位,启动按时/计数器按时或计数。
本次设计咱们采纳按时器0。
初始化程序如下:
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
每进一次中断,都要对按时器0初始化。
且一次中断时刻仅为50ms,因此还要通过计数来实现一秒的按时。
每进一次中断count加一次,count计到20才为一秒。
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{count=0;
miao++;}
}
时、分显示函数
若是时、分准确显示,咱们第一要把时和分的个位和十位分离。
每次点亮数码管都要通过延时如此数码管显示可不能闪烁,亮度也比较好。
voiddisplay2(ucharc,uchard)
理可寻,不切实际的构思永久只能是构思,永久无法升级为设计。
设计出来的作品要经得起实际生活的验证,因为咱们作息时刻操纵确实是效劳生活,改变生活。
作为一名专业学生把握一门或几门编程和仿真软件一样是必不可少的,本次课程设计没有要求用DXP制电路图,且用了Proteus仿真。
这些软件使咱们的时刻操纵器的设置加倍方便、快捷。
另外,课堂上也有部份知识不太清楚,于是我又不能不边学边用,时刻巩固所学知识,这也是我作本次课程设计的第二大收成。
整个设计我大体上还中意,由于水平有限,不免会有错误,还望教师批评指正。
希望答辩时,教师多提些问题,由此我可用更好地了解到自己的不足,以便课后加以弥补。
参考文献
[1]冯先成常翠芝.单片机应用系统设计.北京:
北京航空航天大学出版社
[2]张靖武周灵彬.单片机原理、应用与PROTEUS仿真.北京:
北京
[3]白延敏.51单片机典型系统开发实例精讲.北京:
北京
[4]常敏王涵范江波.51单片机应用程序开发与实践.北京:
北京
附录1:
源程序代码
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbits1=P3^4;
sbits2=P3^5;
sbits3=P3^6;
sbitfw=P3^0;
sbits4=P3^7;
sbitle=P2^0;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
ucharcount,s1num,s4num;
ucharmiao,shi,fen,miao1,fen1,shi1;
uchara,b,c,d,e,f,q;
uintcount1,plag,plag1;
voiddisplay2(uchar,uchar);
voiddisplay3(uchar,uchar);
voiddisplay21(uchar,uchar);
voiddisplay31(uchar,uchar);
voiddisplay22(uchar,uchar);
voiddisplay32(uchar,uchar);
voiddisplay33(uchar,uchar);
voidinit();
voiddelay(uintz);
voidkeyscan();
voidmain()//主函数
{
init();
while
(1)
{
keyscan();
if(s1num==2&&plag==0)
display31(e,f);
elseif(plag==0)
display3(e,f);
if(s1num==1&&plag==0)
display21(c,d);
elseif(plag==0)
display2(c,d);
if(plag==1)
{
if(s4num==3)
display33(c,d);
else
{display32(e,f);
display22(c,d);
}
}
if(miao==miao1&&fen==fen1&&shi==shi1)
{
plag1=1;
fw=0;
}
}
}
voidinit()//初始化函数
{
fw=1;
count=0;
miao=52;
fen=59;
shi=21;
miao1=00;
fen1=01;
shi1=22;
q=10;
plag=0;
s4num=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voiddisplay2(ucharc,uchard)//分显示
{
c=fen/10;d=fen%10;
P0=table[c];
P1=0xfb;
delay(6);
P0=0x00;
P0=table[d];
P1=0xf7;
delay(6);
P0=0x00;
}
voiddisplay21(ucharc,uchard)//分调剂显示
{
c=fen/10;d=fen%10;
P0=table[c];
P1=0xfb;
delay(10);
P0=0x00;
P0=table[d];
P1=0xf7;
delay
(1);
P0=0x00;
}
voiddisplay3(uchare,ucharf)//时显示
{
e=shi/10;
f=shi%10;
P0=table[e];
P1=0xfe;
delay(6);
P0=0x00;
P0=table[f];
P1=0xfd;
delay(6);
P0=0x00;
}
voiddisplay31(uchare,ucharf)//时调剂显示
{
e=shi/10;
f=shi%10;
P0=table[e];
P1=0xfe;
delay(10);
P0=0x00;
P0=table[f];
P1=0xfd;
delay
(1);
P0=0x00;
}
voiddisplay22(ucharc,uchard)/*闹钟分显示函数*/
{
c=fen1/10;d=fen1%10;
P0=table[c];
P1=0xfb;
delay(5);
P0=0x00;
P0=table[d];
P1=0xf7;
delay
(1);
P0=0x00;
}
voiddisplay32(uchare,ucharf)/*闹钟时显示函数*/
{
e=shi1/10;
f=shi1%10;
P0=table[e];
P1=0xfe;
delay(5);
P0=0x00;
P0=table[f];
P1=0xfd;
delay
(1);
P0=0x00;
}
voiddisplay33(ucharc,uchard)/*闹钟蕏响铃时刻显示函数*/
{
c=q/10;d=q%10;
P0=table[c];
P1=0xfb;
delay(6);
P0=0x00;
P0=table[d];
P1=0xf7;
delay(6);
P0=0x00;
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(plag1==0)
fw=1;
if(count%10==0)
le=~le;
if(count==20)
{count=0;
miao++;
if(fen==fen1&&shi==shi1)
if(miao-miao1>=q)
{
fw=1;
plag1=0;
}
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fw=0;
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
voiddelay(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidkeyscan()/*按键扫描函数*/
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
}
if(s1num==3)
{
TR0=1;
s1num=0;
}
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
fen++;
if(fen==60)
fen=0;
display2(c,d);
}
if(s1num==2)
{
shi++;
if(shi==24)
shi=0;
display3(e,f);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
fen--;
if(fen==-1)
fen=59;
display2(c,d);
}
if(s1num==2)
{
shi--;
if(shi==-1)
shi=23;
display3(e,f);
}
}
}
}
if(s4==0)//闹钟按键扫描
{
delay(5);
if(s4==0)
{
s4num++;
plag=1;
while(!
s4);
if(s4num==4)
{
//TR0=1;
s4num=0;
plag=0;
}
}
}
if(s4num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s4num==1)
{
fen1++;
if(fen1==60)
fen1=0;
display22(c,d);
}
if(s4num==2)
{
shi1++;
if(shi1==24)
shi1=0;
display32(e,f);
}
if(s4num==3)
{
q++;
if(q==60)
q=0;
display33(c,d);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s4num==1)
{
fen1--;
if(fen1==-1)
fen1=59;
display22(c,d);
}
if(s4num==2)
{
shi1--;
if(shi1==-1)
shi1=23;
display32(e,f);
}
if(s4num==3)
{
q--;
if(q==0)
q=60;
display33(c,d);
}
}
}
}
}
附录2:
总电路图