基于51单片机控制红外通信_第1页
基于51单片机控制红外通信_第2页
基于51单片机控制红外通信_第3页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、红外通信原理红外遥控有发送与接收两个组成局部。发送端采用单片机 将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。为了减少干扰,采用的就是价格廉价性能可靠的 一体化红外接收头HS0038,它接收红外信号频率为38kHz周期约26 卩s接收红外信号,它同时对信号进行放大、检波、整形得到TTL电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对 象。具体实现过程如下:在这里特别强调:编码与解码就是一对逆过程,不仅在原理上就是一 对逆过程,在码的发收过程也就是互反的,即以前发射端原始信号就是高电

2、平,那接收头输出的就就是低电平,反之亦然。因此为了保证解码过程简单方便,在编码时应该直接换算成其反码。电-冷低平化头的帖52ttl.l晒0哥116 565ins蕈电1.855共2.25ms1、红外发射局部:TK0.5S5IE下列图为红外发射局部的电路拟图图2红外发射电路编码过程:(1) 二进制信号的调制二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz的间断脉冲串(用定时器来完成),相当于用二进制信号的 编码乘以频率为38kHz的脉冲信号得到的间断脉冲串,即就是调制后 用于红外发射二极管发送的信号。(2) PPM编码这种遥控编码具有以下特征:遥控编码脉冲由前导码、16

3、位地址码8位地址码、8位地址码的 反码与16位操作码8位操作码、8位操作码的反码组成。前导码: 就是一个遥控码的起始局部,由一个9ms的高电平起始码与一 个4、5ms的低电平结果码组成,作为接受数据的准备脉冲。16位地址码:能区别不同的红外遥控设备,防止不同机种遥控码互相干 扰。16位操作码:用来执行不同的操作。采用脉宽调制的串行码,以脉宽为0、56ms、间隔0、56ms、周期为1、12ms的组合表示二进制的“0以脉宽为1、68ms、间隔0、56ms、 周期为2、24ms的组合表示二进制的“ 1。rL图7二进制码T图8二进制码O地址度码操作码图号发送一组完整的编码脉冲3发送程序#inelude

4、 static bit OP; static un sig ned int static un sig ned intstatic un sig ned char/红外发射管的亮灭控制位count;/延时计数器endcount; /终止延时计数flag;/红外发送标志sbit P3_4=P3A4;char iraddrl;/十六位地址的第一个字节char iraddr2;/十六位地址的第二个字节void SendlRdata(char p_irdata); / 发送子函数void delay();void main( void )count = 0;flag = 0;/无载波OP = 0;/

5、不亮P3_4 = 0;/在后面会发现用OP赋值的EA = 1;/ 允许 CPU中断TMOD = 0x11; /设定时器0与1为16位模式1ET0 = 1;/定时器0中断允许TH0 = OxFF;TL0 = 0xE6;/设定时值0为38K也就就是每隔26us中断一次TR0 = 1 ;/开始计数iraddr1=3; /自定义的一个地址iraddr2=252; / 地址反码dodelay();Sen dIRdata(12); while (1);/定时器0中断处理void timeint( void ) interrupt 1TH0=0xFF;TL0=0xE6; /设定时值为38K也就就是每隔26u

6、s中断一次 coun t+;if (flag=1)OP=OP; /如果就是待发送的有效数据flag=1,就在此产生载波elseOP = 0; P3_4 = OP;void SendlRdata( char p_irdata)/ 发送数据子函数int i;char irdata=p_irdata;/*/发送9ms的起始码,并就是载波模式有效en dcou nt=223;flag=1;coun t=0;while (countendcount); /等待中断,控制亮灭交变的总时间为 9ms/发送4、5ms的结果码,并就是载波模式无效endcoun t=117flag=0;coun t=0;do w

7、hile (countendcount);*/发送十六位地址的前八位irdata=iraddr1;for (i=0;i8;i+) / 一个周期里规定先以高电平开始,在以低电平结束。先发送0、56ms的38KHZ“ 1的红外波(即编码中0、56ms的高电平)en dco un t=10;flag=1;coun t=0;do while (countendcount);/停止发送红外信号(即编码中的低电平)/判断二进制数个位为1还就是0/1 为宽的高电平1、68msif (irdata-(irdata/2)*2)en dco un t=41; else/0为窄的高电平0、56msflag=O;co

8、un t=0;while (count1; / 依次取位/发送十六位地址的后八位irdata=iraddr2;/此处已经就是地址的反码for (i=0;i8;i+)en dco un t=10;flag=1;coun t=0;while (countendcount);if (irdata-(irdata/2)*2)en dco un t=41;elseen dco un t=15;flag=0;coun t=0;do while (count1;*/发送八位数据irdata=p_irdata;for( i=0;i8;i+)en dco un t=10;flag=1;coun t=0;whil

9、e (countendcount);if( irdata-(irdata/2)*2) en dco un t=41; elseen dco un t=15; flag=O;coun t=0;do while (count1;/发送八位数据的反码irdata=p_irdata;/要将数据位取反for (i=0;i8;i+)en dco un t=10;flag=1;coun t=0;while (countendcount);if (irdata-(irdata/2)*2)en dco un t=41; elseen dco un t=15; flag=0;coun t=0;while (cou

10、nt1;en dco un t=10;flag=1;coun t=0;do while (countendcount);flag=0;void delay()int i,j;for (i=0;i400;i+)for (j=O;j0;a-) for(b=40;b0;b-); void rem()interrupt 0/ 中断函数uint i=0; / 此处变量用来在下面配合连续监测 9MS 内就 是否有高电平prem=1;for(i=0;i1100;i+) /以下FOR语句执行时间为8MS左右if(prem) /进入遥控接收程序首先进入引导码的前半部判断 , 即:就是否有9MS左右的低电平ret

11、urn;/ 引导码错误那么退出 ,注意与 break 语句的区别while(prem!=1); /等待引导码的后半部 4、5 MS 高电平开始的 到来。delaytime(50); / 延时大于 4、5MS 时间 ,跨过引导码的后半局部 , 来到真正遥控数据 32 位中/第一位数据的0、56MS开始脉冲for(ramc=0;ramc4;ramc+)循环 4 次接收 4 个字节 for(count=0;count8;count+) / 循环 8次接收 8位(一个字节 ) while(prem!=1); /开始判断现在接收到的数据就是 0 或者 1 ,首先 在这行本句话时 ,/保已经进入数据的 0

12、、 56MS 低电平阶段/等待本次接受数据的高电平的到来。delaytime(9);/ 高电平到来后 ,数据 0 高电平最多延续0、56MS而数据1高电平可延续1、66MS大于0、8MS后我们可以再判 断遥控接收脚的电平。if(prem) / 如果这时高电平仍然在继续那么接收到的数据 就是 1 的编码ramramc=(ramramc1)+1;将目前接收到的数据位 1放到对应的字节中delaytime(11); /如果本次接受到的数据就是 1,那么要继续延迟 1MS,这样才能跨/下个位编码的低电平中(即就是开始的0、56MS中)else/否那么目前接收到的就是数据 0的编码ramramc=ram

13、ramc1; / 将目前接收到的数据位 0 放 到对应的字节中 / 本次接收结束 ,进行下次位接收 ,此接收动作进行 32 次,正好完 成 4 个字节的接收if(ram2!=(ram3&0x7f)/本次接收码的判断 for(i=0;i4;i+)/ 没有此对应关系那么说明接收失败 ,去除接受到的数据rami=0;returned;main()IT0=1;/设定INTO为边沿触发EX0=1;/翻开外部中断 0EA=1;/全局中断开关翻开while(1)switch(dis_num)case Ox81: num=O; break;case Oxcf: num=1; break;case Ox92: num=2; break;case Ox86: num=3; break;case Oxcc: num=4; break;case Oxa4: num=5; break;case OxaO: num=6; break;case Ox8f: num=7; break;case Ox8O: num

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论