基于单片机的声光控制开关的设计Word格式文档下载.docx
《基于单片机的声光控制开关的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的声光控制开关的设计Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
在光线较暗时,负载电路进行声音检测。
用声音传感器将声音信号转换成电信号,从而推动触发工作。
当声强达到一定程度时使得灯泡自动点亮,经过内部设定的时间后,灯泡自动熄灭。
在延时部分采用单片机内部定时器从而实现不同时间的定时,并根据场所及使用人群的不同通过设置单片机引脚的状态来设置不同的延时时间值,并用LED动态显示方式显示倒计时等数据。
单片机通过继电器控制照明设备的打开或者关闭。
其原理框如图1所示:
图1、原理框图
2.1.1芯片AT89C51的介绍
AT89C51【6】是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器。
AT89C51单片机的可靠性高,体积小,功耗低,便于扩展,价格便宜,易于产品化。
◆该单片机中有一个8位的微处理器,包括了运算器和控制器两大部分,还增加了面向控制的处理功能。
◆具有5个中断源、2级中断优先权。
◆两个16位的定时器/计数器。
◆128字节数据存储器RAM/SFR,用以存放可以读/写的数据。
◆4个8位并行I/O端口P0~P3。
◆片内振荡器和时钟产生电路。
◆一个全双工的串行口,具有四种工作方式。
◆有21个特殊功能寄存器。
2.1.2外形及引脚排列
如图2所示,其引脚说明如下:
图2AT89C51的引脚排列
1.VCC:
运行和程序校验时接电源正端。
2.GND:
接地。
3.XTAL1:
输入到单片微机内部振荡器的反相放大器。
4.XTAL2:
反相放大器的输出,输入到内部时钟发生器。
5.P0口:
P0口为一个8位漏级开路双向I/O口,(作为总线时)能驱动8个LSTTL负载。
6.P1口:
P1口是一个8位准双向I/O口,P1口能驱动4个LSTTL负载。
7.P2口:
P2口为一个8位准双向I/O口,P2口可以驱动4个LSTTL负载。
8.P3口:
P3口管脚是8位准双向I/O口,具有内部上拉电路。
可以驱动8个LSTTL负载。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
9.RST:
复位输入信号,高电平有效。
在振荡器工作时,在RST上作用两个机器周期以上的高电平,将单片微机复位。
10.ALE/PROG:
在访问外部存储器或I/O时,用于锁存低8位地址,以实现低8位地址与数据的隔离。
11./PSEN:
片外程序存储器的读选通信号。
在由外部程序存储器取指期间,在每个机器周期中,当PSEN低电平有效时,程序存储器的内容被送上P0口。
12./EA/VPP:
片外程序存储器访问允许信号,低电平有效。
2.2单片机最小系统
单片机最小应用系统【6】,是指用最少的原件组成的单片机可以工作的系统。
对于51系列单片机来说,最小系统应包括单片机、复位电路、晶振电路。
最小系统电路图如3所示:
图3、单片机最小系统
2.2.1时钟电路
AT89C51单片机的时钟产生方法有两种。
内部时钟方式和外部时钟方式。
本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。
内部方式时,时钟发生器对振荡脉冲二分频。
系统对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性。
因此本系统的晶体振荡器的值为12MHZ,电容取30pF。
2.2.2复位电路
当操作或程序运行出错使系统处于死锁状态时,为了摆脱困境可以通过复位键重新启动。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位。
本设计使用的是按键手动复位。
手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮。
在按键复位的使用过程中,按键抖动现象是不容忽视的,所以为了确保按键的一次闭合单片机只处理一次,就必须在设计时考虑到抖动的消除。
2.3光信号检测电路
2.3.1光敏电阻介绍
光敏电阻是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;
入射光强,电阻减小,入射光弱,电阻增大。
本实验选用MG45型光敏电阻。
在黑暗条件下,光敏电阻的可达1~10M欧,在强光条件(100LX)下,阻值仅有几百至数千欧姆。
参数表1如下所示:
2.3.2光控部分原理
声光控制电路在光照强时电路不工作,所以单片机首先对关照进行检测,此处使用到光敏电阻、电压比较器、反相器等元件进行检测。
设计图如图4所示:
图4、光信号检测电路
在图2-3中LDR1为光敏电阻,光敏电阻器实现的功能是:
当有光照时,光敏电阻的阻值下降,这时的阻值仅有几百至数千欧姆,所以LM393反相输入端为高电平。
当光线不足或没有光线时,其阻值可以达到兆欧级以上,此时相当于电路处于断路状态,所以LM393反相输入端为低电平。
其中LM393为电压比较器【1】,当反相输入端的电位高于同相输入端时,LM393则输出一低电平。
而当同相输入端的电位高于反相输入端的电位时,LM393将会输出一高电平。
此时信号会经过具有施密特功能的74LS14反向器,变为低电平后送到单片机中,经过单片机检测是否有足够的光照,当光照不足时则进行声音检测。
在此电路中可以通过改变滑动变阻器的阻值来改变同相输入端的电压,从而改变对光照强度检测的灵敏度,以满足不同场所或人群的需要。
2.4声音信号检测电路
2.4.1驻极体话筒的介绍
驻极体话筒【11】具有体积小,电声性能好,结构简单,价格低廉等特点,在生活中应用非常广泛。
驻极体结构有振膜、背极、空隙三部分,这样在振膜与背极间形成一个具有定量电荷的电容结构。
驻极体是由进行特殊处理的高分子材料组成,这些高分子材料表面具有永久电荷(Q),总的电荷量是不变,当极板在声波压力下后退时,电容量减小,电容两极间的电压就会成反比的升高,反之电压就会成反比的降低。
最后再通过阻抗非常高的场效应将电容两端的电压取出来,同时进行放大,便可以得到和声音对应的电压了。
2.4.2AD0832的介绍
由于单片机无法对模拟信号进行识别,因此在对声音信号进行检测时首先要将声音信号对应的电压值转变成数字信号,所以此系统需要使用到A/D转换器。
本系统中使用到的是AD0832【2】,该芯片能将0~5V的模拟电压量转换为0~255级的数字量。
它具有易于和微处理器接口或独立使用的特点,其转换速度较高,250KHz时转换时间为32s。
可以显示0.00-5.0V的电压范围。
ADC0832的引脚介绍如下:
•CS_片选使能,低电平芯片使能。
•CH0模拟输入通道0,或作为IN+/-使用。
•CH1模拟输入通道1,或作为IN+/-使用。
•CLK芯片时钟输入。
•DI数据信号输入,选择通道控制。
•DO数据信号输出,转换数据输出。
•GND芯片参考0电位(地)。
•Vcc/REF电源输入及参考电压输入(复用)。
2.4.3声控部分原理
当单片机检测到光线不足时,便启动声音信号采集电路如图5所示:
图5声音信号采集电路
用驻极体话筒将得到与声音信号对应的电压值。
若有声音时则会输出一电压值,由于传声器转换的电压值非常小,所以必须将该电压经过LM324运算放大器进行放大,放大倍数为RV1/R9,RV1为可变电阻,通过调节其阻值使其放大倍数产生变化,起到了调节声音灵敏度的作用。
放大后的电压必须经过ADC0832进行模数转换,由单片机内部程序对转换值进行对比。
当值高于预设值时单片机启动T0计时中断和照明灯控制电路,使照明灯点亮,并通过数码管显示倒计时时间。
当没有声音或声音微弱时,系统不进行下一步的工作。
2.5延时时间显示电路
2.5.1数码管结构和分类
数码管【5】是一种半导体发光器件,其基本单元是发光二极管。
按发光二极管单元连接方式分为共阴极数码管和共阳极数码管。
共阴极数码管是指将所有发光二极管的阴极接到一起形成公共阴极。
如图6(c)所示,共阴数码管在应用时应将公共极接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极。
如图6(b)所示,在使用时应将公共阳极接+5V电压,当某一字段发光二极管的阴极端输入低电平时,相应字段就点亮。
(a)数码管引脚图(b)共阳极内部结构图(c)共阴极内部结构图
图2-5
2.5.2数码管驱动方式
数码管要正常显示【5】,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
①静态显示驱动:
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。
当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
这种方法的优点是占用CPU时间少,LED的亮度高,容易控制。
缺点是硬件电路比较复杂,功耗大,所需口线多,成本较高。
若显示位数增多,则静态显示方式很难适应。
②动态显示驱动:
数码管动态显示一般是将所有位的段选线的同名端联在一起,由一个8位I/O口控制,形成段选线的多路复用。
当单片机输出字形码时,所有数码管都接收到相同的字形码这就是动态驱动。
点亮时间为1~2ms,由于人眼有视觉暂留现象,就造成了多位同时点亮的假象。
2.5.3定时/计数部分
AT89C51芯片内有两个16位的定时/计数器,都可以由软件来设定。
在此设计中用到的是T0作为定时器。
由于在系统中需要设置延时时间电路,目的是在照明灯点亮后经过一定延时能自动熄灭。
电路中采用了单片机内部定时器。
2.5.4显示电路分析
系统功能中有一点是可以根据场所及使用人群的不同设置不同的延时时间值。
虽然动态显示的效果和静态显示是一样的,但动态显示能够节省大量的I/O端口,而且功耗更低。
所以设计中采用LED动态显示方式显示倒计时数据。
电路如图7所示:
图7、延时时间显示电路
由图可知采用了共阴极的2位数码显示管做显示电路,所以只要数码管的a、b、c、d、e、f、g、h引脚为高电平,那么其对应的二极管就会发光,使数码显示管显示0~9的编码见表2。
表2共阴极数码显示管字型代码
字型
共阴极代码
3FH
5
6DH
1
06H
6
7DH
2
5BH
7
07H
3
4FH
8
7FH
4
66H
9
6FH
为了实现不同场所及使用人群的不同而灯亮的时间不一,在单片机的P1口接入了三个按键。
电路如图7所示。
当单片机进行按键扫描时,如果P1.0口按下则灯亮时间为10s,并且显示器进行10s倒计时;
如果P1.1口按下则为20s倒计时;
如果P1.2口按下则为30s。
数码显示管的八位段选端接入单片机的P0口,而位选端由P2口控制,分别为P2.0口为十位,P2.1口为个位。
设计中采用了目前最常用的软件消抖的方法,选择5ms的延时来消除抖动,延时后在进行一次按键是否闭合。
图8、按键接口电路
图8中的按键部分可以进行扩展,如果接入一个键盘则可以对延时时间自行进行设置。
由于本设计中按键功能已经可以满足需要,所以没有进行扩展。
2.6总原理图
3.系统软件设计
本系统的软件设计是通过C语言进行编程,主要有主程序、键盘扫描程序、初始化程序、A/D转换程序、延时程序等部分组成。
主程序流程图如图9所示:
图9、系统流程图
3.1延时程序
在整个编写程序中要用到许多的延时,所以程序中包含一个大约为1ms的延时子程序,方便在程序中的调用,程序代码如下:
//延时子程序;
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=125;
y>
y--);
}
3.2按键扫描子程序
由于在P1口接入了三个按键,通过按键扫描来确定定时的时间长度,所以先写入一个按键扫描子程序,可在主程序中直接调用。
程序代码如下:
//键盘扫描函数;
voidkeyscan()
if(key1==0)
{
delay(5);
//消抖;
if(key1==0)//按下key1灯亮时间为10s;
{
temp=10;
//10s延时;
}
}
if(key2==0)
if(key2==0)//按下key2灯亮时间为20s;
temp=20;
}
if(key3==0)
{
delay(5);
if(key3==0)//按下key3灯亮时间为30s;
{
temp=30;
3.3LED显示程序
系统中通过数码管对不同延时时间进行显示,以便直观的看出系统可以自行选择灯亮的时间长度。
//显示数码管内容;
voiddisplay(ucharshi,ucharge)
P2=0xfe;
P0=table[shi];
delay
(1);
P2=0xfd;
P0=table[ge];
P2=0xfc;
3.4AD转换程序
ucharadc0832(unsignedcharch)//AD转换,返回结果;
{
uchari=0;
ucharj;
uintdat1=0;
uchardat2=0;
if(ch==0)ch=2;
if(ch==1)ch=3;
adDI=1;
_nop_();
adCS=0;
//拉低CS端;
adCLK=1;
//拉高CLK端;
adCLK=0;
//拉低CLK端,形成下降沿1;
adDI=ch&
0x1;
//拉低CLK端,形成下降沿2;
adDI=(ch>
>
1)&
//拉低CLK端,形成下降沿3;
//控制命令结束;
dat1=0;
for(i=0;
i<
8;
i++)
dat1|=adDO;
//收数据;
//形成一次时钟脉冲;
dat1<
<
=1;
if(i==7)dat1|=adDO;
}
j=0;
j=j|adDO;
j=j<
7;
dat2=dat2|j;
if(i<
7)dat2>
adCS=1;
//拉低CLK端;
adDO=1;
//拉高数据端,回到初始状态;
=8;
dat1|=dat2;
return(dat1);
3.5总程序
#include<
reg51.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
uchartemp,aa,bai,shi,ge,tt;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
////数码管段定义;
ucharcodetable1[]={0xfb,0xfd,0xfe};
//数码管位定义;
sbitopen=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitlight=P3^2;
//ADC0832的引脚;
sbitadCS=P3^1;
//ADC0832片选;
sbitadDI=P3^3;
//ADC0832通道选择和初始化输入;
sbitadDO=P3^3;
//ADC0832的数据输出;
sbitadCLK=P3^0;
//ADC0832时钟信号;
uchargetdat;
//获取ADC转换回来的值;
voiddisplay(ucharshi,ucharge);
voiddelay(uintz);
voidkeyscan();
voidinit();
ucharadc0832(unsignedcharchannel);
//主程序;
voidmain()
init();
//初始化子程序;
keyscan();
while
(1)
light=1;
//光线初始化为0;
if(light==0)
{
getdat=adc0832
(1);
display(temp/10,temp%10);
//显示数字;
if(getdat>
120)//声音超过2.4V后灯亮;
shi=temp/10;
//取出十位数字;
ge=temp%10;
//取出个位数字;