为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于红外线的温度声光报警系统

2017-10-06 20页 doc 50KB 17阅读

用户头像

is_281650

暂无简介

举报
基于红外线的温度声光报警系统基于红外线的温度声光报警系统 基于红外通信的声光报警系统 一(设计要求 1) 包括电信号转化成数字信号系统,数字显示系统,报警系统等 2) 测量系统的性能特点等 3) 利用光电传感器进行信号的采集及控制。 二(方案介绍 本设计方案是通过温度传感器12b20采集温度数据,单片机a接收到温度数据后,通过红外发射管发送出去,单片机b通过红外接受管hs0038b接收数据,经过单片机处理后得到温度信息,最终来实现声光报警系统的功能。 三(各模块功能介绍 1.红外发送模块 在实际的通信领域,发出来的信号一般有较宽的频谱...
基于红外线的温度声光报警系统
基于红外线的温度声光报警系统 基于红外通信的声光报警系统 一(要求 1) 包括电信号转化成数字信号系统,数字显示系统,报警系统等 2) 测量系统的性能特点等 3) 利用光电传感器进行信号的采集及控制。 二(介绍 本设计方案是通过温度传感器12b20采集温度数据,单片机a接收到温度数据后,通过红外发射管发送出去,单片机b通过红外接受管hs0038b接收数据,经过单片机处理后得到温度信息,最终来实现声光报警系统的功能。 三(各模块功能介绍 1.红外发送模块 在实际的通信领域,发出来的信号一般有较宽的频谱,而且都是在比较低的频率段分布大量的能量,所以称之为基带信号,这种信号是不适合直接在信道中传输的。为便于传输、提高抗干扰能力和有效的利用带宽,通常需要将信号调制到适合信道和噪声特性的频率范围内进 行传输,这就叫做信号调制。在通信系统的接收端要对接收到的信号进行解调,恢复出原来的基带信号。 本方案参考普通电视遥控器38k载波,来对信号进行调制。 38k载波通过单片机定时来实现。 2.红外接收模块hs0038b 正常的通信来讲,接收端要首先对信号通过监测、放大、滤波、解调等等一系列电路处理,然后输出基带信号。但是红外通信的一体化接收头 HS0038B,已经把这些电路全部集成到一起了,我们只需要把这个电路接上去,就可以直接输出我们所要的基带信号,及温度数据。 3.温度传感器18b20 单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。 1-Wire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上就可以。通过查看该芯片时序图,用编程方式读取温度。 4.数码管 本方案采用的是八段共阳极数码管,通过动态扫描方式显示数据。 5.蜂鸣器 采用无源蜂鸣器,给输入引脚接上不同频率的方波,可以产生不同音阶的声音。本实验采用1000hz。 四(方案设计过程 红外发送编码参考了nec协议并稍作修改。定义了起始码为9ms 低电平和4ms的高电平。低电平‘0’定义为1ms的低电平和1ms的高电平,高电平‘1’定义为1ms的低电平和3ms的高电平。38k载波采用定时器0的8位自动重装模式,初值0xf4。在设计过程中,使用示波器测量发送接收的波形,基本一样,没有误差。收发有效距离为1米,超过1米数据显示错误,本方案还有很大的提高空间 五(实验源程序 发送 main.c #include sbit CarryWave = P1^7; sbit ir_send = P1^6; void TransData(unsigned char _data); void CarrierWaveInit(void); void delay_ms(unsigned int t); void ConfigTimer0(unsigned int ms); void TransData2(unsigned char _data2); extern bit Start18B20(); extern bit Get18B20Temp(int *temp); bit flag1s=0; bit res=0; int temp; //读取到的当前温度值 unsigned char T0RH = 0; //T0重载值的高字节 unsigned char T0RL = 0; //T0重载值的低字节 unsigned char intT,decT; void main() { 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(); //重新启动下一次转换 } } } void TransData(unsigned char _data) { unsigned char i; 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<0;t--) for(b=4;b>0;b--) for(a=43;a>0;a--); } void ConfigTimer0(unsigned int ms) { unsigned long tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 12; //补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xf0; //清零T0的控制位 TMOD |= 0x01; //配置T0为模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 } /* T0中断服务函数,完成1秒定时 */ void InterruptTimer0() interrupt 1 { static unsigned int tmr1s = 0; TH0 = T0RH; //重新加载重载值 TL0 = T0RL; tmr1s++; if (tmr1s >=700) //定时1s { tmr1s = 0; flag1s = 1; } } 18b20.源程序 #include #include sbit IO_18B20 = P3^2; //DS18B20通信引脚 /* 软件延时函数,延时时间(t*10)us */ void DelayX10us(unsigned char t) { do { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } while (--t); } bit Get18B20Ack() { bit ack; EA = 0; IO_18B20 = 0; DelayX10us(50); IO_18B20 = 1; DelayX10us(6); ack = IO_18B20; while(!IO_18B20); EA = 1; return ack; } void Write18B20(unsigned char dat) { unsigned char mask; EA = 0; for(mask=0x01; mask!= 0; mask<<=1) { IO_18B20 = 0; _nop_(); _nop_(); if((mask&dat) == 0) IO_18B20 = 0; else IO_18B20 = 1; DelayX10us(6); IO_18B20 = 1; } EA = 1; } unsigned char Read18B20() { unsigned char dat; unsigned char mask; EA = 0; for(mask=0x01; mask!=0; mask<<=1) { IO_18B20 = 0; _nop_(); _nop_(); IO_18B20 = 1; _nop_(); _nop_(); if(!IO_18B20) dat &= ~mask; else dat |= mask; DelayX10us(6); } EA = 1; return dat; } bit Start18B20() { bit ack; ack = Get18B20Ack(); if(ack == 0) { Write18B20(0xCC); Write18B20(0x44); } return ~ack; } bit Get18B20Temp(int *temp) { bit ack; unsigned char LSB, MSB; ack = Get18B20Ack(); if(ack == 0) { Write18B20(0xCC); Write18B20(0xBE); LSB = Read18B20(); MSB = Read18B20(); *temp = ((int)MSB<<8) + LSB; } return ~ack; } 接收 main.c #include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit LED0=P0^0; sbit LED1=P0^3; sbit LED2=P0^4; sbit LED3=P0^7; sbit BUZZ=P1^6; bit led0=1,led1=1,led2=1,led3=1; unsigned char code LedChar[] = { //数码管显示字符转换 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[6] = { //数码管显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char T0RH = 0; //T0重载值的高字节 unsigned char T0RL = 0; //T0重载值的低字节 unsigned char intT=0; extern bit irflag; extern unsigned char ircode[4]; extern void InitInfrared(void); void ConfigTimer0(unsigned int ms); void main() { EA = 1; //开总中断 ENLED = 0; ADDR3 = 1; InitInfrared(); //初始化红外功能 ConfigTimer0(1); //配置T0定时1ms PT0 = 1; //配置T0中断为高优先级,启用本行可消除接收时的闪烁 while (1) { if (irflag==1) //接收到红外数据时刷新显示 { irflag = 0; intT=ircode[0]&0x0f+(ircode[0]>>4)*16 ; LedBuff[2] = LedChar[intT/10]; //用户码显示 LedBuff[1] = LedChar[intT%10] & 0x7f; ; // LedBuff[1] = LedChar[5]; //键码显示 LedBuff[0] = LedChar[ircode[1]]; } } } /* 配置并启动T0,ms-T0定时时间 */ void ConfigTimer0(unsigned int ms) { unsigned long tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 mp = tmp + 10; //补偿中断响应延时造成的误差 t T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清零T0的控制位 TMOD |= 0x01; //配置T0为模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 } /* 数码管动态扫描刷新函数,需在定时中断中调用 */ void LedScan() { static unsigned char i = 0; //动态扫描索引 P0=0xff; switch(i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1];break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2];break; case 3: ADDR2=1; ADDR1=1; ADDR0=0; i++; LED0=led0;;break; case 4: ADDR2=1; ADDR1=1; ADDR0=0;i++; LED1=led1;;break; case 5: ADDR2=1; ADDR1=1; ADDR0=0; i++; LED2=led2;;break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i=0; LED3=led3;;break; default:break; } } /* T0中断服务函数,执行数码管扫描显示 */ void InterruptTimer0() interrupt 1 { static unsigned char i; TH0 = T0RH; //重新加载重载值 TL0 = T0RL; LedScan(); //数码管扫描显示 i++; if(i>=100) { i=0; if(intT>=32) { led0=~led0;led1=~led1; led2=~led2;led3=~led3; } else { led0=1; led1=1;led2=1;led3=1; } } if(intT>=32) BUZZ=~BUZZ; } 红外接收初始化函数 #include sbit IR_INPUT = P3^3; //红外接收引脚 bit irflag = 0; //红外接收标志,收到一帧正确数据后置1 unsigned char ircode[4]; //红外代码接收缓冲区 unsigned char i; void InitInfrared(void) { IR_INPUT = 1; TMOD &= 0X0F; TMOD |= 0x10; TR1 = 0; ET1 = 0; IT1 = 1; EX1 = 1; } unsigned int GetHighTime() { TH1 = 0; TL1 = 0; TR1 = 1; while(IR_INPUT) { if(TH1 > 0x40) { break; } } TR1 = 0; return(TH1 * 256 + TL1); } unsigned int GetLowTime() { TH1 = 0; TL1 = 0; TR1 = 1; while(!IR_INPUT) { if(TH1 > 0x40) { break; } } TR1 = 0; return(TH1 * 256 + TL1); } void EXINT1_ISR(void) interrupt 2 { unsigned char j; unsigned int time; unsigned char byt; time = GetLowTime(); if((time <7700) || (time > 8800)) { IE1 = 0; return; } time = GetHighTime(); if((time<3300) || (time > 4200)) { IE1 = 0; return; } for(i=0; i<2; i++) { for(j=0; j<8; j++) { time = GetLowTime(); if((time<700) ||(time >1250)) { IE1 = 0; return; } time = GetHighTime(); if((time>700) && (time <1250)) { byt >>= 1; } else if((time>2260) && (time<3300)) { byt >>= 1; byt |= 0x80; } else { IE1 = 0; return; } } ircode[i] = byt; } irflag = 1; IE1 = 0; }
/
本文档为【基于红外线的温度声光报警系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索