基于红外线的温度声光报警系统Word格式文档下载.doc
《基于红外线的温度声光报警系统Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《基于红外线的温度声光报警系统Word格式文档下载.doc(15页珍藏版)》请在冰豆网上搜索。
![基于红外线的温度声光报警系统Word格式文档下载.doc](https://file1.bdocx.com/fileroot1/2022-11/2/d8a77476-404b-4bc9-9069-bc9f74811d38/d8a77476-404b-4bc9-9069-bc9f74811d381.gif)
4.数码管
本方案采用的是八段共阳极数码管,通过动态扫描方式显示数据。
5.蜂鸣器
采用无源蜂鸣器,给输入引脚接上不同频率的方波,可以产生不同音阶的声音。
本实验采用1000hz。
四.方案设计过程
红外发送编码参考了nec协议并稍作修改。
定义了起始码为9ms低电平和4ms的高电平。
低电平‘0’定义为1ms的低电平和1ms的高电平,高电平‘1’定义为1ms的低电平和3ms的高电平。
38k载波采用定时器0的8位自动重装模式,初值0xf4。
在设计过程中,使用示波器测量发送接收的波形,基本一样,没有误差。
收发有效距离为1米,超过1米数据显示错误,本方案还有很大的提高空间
五.实验源程序
发送main.c
#include<
reg52.h>
sbitCarryWave=P1^7;
sbitir_send=P1^6;
voidTransData(unsignedchar_data);
voidCarrierWaveInit(void);
voiddelay_ms(unsignedintt);
voidConfigTimer0(unsignedintms);
voidTransData2(unsignedchar_data2);
externbitStart18B20();
externbitGet18B20Temp(int*temp);
bitflag1s=0;
bitres=0;
inttemp;
//读取到的当前温度值
unsignedcharT0RH=0;
//T0重载值的高字节
unsignedcharT0RL=0;
//T0重载值的低字节
unsignedcharintT,decT;
voidmain()
{
EA=1;
PT1=1;
ConfigTimer0
(1) ;
CarrierWaveInit();
Start18B20();
//启动DS18B20
while
(1)
{
TransData(intT);
TransData2(decT);
if(flag1s)//每秒更新一次温度
{
flag1s=0;
res=Get18B20Temp(&
temp);
//读取当前温度
if(res)//读取成功时,刷新当前温度显示
{
intT=temp>
>
4;
// intT=intT/16+intT%16;
//分离出温度值整数部分
decT=temp&
0xF;
//分离出温度值小数部分
decT=decT*10/16;
// a=intT/10;
//整数部分数据处理
// b=intT%10;
}
Start18B20();
//重新启动下一次转换
}
}
}
voidTransData(unsignedchar_data)
{
unsignedchari;
ir_send=0;
delay_ms(9);
ir_send=1;
//输出0
delay_ms(4);
//4ms的启动低电平
for(i=0;
i<
8;
i++)
ir_send=0;
//输出1
delay_ms
(1);
if(_data&
(1<
<
i))
{ir_send=1;
delay_ms(3);
}//1左移i位,先发低位
//如果发送1则高低电平比为1:
1
else
{ir_send=1;
delay_ms
(1);
}//如果发送0则高低电平比为1:
3
ir_send=1;
//delay_ms(300);
voidTransData2(unsignedchar_data2)
{ unsignedcharj;
for(j=0;
j<
j++)
if(_data2&
j))
ir_send=1;
/************定时器1初始化函数************
***函数名:
CarrierWaveInit()
***参数:
无
***功能:
38K载波信号定时器初始化
***返回值:
*****************************************/
voidCarrierWaveInit(void)
EA=1;
TMOD&
=0x0f;
//清零T0的控制位
TMOD|=0x20;
//八位自动重装模式
TH1=0XF4;
//38k载波信号
TL1=0XF4;
ET1=1;
//打开
TR1=1;
/*********定时器1中断函数载波发生*********
//////////////////////////////////////////
CarrierWave()
定时器中断产生38KHZ载波信号
voidCarrierWave(void)interrupt3
CarryWave=~CarryWave;
voiddelay_ms(unsignedintt)//误差-0.651041666667us
unsignedchara,b;
for(;
t>
0;
t--)
for(b=4;
b>
b--)
for(a=43;
a>
a--);
voidConfigTimer0(unsignedintms)
unsignedlongtmp;
//临时变量
tmp=11059200/12;
//定时器计数频率
tmp=(tmp*ms)/1000;
//计算所需的计数值
tmp=65536-tmp;
//计算定时器重载值
tmp=tmp+12;
//补偿中断响应延时造成的误差
T0RH=(unsignedchar)(tmp>
8);
//定时器重载值拆分为高低字节
T0RL=(unsignedchar)tmp;
=0xf0;
TMOD|=0x01;
//配置T0为模式1
TH0=T0RH;
//加载T0重载值
TL0=T0RL;
ET0=1;
//使能T0中断
TR0=1;
//启动T0
/*T0中断服务函数,完成1秒定时*/
voidInterruptTimer0()interrupt1
staticunsignedinttmr1s=0;
//重新加载重载值
tmr1s++;
if(tmr1s>
=700)//定时1s
{
tmr1s=0;
flag1s=1;
}
}
18b20.源程序
#include<
intrins.h>
sbitIO_18B20=P