四路定时控制器课程设计.docx
- 文档编号:9617304
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:33
- 大小:772.44KB
四路定时控制器课程设计.docx
《四路定时控制器课程设计.docx》由会员分享,可在线阅读,更多相关《四路定时控制器课程设计.docx(33页珍藏版)》请在冰豆网上搜索。
四路定时控制器课程设计
单片机专业机
课程设计
题 目 名 称:
四路定时控制器
摘要
本次设计的目的就是让我们在理论学习的基础上,通过完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用,使我们学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。
这里我们采用单片机STC10F08XE芯片为中心器件,结合实用性和器件条件,设计了一个简单的四路定时控制器,系统操作简单、实用性强、扩展性强。
单片机定时控制系统最基本的要求是可以实现定时控制,要实现这一功能只要在定时器程序中加判断指令,当判断成立时,即执行预设的动作,达到定时控制的目的。
其主要应用于定时控制四个回路的电源通断,通过定时来实现以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关,也可以自己设定时间段,来控制电路的通断,同时我们也利用了数码管来显示当前时间,利用四个发光二极管分别显示四路控制电路是否工作,更加直接明了。
关键字:
四路定时器智能控制开关
目录
1、概述3
1.1实验要求3
1.2实验原理3
2、总体方案及硬件设计4
2.1总体方案4
2.2硬件设计4
3、软件设计6
3.1程序设计6
4、仿真模拟7
4.1multisim模拟7
5、心得体会8
参考文献9
程序清单11
实物电路28
1、概述
1.1实验要求
1.主要应用于定时控制四个回路的电源通断。
2.以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关。
如可以设置第一个回路在8:
30-11:
30开,14:
30-18:
00开,其他时间段为关。
3.能通过按键任意设置某回路某时间段的开关状态,并利用数码管显示当前时间,利用四个发光二极管分别显示四路控制电路的通断,直接明了。
1.2实验原理
结合我们对理论知识的学习,完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用。
这里我们采用单片机STC10F08XE芯片为中心器件,结合实用性和器件条件,设计了一个简单的四路定时控制器,系统操作简单、实用性强、扩展性强。
单片机定时控制系统最基本的要求是可以实现定时控制,要实现这一功能只要在程要在定时器程序中加判断指令,当判断成立时,即执行预设的动作,达到定时控制的目的。
其主要应用于定时控制四个回路的电源通断,通过定时器来实现时钟和定时功能,当判断成立时时,即通过程序命令预设的I/O口输出相应电平来控制外围的控制电路,即继电器控制显示电路。
继电器工作原理:
其一般由铁芯、线圈、衔铁、触点簧片等组成的。
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。
这样吸合、释放,从而达到了在电路中的导通、切断的目的。
对于继电器的“常开、常闭”触点,可以这样来区分:
继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
继电器一般有两股电路,为低压控制电路和高压工作电路。
所以我们就利用继电器此特性,加上单片机IO口电压的控制,即完成了四路定时控制器。
2、总体方案及硬件设计
2.1总体方案
整个定时控制系统电路可分为四大部分:
电源电路、核心芯片、显示部分、控制部分。
电源电路、核心芯片、显示部分,由开发板集成真题提供。
电源电路
数码管显示电路
选择、输入电路
核心芯片
开发板
控制电路
2.2硬件设计
1.核心芯片:
STC11/10xx系列单片机是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成高可靠复位电路,针对高速通信,智能控制,强干扰场合。
定时器0/定时器1/串行口与传统8051兼容,增加了独立波特率发生器,省去了定时器2.传统8051的111条指令执行速度全面提速,最快的指令快24倍,最慢的指令快3倍1.增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.
1.显示部分:
数码管是时钟最为重要的部分,共需要8位LED显示器。
采用动态显示方式,由于端口的问题以及动态显示方式的优越性,在此设计的连接方式上采用共阴级接法。
显示器LED有段选和位选两个端口,首先说段选端,它由LED八个端口构成,通过对这八个端口输入的不同的二进制数据使得它的显示也不同,可以通过控制输入二进制的信息来达到我们所需的时间的动态显示,从而满足我们时间准确显示的目的。
1.控制电路:
此电路主要是利用四个继电器工作组集成的
继电器电路:
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。
这样吸合、释放,从而达到了在电路中的导通、切断的目的。
3、软件设计
3.1程序设计
开始
程序流程如下:
程序初始化
Y
时间调整
按键调整
N
灯灭
灯亮
继电器断开
继电器闭合
控制电路
Y
Y
N
N
S定时时间到
P定时时间到
时间显示
4、仿真模拟
4.1proteus模拟
实物连接图:
5、心得体会
通过这次实训,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细,一个地方出错就可能会整个系统失效。
在硬件设计时,我们得注意3方面:
1,我们在设计电路时一定要事先把相关的参数计算正确,否则焊出来的电路毛病百出;2如果有条件一定要进行仿真模拟,这样可以对自己设计的电路有一定的监测作用;3最后在焊接电路时一定先进行模拟排布,达到美观实用可靠。
在软件调试过程中我们需要注意四方面,就拿我们这个定时器电路来说吧,1,先整体把握,先把主要的重要的程序段写出来,先进行调试,调试成功后,在进行下一步操作,切不可一下子把程序全部写完,在调试监测;2,写程序时最好按功能分段进行处理,一方面美观,有条理,另一方面也方便我们进行调试和修改;3,关于定时器程序,一方面我们必须把计数初值计算正确,另一方面得把程序的逻辑时间很清楚,4,对于按键监测,我们最好加上消抖程序,谨防按键操作时,出现混乱情况;
在写调整时间程序时,当按选择键择选要调整时还是秒或分时,看不出是要调整那一位为了方便用户看出现在是在调整那一位,就必须使调整位闪烁,但显示的时候已经用动态显示,如果直接改显示时间,就会使所有的位都闪烁,这样根本就不能实现,后面经过和同学讨论,我使不调的位显示4到5次再显示调整位1次,这样做最后就可以实现了,而且这样做还可以改变闪烁速度。
在软件设计时,还遇到了许多问题,毕竟想像和现实还是有很大的区别的,然而到了最后这些问题都一一被解决了,我也在这次实训中学会了很多东西,总结出自已的一套解决问题的方法,这让我觉得自已有了很大的收获,为今后的学习和工作打下了坚定的基础。
参考文献
[1]余发山王福忠杨凌霄王荷.《微机原理与单片机接口技术》北京:
煤炭工业出版社。
[2]康华光.《电子技术基础》北京:
高等教育出版社。
程序清单
主程序:
#include"stc10.h"
#include"Cotrolauto.h"
voiddelay(intz);
voiddisplay(unsignedintfen,unsignedmiao);//函数定义
main()
{
TMOD=0X01;//设置为定时器1为定时模式
TH1=0X3C;
TL1=0XAF;//设置定时初值记满为5ms
EA=1;//打开总中断
ET1=1;//打开定时器1中断
TR1=1;//允许定时
P1M1=0x00;//把P1口设置为推挽式
P1M0=0xff;
P3=0xff;
while
(1)
{
display(fen,miao);//数码管一直在扫描状态
if(date>200)//定时器记200次约为一秒秒数加一
{
miao++;
if(miao>59)
{
miao=0;
fen++;
if(fen>59)
{
fen=0;
}
}
date=0;
}
if(f11==fen&&m11==miao)
out1=0;
if(f12==fen&&m12==miao)
{
out1=0xff;
L1=0xff;
}
if(f21==fen&&m21==miao)
out2=0;
if(f22==fen&&m22==miao)
{
out2=0xff;
L2=0xff;
}
if(f31==fen&&m31==miao)
out3=0;
if(f32==fen&&m32==miao)
{
out3=0xff;
L3=0xff;
}
if(f41==fen&&m41==miao)
out4=0;
if(f42==fen&&m42==miao)
{
out4=0xff;
L4=0xff;
}
num=0;snum=0;
skey1=0;skey2=1;//时钟调时
if(key3==0)//key3为设置键
{
miao=0;fen=0;
k1=0;k2=0;
while(num<3)
{
if(key3==0)
{
delay
(1);
while(key3==0);
num++;//防止按键抖动
}
if(num==1)//设置键按第一下改秒上的数码管
{
if(key2==0)
{
delay
(1);
while(key2==0);
miao++;//key2键按下松开记一次数
}
display(0,miao);//显示秒上的数
if(miao==60)//如果秒加到60让秒变为0;
miao=0;
if(key1==0)//key1按键按下松开时分减1次数
{
delay
(1);
while(key1==0);
miao--;
if(miao==0)
miao=59;
}
delay
(1);
}
elseif(num==2)//当设置键按第二次时开始设置分
{
if(key2==0)//key2按键按下松开时分加1次数
{
delay
(1);
while(key2==0);
fen++;
if(fen==60)fen=0;//加到60清0
}
if(key1==0)//key1按键按下松开时分减1次数
{
delay
(1);
while(key1==0);
fen--;//减到0恢复到59
if(fen==0)
fen=59;
}
display(fen,miao);
delay
(1);
}
}
}
jd();
}
}
voidtime1(void)interrupt3
{
TH1=0X3C;
TL1=0XAF;//定时器重新附初值
date++;
}
调用程序(Cotrolauto.h):
sbitskey1=P3^6;
sbitskey2=P3^7;
sbitkey1=P0^5;
sbitkey2=P0^6;
sbitkey3=P0^7;//定义行与列的不同按键
sbitout1=P2^6;//定义四个继电器控制
sbitout2=P2^4;
sbitout3=P2^3;
sbitout4=P2^1;
sbitk1=P2^7;
sbitk2=P2^5;
sbitk3=P2^2;
sbitk4=P2^0;
sbitL1=P3^5;
sbitL2=P3^4;
sbitL3=P3^3;
sbitL4=P3^2;
unsignedintfen=0,miao=0,date,num,snum;
unsignedintf11=1,m11=1,f12=1,m12=1,f21=1,m21=1,f22=1,m22=1,f31=1,m31=1,f32=1,m32=1,f41=1,f42=1,m41=1,m42=1;
inti;
unsignedinttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//数组共阴数码管显示从0到9
unsignedintwei[]={0xf7,0xfb,0xfd,0xfe};//数码管位定义
voiddelay(intz)//延时函数
{
inti,j;
for(i=0;i<1000;i++)
for(j=0;j } voiddisplay(unsignedintfen,unsignedintmiao)//数码管扫描函数 { P1=table[miao%10]; P0=wei[0]; delay (1); P1=table[miao/10]; P0=wei[1]; delay (1); P1=table[fen%10]; P0=wei[2]; delay (1); P1=table[fen/10]; P0=wei[3]; delay (1); } voidjd() { if(k1==0)//继电器1 { delay(5); snum=0; while(k1==0) { L1=0; skey1=1; skey2=0;//定时调时 if(key3==0)//key3为设置键 { m11=m12=0;f11=f12=0; while(snum<5) { if(key3==0) { delay (1); while(key3==0); snum++;//防止按键抖动 } if(snum==1)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m11++;//key2键按下松开记一次数 } m12=m11; display(0,m11);//显示秒上的数 if(m11==60)//如果秒加到60让秒变为0; m11=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m11--; if(m11==0) m11=59; } delay (1); } elseif(snum==2)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { delay (1); while(key2==0); f11++; if(f11==60)f11=0;//加到60清0 } if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); f11--;//减到0恢复到59 if(f11==0) f11=59; } f12=f11; m12=m11; display(f11,m11); delay (1); } elseif(snum==3)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m12++;//key2键按下松开记一次数 } display(0,m12);//显示秒上的数 if(m12==60)//如果秒加到60让秒变为0; m12=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m12--; if(m12==0) m12=59; } delay (1); } elseif(snum==4)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { delay (1); while(key2==0); f12++; if(f12==60)f12=0;//加到60清0 } if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); f12--;//减到0恢复到59 if(f12==0) f12=59; } display(f12,m12); delay (1); } } } } } if(k2==0)//继电器2 { snum=0; delay(5); while(k2==0) { L2=0; skey1=1;skey2=0;//定时调时 if(key3==0)//key3为设置键 { m21=m22=0;f21=f22=0; while(snum<5) { if(key3==0) { delay (1); while(key3==0); snum++;//防止按键抖动 } if(snum==1)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m21++;//key2键按下松开记一次数 } m22=m21; display(0,m21);//显示秒上的数 if(m21==60)//如果秒加到60让秒变为0; m21=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m21--; if(m21==0) m21=59; } delay (1); } elseif(snum==2)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { delay (1); while(key2==0); f21++; if(f21==60)f21=0;//加到60清0 } if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); f21--;//减到0恢复到59 if(f21==0) f21=59; } f22=f21; m22=m21; display(f21,m21); delay (1); } elseif(snum==3)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m22++;//key2键按下松开记一次数 } display(0,m22);//显示秒上的数 if(m22==60)//如果秒加到60让秒变为0; m22=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m22--; if(m22==0) m22=59; } delay (1); } elseif(snum==4)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { delay (1); while(key2==0); f22++; if(f22==60)f22=0;//加到60清0 } if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); f22--;//减到0恢复到59 if(f22==0) f22=59; } display(f22,m22); delay (1); } } } } } if(k3==0)//继电器3 { snum=0; delay(5); while(k3==0) { L3=0; skey1=1;skey2=0;//定时调时 if(key3==0)//key3为设置键 { m31=m32=0;f31=f32=0; while(snum<5) { if(key3==0) { delay (1); while(key3==0); snum++;//防止按键抖动 } if(snum==1)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m31++;//key2键按下松开记一次数 } m32=m31; display(0,m31);//显示秒上的数 if(m31==60)//如果秒加到60让秒变为0; m31=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m31--; if(m31==0) m31=59; } delay (1); } elseif(snum==2)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { delay (1); while(key2==0); f31++; if(f31==60)f31=0;//加到60清0 } if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); f31--;//减到0恢复到59 if(f31==0) f31=59; } f32=f31; m32=m31; display(f31,m31); delay (1); } elseif(snum==3)//设置键按第一下改秒上的数码管 { if(key2==0) { delay (1); while(key2==0); m32++;//key2键按下松开记一次数 } display(0,m12);//显示秒上的数 if(m32==60)//如果秒加到60让秒变为0; m32=0; if(key1==0)//key1按键按下松开时分减1次数 { delay (1); while(key1==0); m32--; if(m32==0) m32=59; } delay (1); } elseif(snum==4)//当设置键按第二次时开始设置分 { if(key2==0)//key2按键按下松开时分加1次数 { del
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 四路 定时 控制器 课程设计