ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:257.30KB ,
资源ID:3930219      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3930219.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机控制红外通信.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于51单片机控制红外通信.docx

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

2、即以前发射端原始信号是高电平,那接收头输出的就是低电平,反之亦然。因此为了保证解码过程简单方便,在编码时应该直接换算成其反码。) 1.红外发射部分:下图为红外发射部分的电路拟图:编码过程: (1) 二进制信号的调制二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz的间断脉冲串(用定时器来完成),相当于用二进制信号的编码乘以频率为38kHz的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。(2)PPM编码这种遥控编码具有以下特征:遥控编码脉冲由前导码、16 位地址码(8位地址码、8 位地址码的反码)和 16 位操作码(8 位操作码、8 位操作码的反码)

3、组成。前导码:是一个遥控码的起始部分,由一个9ms的高电平 ( 起始码 ) 和一个4. 5ms的低电平 ( 结果码 )组成,作为接受数据的准备脉冲。16位地址码:能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。16 位操作码:用来执行不同的操作。采用脉宽调制的串行码,以脉宽为0.56ms、间隔0.56ms、周期为1.12ms的组合表示二进制的“0”;以脉宽为1.68ms、间隔0.56ms、周期为2.24ms的组合表示二进制的“1”。 (3)发送程序#include static bit OP; /红外发射管的亮灭控制位static unsigned int count; /延时计数器st

4、atic unsigned int endcount; /终止延时计数static unsigned char flag; /红外发送标志sbit P3_4=P34;char iraddr1; /十六位地址的第一个字节char iraddr2; /十六位地址的第二个字节void SendIRdata(char p_irdata);/发送子函数void delay();void main(void) count = 0; flag = 0; /无载波 OP = 0; /不亮 P3_4 = 0; /在后面会发现用OP赋值的 EA = 1; /允许CPU中断 TMOD = 0x11; /设定时器0和

5、1为16位模式1 ET0 = 1; /定时器0中断允许 TH0 = 0xFF; TL0 = 0xE6; /设定时值0为38K 也就是每隔26us中断一次 TR0 = 1;/开始计数 iraddr1=3;/自定义的一个地址 iraddr2=252;/地址反码 do delay(); SendIRdata(12); while(1); /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFF; TL0=0xE6; /设定时值为38K 也就是每隔26us中断一次 count+; if (flag=1) OP=OP; /如果是待发送的有效数据flag=1,就在

6、此产生载波(亮灭交变) else OP = 0; P3_4 = OP; void SendIRdata(char p_irdata) /发送数据子函数 int i; char irdata=p_irdata; /*/ /发送9ms的起始码,并是载波模式有效 endcount=223; flag=1; count=0; while(countendcount);/等待中断,控制亮灭交变的总时间为9ms /发送4.5ms的结果码,并是载波模式无效 endcount=117 flag=0; count=0; dowhile(countendcount); /*/ /发送十六位地址的前八位 irdat

7、a=iraddr1; for(i=0;i8;i+) /一个周期里规定先以高电平开始,在以低电平结束。先发送0.56ms的38KHZ“1”的红外波(即编码中0.56ms的高电平) endcount=10; flag=1; count=0; dowhile(countendcount); /停止发送红外信号(即编码中的低电平) if(irdata-(irdata/2)*2) /判断二进制数个位为1还是0 endcount=41; /1为宽的高电平1.68ms elseendcount=15; /0为窄的高电平0.56ms flag=0; count=0; while(count1;/依次取位 /发

8、送十六位地址的后八位 irdata=iraddr2; /此处已经是地址的反码 for(i=0;i8;i+) endcount=10; flag=1; count=0; while(countendcount); if(irdata-(irdata/2)*2) endcount=41; else endcount=15; flag=0; count=0; dowhile(count1; /*/ /发送八位数据 irdata=p_irdata; for(i=0;i8;i+) endcount=10; flag=1; count=0; while(countendcount); if(irdata-

9、(irdata/2)*2) endcount=41; else endcount=15; flag=0; count=0; dowhile(count1; /发送八位数据的反码 irdata=p_irdata; /要将数据位取反 for(i=0;i8;i+) endcount=10; flag=1; count=0; while(countendcount); if(irdata-(irdata/2)*2) endcount=41; else endcount=15; flag=0; count=0; while(count1; endcount=10; flag=1; count=0; do

10、while(countendcount); flag=0;void delay() int i,j; for(i=0;i400;i+) for(j=0;j0;a-) for(b=40;b0;b-); void rem()interrupt 0 /中断函数 uchar ramc=0; /定义接收了4个字节的变量 uchar count=0; /定义现在接收第几位变量 uint i=0; /此处变量用来在下面配合连续监测9MS 内是否有高电平 prem=1; for(i=0;i1100;i+) /以下FOR语句执行时间为8MS左右 if(prem) /进入遥控接收程序首先进入引导码的前半部判断,即

11、:是否有9MS左右的低电平 return; /引导码错误则退出 ,注意与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.56MS

12、低电平阶段 /等待本次接受数据的高电平的到来。 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=ramramc1; /将目前接

13、收到的数据位0放到对应的字节中 /本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收 if(ram2!=(ram3&0x7f) /本次接收码的判断 for(i=0;i4;i+) /没有此对应关系则表明接收失败,清除接受到的数据 rami=0;returned;main() IT0=1; /设定INT0为边沿触发 EX0=1; /打开外部中断0 EA=1; /全局中断开关打开 while(1) switch(dis_num) case 0x81: num=0; break; case 0xcf: num=1; break; case 0x92: num=2; break;

14、 case 0x86: num=3; break; case 0xcc: num=4; break; case 0xa4: num=5; break; case 0xa0: num=6; break; case 0x8f: num=7; break; case 0x80: num=8; break; case 0x84: num=9; break; case 0x88: num=10;break; case 0xe0: num=11;break; case 0xb1: num=12;break; case 0xc2: num=13;break; case 0xb0: num=14;break; case 0xb8: num=15;break; P2=tablenum; P1=0x01; delaytime(5);

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2