1目录1.概述21.1功能描述21.2单片机资源22.1管脚图23.1.使用资源32.原理篇32.1红外发送及接收32.1.1红外接收概述32.1.2硬件及原理图52.1.3红外中断接收部分程序52.2温度原理62.2.1DS18B20的主要特性62.2.2原理图与硬件72.2.3DS18B20时序和程序72.2.3.1初始化时序及程序72.2.3.2写/读时序及写/读一字节程序82.3QC1602A102.3.11602外部结构及管脚说明102.3.2写命令/数据时序与部分程序123.效果图134软件篇144.1程序框图144.1.1Main函数144.1.2中断154.1.360ms定时中断154.2完整程序164.2.1Project.c文件164.2.2onewire.c文件235.参考文献2521.概述1.1功能描述Lcd液晶显示实时环境温度和接收显示红外遥控器的键值,在收到红外信号时会用蜂鸣器作为反馈,以提醒红外一体接收头有接到信号。1.2单片机资源2.0资源与MCS-51单片机产品兼容8K字节在系统可编程Flash存储器1000次擦写周期全静态操作:0Hz~33Hz三级加密程序存储器32个可编程I/O口线三个16位定时器/计数器八个中断源全双工UART串行通道低功耗空闲和掉电模式掉电后中断可唤醒看门狗定时器双数据指针掉电标识符2.1管脚图33.1.使用资源P1:用于连接LCD1602的数据线P3.5,P3.7:分别连接LCD1602的RS,R/W控制脚P3.2:使用第二功能,用于接收红外信号P2.7:DS18B20数据脚P2.5:用于控制蜂鸣器2.原理篇2.1红外发送及接收2.1.1红外接收概述NEC标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。一个完整的全码=引导码+用户码+用户码+数据码+数据反码。其中,引导码高电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行什么动作的判断。连发代码是在持续按键时发送的码。它告知接收端,某键是在被连续地按着。NEC标准下的发射码表示发射数据时0用“0.56ms高电平+0.565ms低电平=1.125ms”表示;数据1用“高电平0.56ms+低电平1.69ms=2.25ms”表示。遥控器发射的信号:4一体化接收头接收到的信号:需要注意的是;一体化接收头输了的波形是与发射波形是反向的我的遥控器使用的是NEC标准的WD6122芯片,遥控器编码如下:52.1.2硬件及原理图2.1.3红外中断接收部分程序voidIR_IN()interrupt0using0//外部中断0程序{unsignedcharj,k,n=0;//先定义变量,记住n=0EX0=0;//禁止中断,以免再次进入中断delay(15);//延时0.14ms*15=2.1msif(IRIN==1)//如果在这期间有高电平说明{//信号不是来自遥控的,返回主程序EX0=1;return;}while(!IRIN){delay(1);}//死循环,等待9ms前导低电平信号的结束//////////////////////////////////////////////////////for(j=0;j4;j++)//一共有4组数据{for(k=0;k8;k++)//每组数据有8位{while(IRIN){delay(1);}//死循环,等待4.5ms前导高电平的结束while(!IRIN){delay(1);}//等待0.56ms低电平的结束,准备采集数据,while(IRIN)//开始采集数据{delay(1);//延时0.14ms,每过0.14ms时n就加1n++;//用n记录一共有多少个0.14msif(n=30)//如果超过0.14ms*30=4.2ms6{//说明是乱码,放弃不要EX0=1;return;}}IRCOM[j]=IRCOM[j]1;//右移1位,xxxxxxxx变成0xxxxxx//我们先认为这一位数据是0,现在已经送入一位数据了/*你肯定知道_cror_(x,1)和x1的区别吧*/if(n=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,//0xxxxxxx和0x80相或后变成了1xxxxxxx//这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*//*这样反复执行8次,8位数据就存在IRCOM[j]中了*//*外层再循环4次,4*8=32位数据码全都在IRCOM[0],IRCOM[1],IRCOM[2],IRCOM[3]中了*/n=0;//n计数后一定要记得清0,否则下一次就不能准确计数了}}////////////////////////////////////////////////////if(IRCOM[2]!=~IRCOM[3])//这里我们判断数据码和数据反码是不是相反{//因为相反才是正确的,否则就放弃EX0=1;return;}beep();EX0=1;//记得开中断,你可以去掉这句话试一试}2.2温度原理2.2.1DS18B20的主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点7测温(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快(8)测量结果直接输出数字温度信号,以一线总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作2.2.2原理图与硬件2.2.3DS18B20时序和程序2.2.3.1初始化时序及程序8//DS18B20初始化bitinit_ds18b20(void){bitinitflag=0;DQ=1;Delay_OneWire(12);DQ=0;Delay_OneWire(80);//延时大于480usDQ=1;Delay_OneWire(10);//14initflag=DQ;//initflag等于1初始化失败Delay_OneWire(5);returninitflag;}2.2.3.2写/读时序及写/读一字节程序9//从DS18B20读取一个字节unsignedcharRead_DS18B20(void){unsignedchari;unsignedchardat;for(i=0;i8;i++){DQ=0;dat=1;DQ=1;if(DQ){dat|=0x80;}Delay_OneWire(5);}returndat;}10//通过单总线向DS18B20写一个字节voidWrite_DS18B20(unsignedchardat){unsignedchari;for(i=0;i8;i++){DQ=0;DQ=dat&0x01;Delay_OneWire(5);DQ=1;dat=1;}Delay_OneWire(5);}2.3QC1602A2.3.11602外部结构及管脚说明1112RAM地址映射图控制器内部带有80*8位的RAM缓冲区2.3.2写命令/数据时序与部分程序//写命令voidwrite_com(ucharcom)//液晶写命令13{lcdrs=0;P1=com;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}//写数据voidwrite_data(uchardate)//液晶写数据{lcdrs=1;P1=date;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}3.效果图144软件篇4.1程序框图4.1.1Main函数154.1.2中断4.1.360ms定时中断164.2完整程序4.2.1Project.c文件#includereg52.h#includeabsacc.h#includeonewire.h//单总线函数库#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=temperature:;//液晶ucharcodetable1[]=infraredvalue:;//液晶unsignedcharIRCOM[7];//定义数组,用来存储红外接收到的数据sbitlcden=P3^7;//液晶sbitlcdrs=P3^5;//液晶sbitIRIN=P3^2;//定义红外接收头的外部接口,即外部中断0sbitBEEP=P2^5;//定义蜂鸣器接口,我的在P1^5ucharnum;//液晶charshow_clock;//显示周期控制charnow_tem;//存得到的温度charshinow,genow;//当前温度的十个位charwendu_show_shi,wendu_show_ge;//温度送入液晶的ASCALL码charhongwai_jian_zhi;//红外送入液晶的ASCALL码voiddelay_lcd(uintz)//液晶延时{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}//写命令voidwrite_com(ucharcom)//液晶写命令{17lcdrs=0;P1=com;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}//写数据voidwrite_data(uchardate)//液晶写数据{lcdrs=1;P1=date;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}voidinit_lcd()//液晶初始化{lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x10);write_com(0x80+0x00);}voidinit_show()//液晶初始显示{for(num=0;num12;num++){write_data(table[num]);delay_lcd(5);}write_com(0x80+0x40);for(num=0;num15;num++){write_data(table1[num]);delay_lcd(5);}ET0=1;//开定时中断18EX0=1;}/*voidinit_infrared()//红外初始化{IE=0x81;TCON=0X01;BEEP=1;IRIN=1;}*//******************************************///红外延时/*****************************************/voiddelay(unsignedcharx){//延时子程序unsignedchari;//延时约x*0.14mswhile(x--)//不同遥控器应设置