yan河南理工大学单片机课程设计四路定时控制器副本.docx
《yan河南理工大学单片机课程设计四路定时控制器副本.docx》由会员分享,可在线阅读,更多相关《yan河南理工大学单片机课程设计四路定时控制器副本.docx(22页珍藏版)》请在冰豆网上搜索。
yan河南理工大学单片机课程设计四路定时控制器副本
微机原理与单片机接口技术
课程设计
题 目 名 称:
四路定时器
专 业 班 级:
电气本13-03
姓 名:
楚雪玲
侯璐
学 号:
321308010301
321308010302
指 导 教 师:
苏珊
摘要
随着科技的发展,单片机的应用正不断深入,本次设计的目的就是让我们在理论学习的基础上,通过完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用,使我们学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。
这里我们采用单片机STC10F08XE芯片为中心器件,结合实用性和器件条件,设计了一个简单的四路定时控制器,系统操作简单、实用性强、扩展性强。
单片机定时控制系统最基本的要求是可以实现定时控制,要实现这一功能只要在定时器程序中加判断指令,当判断成立时,即执行预设的动作,达到定时控制的目的。
其主要应用于定时控制四个回路的电源通断,通过定时来实现以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关,也可以自己设定时间段,来控制电路的通断,同时我们也利用了数码管来显示当前时间,利用四个发光二极管分别显示四路控制电路是否工作,更加直接明了。
关键字:
四路定时器智能控制开关
1概述
1.1实验要求
1.主要应用于定时控制四个回路的电源通断。
2.以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关。
如可以设置第一个回路在8:
30-11:
30开,14:
30-18:
00开,其他时间段为关。
3.能通过按键任意设置某回路某时间段的开关状态,并利用数码管显示当前时间,利用四个发光二极管分别显示四路控制电路的通断,直接明了。
1.2实验原理
结合我们对理论知识的学习,完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用。
这里我们采用单片机STC10F08XE芯片为中心器件,结合实用性和器件条件,设计了一个简单的四路定时控制器,系统操作简单、实用性强、扩展性强。
单片机定时控制系统最基本的要求是可以实现定时控制,要实现这一功能只要在程要在定时器程序中加判断指令,当判断成立时,即执行预设的动作,达到定时控制的目的。
其主要应用于定时控制四个回路的电源通断,通过定时器来实现时钟和定时功能,当判断成立时,即通过程序命令预设的I/O口输出相应电平来控制外围的控制电路,即继电器控制显示电路。
继电器工作原理:
其一般由铁芯、线圈、衔铁、触点簧片等组成的。
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。
这样吸合、释放,从而达到了在电路中的导通、切断的目的。
对于继电器的“常开、常闭”触点,可以这样来区分:
继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
继电器一般有两股电路,为低压控制电路和高压工作电路。
所以我们就利用继电器此特性,加上单片机IO口电压的控制,即完成了四路定时控制器。
9012三极管驱动电路:
当控制端电压为0时,Q1基极电压为(12-0.7=11.3V),改变R1的大小便可改变基极电流,当基极电流足够大时,三极管饱合。
为了验证以上的分析,我们搭了一个电路,R1取4.7K,此时基极电流为2.4ma,测得Q1 ec电压为0.2V,继电器两端电压为11.8V。
注意:
R1的取值不能太小,要保证基极电流在安全范围,也不能太大,要保证三极管能完全饱合,这个可以通过电压和电阻算出来。
第一种电路能工作,那是因为继电器有较宽的电压范围,有时它欠电压也能勉强工作,但状况是不稳定的,因此我们在设计时不建议采用这种方式。
正确的电路应该是电路二,正确的连接方式,大小合适的基极电阻才能保证设计的合理和稳定性。
最后注明一下,本次实验采用的12V继电器,因此该电路的控制极不能直接用单片机IO口驱动,否则会关不断。
若选用5V继电器则可以,原理同
2总体方案及硬件设计
2.1总体方案
整个定时控制系统电路可分为四大部分:
电源电路、核心芯片、显示部分、控制部分。
电源电路、核心芯片、显示部分,由开发板集成真题提供。
开发板
2.2硬件设计
1.核心芯片:
STC11/10xx系列单片机是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成高可靠复位电路,针对高速通信,智能控制,强干扰场合。
定时器0/定时器1/串行口与传统8051兼容,增加了独立波特率发生器,省去了定时器2.传统8051的111条指令执行速度全面提速,最快的指令快24倍,最慢的指令快3倍1.增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.
2.显示部分:
数码管是时钟最为重要的部分,共需要8位LED显示器。
采用动态显示方式,由于端口的问题以及动态显示方式的优越性,在此设计的连接方式上采用共阴级接法。
显示器LED有段选和位选两个端口,首先说段选端,它由LED八个端口构成,通过对这八个端口输入的不同的二进制数据使得它的显示也不同,可以通过控制输入二进制的信息来达到我们所需的时间的动态显示,从而满足我们时间准确显示的目的。
3.控制电路:
此电路主要是利用四个继电器工作组集成的
继电器电路:
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。
这样吸合、释放,从而达到了在电路中的导通、切断的目的
。
3软件设计
3.1程序设计
程序流程如下:
4仿真模拟
4.1proteus模拟
5心得体会
通过这次实训,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细,一个地方出错就可能会整个系统失效。
在硬件设计时,我们得注意3方面:
1,我们在设计电路时一定要事先把相关的参数计算正确,否则焊出来的电路毛病百出;2如果有条件一定要进行仿真模拟,这样可以对自己设计的电路有一定的监测作用;3最后在焊接电路时一定先进行模拟排布,达到美观实用可靠。
在软件调试过程中我们需要注意四方面,就拿我们这个定时器电路来说吧,1,先整体把握,先把主要的重要的程序段写出来,先进行调试,调试成功后,在进行下一步操作,切不可一下子把程序全部写完,在调试监测;2,写程序时最好按功能分段进行处理,一方面美观,有条理,另一方面也方便我们进行调试和修改;3,关于定时器程序,一方面我们必须把计数初值计算正确,另一方面得把程序的逻辑时间很清楚,4,对于按键监测,我们最好加上消抖程序,谨防按键操作时,出现混乱情况;
在写调整时间程序时,当按选择键择选要调整时还是秒或分时,看不出是要调整那一位为了方便用户看出现在是在调整那一位,就必须使调整位闪烁,但显示的时候已经用动态显示,如果直接改显示时间,就会使所有的位都闪烁,这样根本就不能实现,后面经过和同学讨论,我使不调的位显示4到5次再显示调整位1次,这样做最后就可以实现了,而且这样做还可以改变闪烁速度。
在软件设计时,还遇到了许多问题,毕竟想像和现实还是有很大的区别的,然而到了最后这些问题都一一被解决了,我也在这次实训中学会了很多东西,总结出自已的一套解决问题的方法,这让我觉得自已有了很大的收获,为今后的学习和工作打下了坚定的基础。
参考文献
[1]余发山王福忠杨凌霄王荷.《微机原理与单片机接口技术》.北京:
煤炭工业出版社,2013。
[2]康华光.《电子技术基础》.北京:
高等教育出版社,2006。
[3]艾永乐付子义.《模拟电子技术基础》.北京:
中国电力出版社,2008。
[4]藏春华.《电子线路设计与应用》.高等教育出版社,2004。
附1:
源程序代码
#include"reg51.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitD9=P3^2;
sbitD10=P3^3;
sbitD11=P3^4;
sbitD12=P3^5;
sbitH1=P3^6;
sbitH2=P3^7;
sbitout1=P0^4;
sfrP1M1=0x91;
sfrP1M0=0x92;
bitsflag;
ucharnum,shi,fen,k;
ucharshi1k,fen1k,shi2k,fen2k,shi3k,fen3k,shi4k,fen4k;
ucharshi1g,fen1g,shi2g,fen2g,shi3g,fen3g,shi4g,fen4g;
uchars1;
unsignedinttable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//数组共阴数码管显示从0到9
unsignedinttable2[]={0xf7,0xfb,0xfd,0xfe};//数码管位定义
unsignedinttable3[4]={0};
voiddisplay(unsignedcharshi,unsignedcharfen);
unsignedcharkey();
voidDelay10ms();
voidmain()
{
P1M0=0xff;
P1M1=0x00;
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
EA=1;//总中断
ET1=1;//定时器中断
TR1=1;//开启定时器
while
(1)
{
if(s1==0)
{
display(shi,fen);
}
k=key();
if(k==1)
{
s1++;
}
if(s1!
=0)
{
TR1=0;
if(s1==1)
{
if(k==2)shi++;
if(k==3)shi--;
if(k==5)fen++;
if(k==6)fen--;
P2=0xfe;
display(shi,fen);
}
if(s1==2)
{
if(k==2)shi1k++;
if(k==3)shi1k--;
if(k==5)fen1k++;
if(k==6)fen1k--;
P2=0xfd;
display(shi1k,fen1k);
}
if(s1==3)
{
if(k==2)shi1g++;
if(k==3)shi1g--;
if(k==5)fen1g++;
if(k==6)fen1g--;
P2=0xff;
display(shi1g,fen1g);
}
if(s1==4)
{
if(k==2)shi2k++;
if(k==3)shi2k--;
if(k==5)fen2k++;
if(k==6)fen2k--;
P2=0xfb;
display(shi2k,fen2k);
}
if(s1==5)
{
if(k==2)shi2g++;
if(k==3)shi2g--;
if(k==5)fen2g++;
if(k==6)fen2g--;
P2=0xff;
display(shi2g,fen2g);
}
if(s1==6)
{
if(k==2)shi3k++;
if(k==3)shi3k--;
if(k==5)fen3k++;
if(k==6)fen3k--;
P2=0xf7;
display(shi3k,fen3k);
}
if(s1==7)
{
if(k==2)shi3g++;
if(k==3)shi3g--;
if(k==5)fen3g++;
if(k==6)fen3g--;
P2=0xff;
display(shi3g,fen3g);
}
if(s1==8)
{
if(k==2)shi4k++;
if(k==3)shi4k--;
if(k==5)fen4k++;
if(k==6)fen4k--;
P2=0xef;
display(shi4k,fen4k);
}
if(s1==9)
{
if(k==2)shi4g++;
if(k==3)shi4g--;
if(k==5)fen4g++;
if(k==6)fen4g--;
P2=0xff;
display(shi4g,fen4g);
}
if(s1==10)
{
s1=0;
TR1=1;
sflag=1;
}
}
if(s1==0&&sflag==1)
{
if(shi==shi1k&&fen==fen1k){out1=0;D9=0;}
if(shi==shi1g&&fen==fen1g){out1=1;D9=1;}
if(shi==shi2k&&fen==fen2k)D10=0;
if(shi==shi2g&&fen==fen2g)D10=1;
if(shi==shi3k&&fen==fen3k)D11=0;
if(shi==shi3g&&fen==fen3g)D11=1;
if(shi==shi4k&&fen==fen4k)D12=0;
if(shi==shi4g&&fen==fen4g)D12=1;
}
}
}
unsignedcharkey()
{
uchartemp1,temp2,k=0;
P0=0xff;//将P0口(列线)全部送高电平
H1=0;
H2=1;
temp1=P0;//读取P0口当前的状态赋给temp,例如为11011111
temp1=temp1&0xe0;//将temp和0xe0进行与运算(11100000),结果为11000000
if(temp1!
=0xe0)//如果temp不等于0xe0,则说明有按键按下
{
Delay10ms();//延时去抖操作
temp1=P0;//再重复一次上述操作
temp1=temp1&0xe0;
if(temp1!
=0xe0)
{
temp1=P0;
//如果有按键按下,则将标志位置1?
switch(temp1)//判断按下的是该行的第几列
{
case0xdf:
k=1;break;//11011111,第一行第一列
case0xbf:
k=2;break;//10111111,第一行,第二列
case0x7f:
k=3;break;//01111111,第一行,第三列
}
while(temp1!
=0xe0)//等待按键释放,只要结果不等于0xe0,则说明按键没有被释放
{
temp1=P0;
temp1=temp1&0xe0;
}
}
}
P0=0xff;//将P0口(列线)全部送高电平
H1=1;
H2=0;
temp2=P0;//读取P0口当前的状态赋给temp,例如为11011111
temp2=temp2&0xe0;//将temp和0xe0进行与运算(11100000),结果为11000000
if(temp2!
=0xe0)//如果temp不等于0xe0,则说明有按键按下
{
Delay10ms();//延时去抖操作
temp2=P0;//再重复一次上述操作
temp2=temp2&0xe0;
if(temp2!
=0xe0)
{
temp2=P0;
switch(temp2)//判断按下的是该行的第几列
{
case0xdf:
k=4;break;//11011111,第二行第一列
case0xbf:
k=5;break;//10111111,第二行,第二列
case0x7f:
k=6;break;//01111111,第二行,第三列
}
while(temp2!
=0xe0)//等待按键释放,只要结果不等于0xe0,则说明按键没有被释放
{
temp2=P0;
temp2=temp2&0xe0;
}
}
}
returnk;
}
voidtime1()interrupt3//定时器1的中断服务
{
TH1=0xd8;
TL1=0xf0;
num++;
if(num==100)//到了100次,1秒时间到,代表1分钟时间到
{
num=0;
fen++;
if(fen==60)//到60后清零
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
voidDelay10ms()
{
unsignedchari,j,g;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
for(g=0;g<248;g++);
}
voiddisplay(unsignedcharshi,unsignedcharfen)
{unsignedcharm;
table3[0]=fen%10;
table3[1]=fen/10;
table3[2]=shi%10;
table3[3]=shi/10;
for(m=0;m<4;m++)
{
P0=table2[m];P1=table1[table3[m]];
Delay10ms();
}
if(m==4)
m=0;
}
附2:
系统原理图