摘要本系统由两部分组成,温度采集端和温度显示端,通过温度传感器采集温度显示在液晶屏或者数码管上,并将温度通过红外发送到红外接收头,然后解调解码数据,将温度显示出来,实现温度的无线测量关键字:STC89C52RC;红外;温度;调制;解调1.方案论证与选择1.1控制器的选择方案一:采用MSP430来处理Msp430是一种超低功耗的混合信号处理器,采用精简指令集,单个始终走起就可以执行一条指令,速度比51快得多。因此用430来处理比较器返回来的数据是比较快捷的,但价格相对较贵。430供电为3.3V,且操作起来较复杂。方案二:采用51内核单片机单片机操作方便快捷,成本低,开发资源丰富,位寻址方便等,来的数据不需要很大的数据处理过程,51已完全能够胜方便,所以该装置采用STC89c52型的单片机来进行处理,本单片机一个机器一个时钟周期执行一条指令,无法解密,低功耗,超低价,高速,高可靠性。1.2温度显示方式的选择与比较方案一:采用数码管显示数码管是由多个发光二极管封装在一起组成的8字型的器件,引线已在内部连接完成,只需引出他们的各个笔画和公共电极。可以用来显示数字和字母。方案二:采用LCD1602一种专门用来显示字母,数字,符号等的点阵型液晶模块。它由若干个5X7或者5X11等的点阵字符位组成,每个点阵自字符位都可以显示一个字符,每位之间有一个点距的间隔,可以显示两行,每行16位数字或者字符。1602采用标准的16脚借口,相比数码管,同样引脚的情况下,显示的内容更多,焊接更加方便快捷,所以我们选用显示部分选用LCD1602.1.3红外的编码和解码采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如下图所示。上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射。编码数据,载波,发射,接收解码如下图所示2.系统设计温度传感器控制器温度显示红外发射红外接收控制器温度显示本系统的温度传感器使用DS18b20,控制器选用stc89c51,温度显示模块用LCD1602。(1)对温度采集电路采集的温度进行编码后,红外发射管发射数据。(2)红外一体化接收头接收到红外信号后,对红外进行解调,因为红外接收头接收到信号后就对信号进行了解调,所以我们就不用设计解调电路。3.电路设计3.1单片机最小系统上图是比较常用的单片机最小系统3.2温度采集发射电路温度传感器DS18B20采集的温度,通过单片机处理显示在液晶上,然后对温度数据进行编码,通过红外发射电路将温度信息发射出去。3.3温度接收显示电路红外发送模块温度传感器模块液晶显示模块红外接收头对接收到的信号解调,然后送到单片机处理,判断高低电平的时间来解码,将温度数据显示在液晶上。4.软件设计4.1概述:此次用的是DSl8B20作为温度传感器进行温度采集,然后将温度数据转化为电信号,通过红外线发射,再让接受端收到温度信息,并显示出来。因为是我们焊接的是单片机最小系统,所以,我们用的就是无线红外发射管和无线红外接收管来实现发送端与接收端数据的传输,基本可以实现五米以上距离的信息传输。接收端主循环一直检测红外是否接收完成,如果完成清除完成标志,并进行接收头液晶模块数据校验,校验通过则对红外数据进行转换,temperature为全局,将在display.c由定时器扫描数码管进行显示。信号灯的闪烁则利用ledcount变量自减进行控制发送端主循环以一定间隔进行18B20温度读取,再将温度数据转换为红外数据码,进行红外发射,伴随信号灯闪烁定时器0进行38K载波的产生。红外数据存入IR_Code数组,前两位为引导码3——18为校验码19——41数据具体编码0和1的表示参考NEC红外协议,对01的编码时间适当增大了,以避免其他红外遥控的干扰。4.2程序流程图发射端计算温度值并进行存储显示在lcd显示器上接收端否是是否是否有红外信号开始初始化结束将信息以数字形式显示在数码管显示器上错误显示error温度是否高于x度报警器报警结束4.3关键程序模块(1)数据采集模块#include18b20.hvoidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart)//延时tms{while(t--){DelayUs2x(245);DelayUs2x(245);}//大致延时1mS}/*------------------------------------------------18b20初始化------------------------------------------------*/bitInit_DS18B20(void){bitdat=0;DQ=1;//DQ复位DelayUs2x(10);DQ=0;//稍做延时//单片机将DQ拉低DelayUs2x(200);DelayUs2x(200);//精确延时大于480us小于960usDQ=1;DelayUs2x(50);//拉高总线//15~60us后接收60-240us的存在脉冲dat=DQ;DelayUs2x(25);//如果x=0则初始化成功,x=1则初始化失败//稍作延时返回returndat;}/*------------------------------------------------读取一个字节------------------------------------------------*/unsignedcharReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;dat=1;DQ=1;//给脉冲信号//给脉冲信号if(DQ)dat|=0x80;DelayUs2x(25);}return(dat);}/*------------------------------------------------写入一个字节------------------------------------------------*/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;DelayUs2x(25);DQ=1;dat=1;}DelayUs2x(25);}/*------------------------------------------------读取温度------------------------------------------------*/unsignedintReadTemperature(void){unsignedchara=0;unsignedintb=0;unsignedintt=0;Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换DelayMs(20);Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();//低位b=ReadOneChar();//高位t=((int)b8)+a;return(t);}(2)发送模块#includeirsend.h#includemath.hunsignedcharIR_Code[IR_CODE_SIZI]={0};//#defineIR_CODE_SIZI42发射码个数/*******11.0592M晶振下t毫秒延时函数************函数名:Delay_ms()***参数:unsignedintt***功能:t毫秒延时***返回值:无*****************************************/voidDelay_ms(unsignedintt)//误差-0.651041666667us{unsignedchara,b;for(;t0;t--)for(b=4;b0;b--)for(a=113;a0;a--);}/*************信号灯闪烁函数****************函数名:SignalFlicker()***参数:count闪烁次数,time闪烁时间***功能:信号灯以timems时间间隔闪烁count次***返回值:无*****************************************/voidSignalFlicker(unsignedcharcount,unsignedinttime){for(;count0;count--){ON_SIG_LED;Delay_ms(time);OFF_SIG_LED;Delay_ms(time);}}/************定时器0初始化函数***************函数名:CarrierWaveInit()***参数:无***功能:38K载波信号定时器初始化***返回值:无*****************************************/voidCarrierWaveInit(void){TMOD|=0X02;//八位自动重装模式TH0=0XF4;//11110100//38k载波信号TL0=0XF4;ET0=0;//关闭TR0=0;}/*********定时器0中断函数载波发生************函数名:CarrierWave()***参数:无***功能:定时器中断产生38KHZ载波信号***返回值:无*****************************************/voidCarrierWave(void)interrupt1{IR_SEND_IO=~IR_SEND_IO;}/**************红外数据复位函数*****************函数名:IrcodeReset()***参数:无***功能:将红外发射码数据进行复位***返回值:无*****************************************/voidIrcodeReset(){unsignedchari=0;for(i=0;iIR_CODE_SIZI;i++){IR_Code[i]=IR_CODE_0;}IR_Code[0]=IR_CODE_START;IR_Code[1]=IR_CODE_START/2;}/**************数据转换函数*****************函数名:DataConversion***参数:待转换的数值num,红外码存放地址irdata***功能:将数值转换为红外发射码***返回值:无#defineIR_CODE_020//发射码的0#defineIR_CODE_150#defineIR_CODE_START240//发射码起始#defineIR_CODE_SIZI42//发射码个数*****************************************/voidDataConversion(unsignedintnum,unsignedchar*irdata){unsignedchari=IR_CODE_SIZI-3,n=1,f=1;IrcodeReset();//存储区初始化for(n=3;n18;n+=2)//前8个存放校验码101010100xAA{if(f){irdata[n]=IR_CODE_1;f=0;}else{irdata[n]=IR_CODE_0;f=1;}}whi