智能灯光智能煤气报警.docx
《智能灯光智能煤气报警.docx》由会员分享,可在线阅读,更多相关《智能灯光智能煤气报警.docx(16页珍藏版)》请在冰豆网上搜索。
智能灯光智能煤气报警
洛阳理工学院
课程设计报告
课程名称物联网应用系统开发
设计题目智能家具之家电控制系统
专业计算机应用技术
班级Z120554
学号Z
姓名宋卫青
完成日期2015-1-8
课程设计任务书
设计题目:
智能家具之家电控制系统—基于单片机的灯光智能控制以及煤气泄漏报警的设计
设计内容与要求:
基于STC89C52单片机的智能家电的设计,用红外发射模块和遥控器实现智能灯光的模拟控制设计,控制的灯有:
卧室灯、客厅灯,厕所灯,庭院灯以及煤气报警灯,MQ-2气体传感器模块用于检测煤气是否泄漏等。
要求如下:
(1)能够用遥控器通过红外模块实现各个灯的开关。
(2)能够实现多个以及单个灯的开关。
(3)能够检测气体的浓度,当气体浓度过高时实现蜂鸣器的报警以及实现报警灯的闪烁
指导教师:
_______________
年月日
课程设计评语
成绩:
指导教师:
_______________
年月日
一实训目的
1、了解物联网的概念
2、通过实训对智能家居有一个简单的认识
3、锻炼学生的操作能力与动手能力
4、培养小组成员的合作精神
二实训内容
基于STC89C52单片机的智能家电的设计,用红外发射模块和遥控器实现智能灯光的模拟控制设计,控制的灯有:
卧室灯、客厅灯,厕所灯,庭院灯以及煤气报警灯,MQ-2气体传感器模块用于检测煤气是否泄漏等。
逻辑总框图:
卧室灯
客厅灯
厕所灯
庭院灯
煤气报警灯
图1家电系统控制总框图
遥控器按键模块如下图所示:
0
1
2
3
4
5
6
7
8
图2
遥控器按键模拟灯光显示功能如下:
灯(标志)
模拟的灯实物
数字
控制
L0
卧室
1
L1
厕所
2
L2
客厅
3
L3
庭院
4
L0、L1
卧室灯和厕所灯
5
L0、L1、L2
卧室灯和厕所灯、客厅灯
6
L0、L2
卧室灯和客厅灯
7
L0、L1、L2、L3
卧室灯和厕所灯、客厅灯、庭院灯
8
灯灭
灯灭
0/9
图3
设计所需的元件:
元件名称型号数量/个
单片机STC89C521
晶振12MHz1
按键遥控器1
电阻10K9
电源5V1
导线若干
气体传感器MQ-21
蜂鸣器1
Led灯5
三、单元电路设计:
1、主控制系统
单片机中央处理系统的方案设计,选用STC2单片机作为中央处理器,如下图所示:
该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。
整个系统结构紧凑,抗干扰能力强,性价比高。
图4STC89C52引脚图
2、红外线发射模块
图4
图5码值
3、红外发射原理
/*-----------------------------------------------
名称:
红外发射原理
修改:
无
内容:
通过红外发射接收闪烁LED,同普通LED显示程序相同。
由于主板集成了红外38K调制,所以只需发送需要发送的码即可
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitIRSend=P1^2;//定义红外发射
sbitIRRev=P3^2;//接收接口
sbitLED=P1^6;//演示LED
voidInit_Timer0(void);//定时器初始化
//主函数
voidmain(void)
{
Init_Timer0();
while
(1)//主循环
{
LED=IRRev;//接收值反应到LED
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
voidTimer0_isr(void)interrupt1
{
TH0=0;//重新赋值65.536ms
TL0=0;
IRSend=!
IRSend;//发射管电平取反,表明以周期65.536x2ms时间闪烁
}
4、红外接收原理
/*-----------------------------------------------
名称:
从红外接收读取电平信息
修改:
无
内容:
从红外接收头接收到信息反映到LED上
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitLED=P1^0;//用sbit关键字定义LED到P1.0端口,LED是自己任意定义且容易记忆的符号
sbitIR_IN=P3^2;
//主函数
voidmain(void)
{
while
(1)//主循环
{
LED=IR_IN;//主循环中添加其他需要一直工作的程序
}
}
3、MQ-2气体传感器原理
MQ-2/MQ-2S气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。
当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。
使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
MQ-2/MQ-2S气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。
这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器
图7
自感应器件MQ-2参数
A.标准工作条件
符号
参数名称
技术条件
备注
Vc
回路电压
≤15V
ACorDC
VH
加热电压
5.0V±0.2V
ACorDC
RL
负载电阻
可调
RH
加热电阻
31Ω±3Ω
室温
PH
加热功耗
≤900mW
B.环境条件
符号
参数名称
技术条件
备注
Tao
使用温度
-10℃-50℃
Tas
储存温度
-20℃-70℃
RH
相对湿度
小于 95%RH
O2
氧气浓度
21%(标准条件)
氧气浓度会影响灵敏度特性
最小值大于2%
C.灵敏度特性
符号
参数名称
技术参数
备注
Rs
敏感体表面电阻
3KΩ-30KΩ
(1000ppm异丁烷)
探测浓度范围
100ppm-10000ppm
液化气和丙烷
300ppm-5000ppm丁烷
5000ppm-20000ppm甲烷
300ppm-5000ppm氢气
100ppm-2000ppm酒精
α(3000/1000)
异丁烷
浓度斜率
≤0.6
标准工作条件
温度:
20℃±2℃Vc:
5.0V±0.1V
相对湿度:
65%±5%Vh:
5.0V±0.1V
预热时间
不超过1小时
MQ-2气敏元件的结构和外形如图所示(结构AorB),由微型AL2O3陶瓷管、SnO2敏感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加热器为气敏元件提供了必要的工作条件。
4、蜂鸣器模块原理
图8
蜂鸣器是一种一体化结构的电子讯响器,本文介绍如何用单片机驱动蜂鸣器,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
电磁式蜂鸣器内部构成:
1.防水贴纸2.线轴3.线圈4.磁铁5.底座6.引脚7.外壳8.铁芯9.封胶10.小铁片11.振动膜12.电路板
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
S52增强型单片机实验板通过一个三极管C8550来放大驱动蜂鸣器,原理图如下图9:
图9
5、电路实物设计
图10
四、软件设计
设计遥控器控制灯光的开关,蜂鸣器报警以及灯光闪烁,程序如下:
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"intrins.h"
#defineucharunsignedchar//宏定义无符号字符型
#defineuintunsignedint//宏定义无符号整型
sbitIR=P3^2;//红外接口标志
#defineDataPortP1
//定义数据端口程序中遇到DataPort则用P1替换
sbitLATCH1=P2^0;//定义锁存使能端口段锁存
sbitLATCH2=P2^1;//位锁存
sbitBJD=P1^4;
sbitDOUT=P2^0;//定义单片机P2口的第1位(即P2.0)为传感器的输入端
sbitspeak=P2^3;
voiddelay()//延时程序
{
ucharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
voiddelaylb()//大概0.5ms左右的延时
{
uchara;
for(a=450;a>0;a--)
{
_nop_();
}
}
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
//unsignedcharcodedofly_DuanMa[10]={0xff,0xfe,0xfd,0xdf,0xbf,0xbe,0xbd,0x9e,0x9c,0xff};//显示led灯L0,L1,L5,L6
unsignedcharcodedofly_DuanMa[10]={0x00,0x01,0x02,0x04,0x08,0x03,0x07,0x05,0x0f,0x00};//显示led灯L0,L1,L5,L6,0xbe,0xbd,0x9e,0x9c,0xff
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
unsignedcharirdata[33];
/*------------------------------------------------
函数声明
------------------------------------------------*/
voidIr_work(void);
voidIrcordpro(void);
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值
ET0=1;//开中断
TR0=1;
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
voidEX0init(void)
{
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;//使能外部中断
EA=1;//开总中断
}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
voidtim0_isr(void)interrupt1using1
{
irtime++;//用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
voidEX0_ISR(void)interrupt0//外部中断0服务函数
{
staticunsignedchari;//接收红外信号处理
staticbitstartflag;//是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*------------------------------------------------
键值处理
------------------------------------------------*/
voidIr_work(void)//红外键值散转程序
{
switch(IRcord[2])//判断第三个数码值
{
case0x16:
DataPort=dofly_DuanMa[0];break;//0按下遥控器上面0的按键灯灭
case0x0c:
DataPort=dofly_DuanMa[1];break;//L0显示相应的灯亮
case0x18:
DataPort=dofly_DuanMa[2];break;//L1
case0x5e:
DataPort=dofly_DuanMa[3];break;//L5
case0x08:
DataPort=dofly_DuanMa[4];break;//L6
case0x1c:
DataPort=dofly_DuanMa[5];break;//L0,L6
case0x5a:
DataPort=dofly_DuanMa[6];break;//L1,L6
case0x42:
DataPort=dofly_DuanMa[7];break;//L1,L5,L6
case0x52:
DataPort=dofly_DuanMa[8];break;//L0,L1,L5,L6
case0x4a:
DataPort=dofly_DuanMa[9];break;//灯灭
default:
break;
}
irpro_ok=0;//处理完成标志
}
/*------------------------------------------------
红外码值处理
------------------------------------------------*/
voidIrcordpro(void)//红外码值处理函数
{
unsignedchari,j,k;
unsignedcharcord,value;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++)//处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
inti;
EX0init();//初始化外部中断
TIM0init();//初始化定时器
//LCD1602=0;//关闭数码管
//cs88=0;//关闭点阵
DataPort=0x00;//取位码第一位LED选不通,即二进制11111111
LATCH2=1;//位锁存
LATCH2=0;
while
(1)//主循环
{
if(irok)//如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok)//如果处理好后进行工作处理,如按对应的按键后显示对应的LED灯等
{
Ir_work();
}
if(DOUT==0)//当浓度高于设定值时,执行条件函数
{BJD=1;
delay();//延时抗干扰
BJD=0;
delay();//延时抗干扰
BJD=1;
delay();//延时抗干扰
BJD=0;
if(DOUT==0)//确定浓度高于设定值时,执行条件函数
{BJD=1;
delay();//延时抗干扰
BJD=0;
for(i=800;i>0;i--)//持续时间0.5ms*800
{
speak=~speak;
delaylb();//2000HZ的信号。
}
for(i=500;i>0;i--)//持续时间0.5ms*2*500
{
speak=~speak;
delaylb();
BJD=1;
delaylb();//1000HZ的信号。
BJD=0;
}
}
}
}
}
五、实训心得
一个星期的实训就要结束了,记得网上有个学长说了这样一句话:
“书上千百言,难敌一灯亮”,虽然设计的不是太过完美,但是至少我们努力了,能够模拟实现智能灯光以及气体报警的设计,这一次的实训也是我大学最后一次课程的总结,离开校园的最后一次实训报告,我很知足,因为我们实现了我们需要的功能。
相信自己在以后的硬件设计道路上做的更好。
相信未来智能化的社会越来越美好。