智能时控开关设计左敬龙广东石油化工学院Word下载.docx
《智能时控开关设计左敬龙广东石油化工学院Word下载.docx》由会员分享,可在线阅读,更多相关《智能时控开关设计左敬龙广东石油化工学院Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
6、附录112
题目:
智能时控开关设计
班级:
电信12-1姓名:
李玉全
摘要:
本系统通过单片机的定时器功能,利用按键及数码管的显示功能,实现了开关的时控功能。
通过按键输入调节时间的数字键,k1,使装置处于运行或设置状态,k2,能够实现时间调节的增加或减少,k3,k4,k5,分别用于调节时间的时,分,秒位,实现24小时的显示和定时功能,最小定时时间为1秒钟,最大定时时间为24小时。
定时时间到时,用发光二极管闪烁及蜂鸣器发声提示。
人工干预后停止闪烁及发声,并用发光管指示开关状态。
关键词:
电子线路、单片机、开关定时、数码管、蜂鸣器。
1、引言
随着科学技术和社会经济的迅猛发展,人类社会中自动控制,智能控制越来越普及,而单片机正是这种技术普及的基础。
顺着单片机的生产技术和其本身的性能的快速提高,以及单片机的价格便宜等因素,单片机被应用于非常广泛的领域。
本文中的智能时控开关就是应用单片机来实现的。
主要应用到了单片机的定时器模块,输入输出模块按键的输入和显示功能来实现了对外部开关的实时控制。
同时,近年来顺着声控开关的广泛应用,其方便人们的同时,缺点也是逐渐被人们发现。
例如外部噪音的存在也会使声控开关点亮电灯,那样会使得开关的节能性能不是很好。
所以人们希望通过实时控制开关来控制电灯。
顺着单片机的功能不断完善和其价格的大众化,使得智能时控开关得到广泛的应用。
与此同时,智能时控开关还能运用于其他很多的领域,所以本文所研究的智能失控开关具有重要的意义。
本文所应用的基本程序来之实验室的普中科技实验板的相关质料。
数码管的动态显示功能,在基础程序之上进行改进添加自己的元素实现实验的基本功能。
李玉全
2014年11月16日星期日
2、总体设计方案
2.1.1设计思路
用STC89C51芯片进行控制,使用数码管显示时间和倒计时的时间显示,用按键来调节定时时间的长度等,首先是画出仿真电路图,然后根据自己画出的电路图来进行编写程序,使得电路正常运作,从而实现了定时开关的功能。
2.1.2方案确立
方案一:
使用STC89C51作为核心芯片来控制整个电路的运作,使用8位数码管来显示小时,分钟,和秒,中间用一条短的横线来隔开时分秒,这样就使得显示更加直观易懂。
使用普通的按键来进行时间的调节,比如定时时间的增加或者减少,开关的停止和开启等功能。
方案二:
同样是使用STC89C51作为核心的控制芯片,不同的是,另外加一个DS1302外加时钟的定时功能。
按键用4*4的矩阵键盘来进行时间,功能的调节。
方案一和方案二比较,我选择了方案一,原因是方案一的设计相对比较简单,容易实现,而且如果是做成实物的话,成本大大的减少,操作方便等优势。
客户容易掌握其使用的方法。
因此我选择了方案一。
2.1.3设计方框图
图1、设计方框图
3、设计原理分析
3.1主程序流程图
图2、主程序流程图
3.2各部分电路设计
3.2.1单片机最小系统设计
AT89C51是各单片机中最为典型和最有代表性的一种是一种带4KB闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的单片机,可稳定地工作于5V的电源下。
其集成度高、功能强、能耗低、通用性好、价格便宜。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
其组合而成的配件产品在日常生活的使用过程中非常方便、简单且实用,深受着广大消费者的喜爱。
AT89C51管脚说明如下:
P0口:
P0口为三态双向口,能带8个TTL电路。
有两种功能:
第一功能是一个8位漏极开路型的双向I/O口,这时P0口可看做数据总线;
第二功能是在访问外部存储器时,分时提供低8位地址和8位双向数据总线,这时先用做地址总线再用做数据总线。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P0口内部无上拉电阻,作为I/O口使用时,必须外接上拉电阻。
P1口:
P1口是一个内部带上拉电阻的8位准双向I/O口(使用前有一个准备动作),负载能力为4个TTL电路。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部带上拉电阻的8位准双向I/O口,P2口缓冲器可接收、输出4个TTL门电流。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
3.2.2时钟电路
单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本系统中AT89C51单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
AT98C51单片机的时钟电路如图3所示。
单片机的时钟产生方法有两种:
3.2.3复位电路
复位是单片机的初始化操作。
单片机系统在上电启动运行时,都需要先复位。
其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
单片机的外部复位电路有上电自动复位和按键手动复位两种。
本系统中AT89C51单片机采用上电加按键手动复位电路,如图3所示。
图3、单片机的复位电路
3.2.4显示电路
将单片机P0口的P0.0~P0.6分别接到数码管的ABCDEFG上作为段选端口,然后将单片机的P1口的P1.0~P1.1分别接到数码管的12345678位选端口上。
就可以构成了数码管的显示电路了,如下图4所示。
图4、数码管的显示电路
3.2.5调时模块设计
当k1接地时,处于设置时间状态。
当k1高电平时,处于工作状态。
Ke2高电平时用于调节时间的增加。
处于低电平时用于调节时间的减少。
K3,k4,k5,分别用于调节时间的时,分,秒位。
如图5所示
图5、调时模块设计
3.2.6整体电路图
图6、整体电路图
3.2.7实物连接图
图7、实物连接图
4、结束语
经过将近一周的单片机课程设计,我有了很多的体会和感想。
通过本次对定时开关的设计,我对单片机这门课程有了更进一步的了解。
无论是在其硬件连接方面还是在软件编程方面,都取得了新的收获。
在对单片机编程方面,我们又掌握了一些新的编程思想,使得程序更为简练、易懂,而且更为严谨,程序执行的稳定性得到了提高,以前在学单片机这门课程时只是对其理论知识有了初步的了解。
通过本次实验,我们对它的工作原理彻底理解了,对其启动设置、转换结束判断以及输出控制等都基本掌握。
电路连接方面,我们对其与单片机的连接也有了更为直观的认识,通过实验的摸索以及必要的理论知识,我们准确的实现了它于单片机的互连。
我非常感激同组队员对我的的指导和帮助,没有他们的帮助,我还会做很多的无用功。
尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习。
最后感谢老师对我的精心指导和帮助,感谢同学们对我的帮助。
5、参考文献
[1] 郭天祥.51单片机c语言教程.北京:
电子工业出版,2009.12
[2] 张齐.单片机应用系统设计技术(第3版).北京:
电子工业出版社,2013.7
[3] 贾新章.电子线路CAD与优化设计.北京:
电子工业出版社,2014.4
6、附录1
C程序代码:
#include<
reg51.h>
sbitled=P3^6;
//定义led状态显示
charhour=23,minute=59,second=59;
unsignedchari=0;
unsignedcharTempData[8];
sbitKEY1=P2^2;
//定义设置按键
sbitKEY2=P2^3;
//定义加减按键
sbitKEY3=P2^4;
//定义小时调整按键
sbitKEY4=P2^5;
//定义分钟调整按键
sbitKEY5=P2^6;
//定义秒钟调整按键
sbitmotor=P2^7;
//定义开关开启按键
sbitbeep=P2^0;
//定义蜂鸣器输出端口
unsignedcharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharcodeweima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
voiddisplay(unsignedchara,unsignedcharb);
voiddelay1(unsignedcharnum);
voidKeyScan();
voidDataDeal();
voidTiner0_Init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
Tiner0_Init();
led=0;
motor=0;
TempData[0]=duanma[second%10];
TempData[1]=duanma[second/10];
TempData[2]=0x40;
TempData[3]=duanma[minute%10];
TempData[4]=duanma[minute/10];
TempData[5]=0x40;
TempData[6]=duanma[hour%10];
TempData[7]=duanma[hour/10];
display(0,8);
while
(1)
{
if(KEY1==1)
{
display(0,8);
//数码管显示函数
if((second==0)&
&
(minute==0)&
(hour==0))
{
TempData[0]=duanma[0];
TempData[1]=duanma[0];
TempData[2]=0x40;
TempData[3]=duanma[0];
TempData[4]=duanma[0];
TempData[5]=0x40;
TempData[6]=duanma[0];
TempData[7]=duanma[0];
motor=1;
led=1;
while
(1)
{
beep=~beep;
//蜂鸣器响
delay1(10000);
//蜂鸣器响的平率
}
}
else
motor=0;
}
}
else
{
KeyScan();
}
voidTiner0_isr()interrupt1
if(KEY1==1)
i++;
if((second!
=0)||(minute!
=0)||(hour!
=0))
if(i==20)
i=0;
second--;
if(second<
0)
{
second=59;
minute--;
if(minute<
{
minute=59;
hour--;
}
DataDeal();
voidDataDeal()
voiddisplay(unsignedchara,unsignedcharb)
staticunsignedcharc=0;
P0=0;
P1=weima[c+a];
P0=TempData[c];
c++;
if(c==b)
c=0;
voiddelay1(unsignedcharnum)//延时函数
while(num--);
voidKeyScan()//按键扫描函数
if(KEY1==0)
if((KEY3==0)||(KEY4==0)||(KEY5==0))
delay1(30);
if((KEY3==0)||(KEY4==0)||(KEY5==0))
if(KEY2==1)
{
if(KEY3==0)
{
while(!
KEY3);
if(hour<
24)
{
hour++;
if(hour==24)
{
hour=0;
}
}
if(KEY4==0)
KEY4);
if(minute<
60)
minute++;
if(minute==60)
minute=0;
if(KEY5==0)
KEY5);
if(second<
second++;
if(second==60)
second=0;
else
if(hour>
hour--;
if(hour==0)
if(minute>
minute--;
if(minute==0)
if(second>
second--;
if(second==0)