基于单片机的声光控延时灯.docx
《基于单片机的声光控延时灯.docx》由会员分享,可在线阅读,更多相关《基于单片机的声光控延时灯.docx(16页珍藏版)》请在冰豆网上搜索。
基于单片机的声光控延时灯
基于单片机的声光控灯
摘要
随着社会和科技的不断进步,人们对低碳生活逐步认识和接受,并从很多方面开始关注,尤其是在环保上做出了很多努力。
利用声音和光线的强弱来控制开关的断开或者闭合的电子产品来能够有效的降低能耗,节约能源。
它不仅适用于住宅区的楼道,而且适用于工厂、办公室、教学楼等公共场所。
因此,声光控制开关,在我们的低碳生活中,将起到重要作用。
该设计主要由STC89C51单片机、±15V和5V的电压源电路、声音的接收放大控制电路、光信号的接收放大控制电路组成,以与设计实现光控灯和声控灯的原理,与制作过程中遇到的问题和相应的解决方案。
测试结果证明该系统性能稳定、操作方便,具有较高的实用价值。
本文对控制系统的组成、硬件和软件的设计、工作原理进行了详细的论述。
方案比较与论证
我们开始在做设计自动照明控制器时,想到了几个方案,但比较之后最终确定了这个方案,最初拿到题目,我们想到了老师时讲过的一个声光控的原理图,如下图:
但这个电路图稍显复杂,而且不能完全达到题目的要求,我们又在稍微改进的基础上加上了单片机和时钟芯片来达到定时灯亮灯灭和灯亮延时的要求,改进后的电路图如下:
图2 声光控制电路
理论分析与计算
本设计的硬件设计的重点在于光信号和声音信号的接受控制电路、单片机的最小电路以与时钟芯片的控制电路。
光信号控制电路部分采用光敏电阻对光进行接收,并经过放大输出给单片机;声音信号控制电路采用驻极体话筒来采集声音,经过放大输出给单片机;单片机把处理好的信号发送给三极管用于驱动LED灯,时钟芯片用于定时控制灯的亮灭。
光控电路
由光敏电阻,滑动变阻器,PNP三极管和与非门组成,如下图3所示:
光控电路通过光照改变光敏电阻的阻值大小和声控电路组合后来控制PNP三极管送到单片机来控制灯的亮灭,当光敏电阻受光照时,电阻小,与非门的一端为低电平;当光照较弱时,电阻增加,与非门的一端为高电平。
光控电路和声控电路的输出信号经与非门后经三极管放大,将比较微弱的电流信号放大到单片机能够识别的电流,然后由三极管的发射集放大后的信号传给单片机的I/O口。
电路图中滑动变阻器控制整个光控电路对光信号的灵敏度。
声控电路
声控电路通过话驻极体话筒将声音转化成电信号,经电容耦合到三极管的基极,通过控制三极管的饱和、截止来控制输出电平的高低,然后输送到与非门和光控电路组合输送到单片机;拾音电路将声音转换成微弱的电压信号。
然后,微弱的电压信号经过三极管放大,声控电路电路信号和光控电路信号通过与非门传给单片机的I/O口。
R4和c1有一定的延时效果,可以去除干扰信号。
图4声控电路图
单片机控制电路
单片机根据声控电路、光控电路输入的信号来判断输出端电平的高低,从而控制灯亮灭;单片机也控制灯亮的的延迟时间。
单片机的输出的电流比较小,不能够驱动灯的亮灭,灯的驱动由三极管组成给单片机的输出电流进行补偿,来驱动灯的亮灭。
P1.0作为声光控信号的输入口;(高电平有效);P1.1作为驱动电路的输出口;(高电平有效);P1.6接数码管用于显示延时时间;P1.7用于接按键用于调节延时时间。
图5单片机控制电路
单片机控制程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitsm=P1^0;
sbitds=P1^1;
sbitLE=P1^6;
sbitkeyt=P1^7;
uinttt,sec,min,aa;
ucharcodetiming[]={0x3f,0x06,
0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71};
voidyanshi();
voidkeytt();
voiddelay(uint);
voidinin()
{
sm=1;
ds=0;
tt=0;
sec=0;
min=0;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
}
voidlight()
{
if(sm==0)
ds=1;
if(ds==1)
TR0=1;
}
voidyanshi()
{
if(tt==20)
{
tt=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==aa)
{
TR0=0;
inin();
}
}
}
}
voidkeytt()
{
if(keyt==0)
{
delay(5);
if(keyt==0)
{
aa++;
P0=timing[aa];
if(aa==5)
aa=1;
delay(5);
}
}
}
voidmain()
{
keyt=1;
LE=0;
aa=2;
P0=timing[aa];
inin();
while
(1)
{
keytt();
light();
yanshi();
}
}
voiddelay(uintz)
{
uinti,j;
for(i=1000;i>0;i--)
for(j=z;j>0;j--);
}
voidtimer0()interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}
时钟芯片控制电路
图6定时电路
DS1302的复位脚RST接单片机的P3.5脚,输入输出引脚I/O接单片机的P3.4脚,串行时钟SCLK接单片机的P3.6脚,通过
对DS1302输入程序,将定时时间显示在数码管上,通过单片机来控制灯的特定时间的亮灭。
定时程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSCK=P3^6;//时钟
sbitSDA=P3^4;//数据
sbitRST=P3^5;//CE端口控制复位?
uintk,num;
bitreadrtc_flag;//定义标志
uchartempdata[7]={0,0,12,13,7,2,12};
uchartempdisplay[8];
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
ucharcodeWAN[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//ucharread_ds1302(uchartemp);
/*定时器0初始化*/
voidinin()
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
EA=1;
ET0=1;
TR0=1;
num=0;
k=0;
}
/*八次写一个字节*/
voidwrite_ds1302_byte(uchartemp)
{
uchari;
for(i=0;i<8;i++)
{
SCK=1;
SDA=temp&0x01;
_nop_();
SCK=0;
temp>>=1;
}
}
/*写入ds1302*/
voidwrite_ds1302(ucharaddress,uchardat)
{
RST=0;//////数据、地址传送中止
_nop_();
SCK=0;
_nop_();//////一个机器周期
RST=1;/////逻辑控制有效
_nop_();
write_ds1302_byte(address);
write_ds1302_byte(dat);
RST=0;
}
/*写时钟初值*/
voidset_rtc()
{
uchari,temp;
for(i=0;i<7;i++)
{
temp=tempdata[i]/10;
tempdata[i]=tempdata[i]%10;
tempdata[i]=tempdata[i]+temp*16;
}
write_ds1302(0x8e,0x00);//停止写保护
write_ds1302(0x80,tempdata[0]);
write_ds1302(0x82,tempdata[1]);
write_ds1302(0x84,tempdata[2]);
write_ds1302(0x86,tempdata[3]);
write_ds1302(0x88,tempdata[4]);
write_ds1302(0x8a,tempdata[5]);
write_ds1302(0x8c,tempdata[6]);
write_ds1302(0x8e,0x80);//写保护
/*tempdisplay[7]=tempdata[2]/16;
tempdisplay[6]=tempdata[2]&0x0f;
tempdisplay[5]=10;
tempdisplay[4]=tempdata[1]/16;
tempdisplay[3]=tempdata[1]&0x0f;
tempdisplay[2]=10;
tempdisplay[1]=tempdata[0]/16;
tempdisplay[0]=tempdata[0]&0x0f;*/
}
/*读出时间到tempdata中*/
ucharread_ds1302(ucharaddress)
{
uchari;
uchartmp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
write_ds1302_byte(address);
for(i=0;i<8;i++)
{
tmp>>=1;
SCK=1;
if(SDA)
tmp|=0x80;
SCK=0;
_nop_();
}
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return(tmp);
}
/*读时钟数据*/
voidread_rct()
{
uchari,temp;
tempdata[0]=read_ds1302(0x81);
tempdata[1]=read_ds1302(0x83);
tempdata[2]=read_ds1302(0x85);
tempdata[3]=read_ds1302(0x87);
tempdata[4]=read_ds1302(0x89);
tempdata[5]=read_ds1302(0x8b);
tempdata[6]=read_ds1302(0x8d);
for(i=0;i<7;i++)
{
temp=tempdata[i]/16;
tempdata[i]=tempdata[i]%16;
tempdata[i]=tempdata[i]+temp*10;
}
}
/*主程序*/
voidmain()
{
inin();//初始化定时器0
set_rtc();//写入时钟初值
while
(1)
{
if(readrtc_flag)
{
readrtc_flag=0;
//read_rct();
tempdisplay[7]=tempdata[2]/10;
tempdisplay[6]=tempdata[2]%10;
tempdisplay[5]=10;
tempdisplay[4]=tempdata[1]/10;
tempdisplay[3]=tempdata[1]%10;
tempdisplay[2]=10;
tempdisplay[1]=tempdata[0]/10;
tempdisplay[0]=tempdata[0]%10;
}
}
}
voidtimer0()interrupt1
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P2=WAN[k];
P0=table[tempdisplay[k]];
k++;
if(k==8)
{
k=0;
num++;
if(num==2)
{
readrtc_flag=1;
num=0;
}
}
}
结论
本设计是基于单片机的声光控制,实用性强,应用围广,适合于家庭、办公室、楼房、商店等场所使用。
本设计是用单片机来实现开关的延时。
本文从原理出发,介绍了本系统各个单元模块的电路原理和实现的功能,通过声音的采集、放大并经过与非门以传送到单片机;利用光敏电阻的随光照强度增强而阻值变小的特性,并结合三极管和电流放大输送到单片机来达到光控的目的。
通过本次的设计学习,使我更加深了对课本的了解。
将我学到的知识应用到了实践当中,深化了对设计的认识。
使我在设计实践中获得新知识,在老师和同学的关怀帮助下,让我们学会了分析和设计电路的步骤。
同时,也培养了我们的团队精神,是一次很好的锻炼机会。