红外线发射与接收C51用C语言解决方案_第1页
红外线发射与接收C51用C语言解决方案_第2页
红外线发射与接收C51用C语言解决方案_第3页
红外线发射与接收C51用C语言解决方案_第4页
红外线发射与接收C51用C语言解决方案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、红外线发射与接收C51单片机解决案包含c语言源程序以及仿真电路图作者:sunny Email: 11 期:2011-10-5目前红外线遥控器控制技术己应用非常广泛,其技术H趋成熟,利用单片机,用简单的儿句 C语言命令便能实现对目标设备精准控制。虽然此技术己经很成熟,但对初学单片机技术的学员來看还是有一定难度的,我呢在网上 也查找了有关红外线遥控相关的资料,让我很失與,资料很多都是有头没尾,或者就是程序写的 晦涩难烯,而且很多都是用汇编语言编得,对只学习了C语言而乂不喜欢汇编的同学來说容易晕 头转向不知道从哪里下手,这里我呢正好有一个很好的红外线遥控的列子,拿来和大家分7下, 若有不足Z处,还请

2、大家多多指教,文章前面有我的邮箱地址,大家若是有问题或是更好的方案, 不防拿出來大家一起分享O首先,我先把我的思路和大家说说,红外线遥控包括发射和接受两个部分,这网个部分我都 是用Keil uision2和Proteus 7 Professional仿貞软件來实现的,也就是所有的过程都是在电脑上 实现的,不需耍任何硬件或是外接设备,主耍的是用C语言写出发射和接受的程序來,并在理想 的仿真环境下实现其功能,当然若要在硕件上实现还需要调整一些程序上的函数值來实现了。废话少说,现在就开始我的第一步,设计原理图:先上一张发射部分的仿真的原理图图1:U16卫77>XTAL1proP1.1P1.2X

3、TAL2P1.3P1.4P1.5RSTP1 6P1.7P3.2/INT0P3.3/INT1P3.4/T0P3.5fT1P3.0/RXDP3.7P3.1/TXD541AT89C20512T 匚 XT>*1213141516T71823BoCoC 上红外线发射输入端注意:单片机的时钟频率为12.289MHz如上图所示,发射部分的电路其实很简单,单片机我选的是AT89C2051,相信大家都很熟悉 还有就是四个按键A,B,C,D, AT89C2051的PW6端口是发射信号的输出端,就等同丁红外接受头 的输出脚(一般是第3个脚,大家可以査资料)。上面的电路是起什么作用呢,我解释一下,作用就是仿真红

4、外线发射部分向接受部分发出的 信号,具体的就是,如果我按下了 A键,那么电路就会发出一个固定的编码,按下不同的键其编 码是不同的。下而有个表格,四个按键的编码就一目了然了:表一用户码用户反码数据码数据反码A0x00OxFFOxOFOxFOB0x00OxFF0x390xC6C0x00OxFF0x75OxSAD0x00OxFF0xF90x06现在大家已经知道了每个键的编码,在写程序之前,先耍说一下有关红外线发射的知识,我 想大家对这些知识应该是很了解的了,在这里补充说一下是为了在下一步写程序是大家能明白我 的思路是对还是错?再不考虑发射芯片的世号,就用大家常用的编码方式:首先先来说说引导区,如下图

5、:图二每个按键在被按下之后首先会有像上图所的信号发出,称为引导区,实际生活中,用遥控器 发出的信号与上面的信号是相反的,经过红外线接收头解码以后就和上图一样了,值得大家注意 的是发射模块的芯片不同,引导区的时间和数据都有所不同,但解决的方法都是一样的。在写程序是就按照上而的图来写:PlA6=0:Delav(); 延时 9n)SPl 人 6=1:DelavO,延时 4.5niS写程序“0”的代码:Pl 人6=0:Delay0* 延时 0.56mSP1A6=1:DelavQ, 延时 0.56mS 写程序“r的代码:PlA6=0:DelayQ; 延时 0.56mSP1A6=1;Delay0; 延时

6、0.56mSDelavO,延时 0.56inS除了引导码之外,信号都是以低电平开始的,这一点是很重耍的。如下图21L»ZZ ACDC ONOOFF一一DiOit-nl f>srillnmprClmni tel D上面的图就是我用仿真软件仿真出來的编码,包含引导区和用户码和用户反码,从图中可 ?¥出数丸:“1"的信号明显耍比“0”的信号宽很多,整个一条数据码除去引导区总共有32位 数据,4个字节,分别是用户码,用户反码,数据码,数据反码,在红外线接受端我只接受了 数据码。下面是完整的C语言的程序代码,直接生成HEX文件,把此文件关联到仿真电路图|.的 AT89

7、c2051中,用示波器看PM6脚,当每按下一个键放开,都能看到该键的编码波形。# include <reg51.h>#define uchai unsigned chai #define unit unsigned int sbit rfot=PlA6; 红外线输出 sbit akex-PlA2, /A 键输入 sbit bkev=PlA3, B 键输入 sbit ckex-PlA4, /C 键输入 sbit dkey-PlA5, /D 键输入 void delay_ms(uiiit xms) Ulllt 1 J, foi(i=xn】s,i>0dT for(j=127;j&g

8、t;0;H; )void delav_l 12()unitfor(ni= 1)for(n= 14 2卫>0,11).延时子函数lins*xn)s红外线延时函数,延时1.12秒void delav_56()umt n),n,for(ni= 1 ;ni>0;n) for(u=704i>04i);红外线延时函数,延时0.56电秒void delay_50Quint ni,n,fof(n)=l,i)i>0jn-) for(n=64,n>04i);红外线延时函数,延时0.5亳秒void bit_bootQrfot=0.delay_ms(9);rfot=l;delav_ms(

9、4); delay_50Q;/A键编码) void a_key()unit 1; bit_boot();foi(i=0,i<8,i+) rfo(=0, delay_560; lfot=l; delay_560;) foi(i=0;i<84+)rfot=0, delav_56(); rfot=l; delay12();)rfot=0, delav_56();rfot=l;delav_56();rfot=0, delav_56();rfot=l;delav_56Q;rfot=0, delav_56();rfot=l; delav_56Q;rfot=0, delav_56();rfot=

10、l;delav_56Q;rfot=0, delav_56Q, rfot=l;delav_l 12();rfot=0,delav_56(); rfot=l, delay_56Q, rfot=0;delav_56(), rfot=l, delav_1120, rfot=0;/用户码delav_56(), rfot=l, delav_1120,rfot=0, delay_56Q, rfot=l, delav_112(); rfot=0, delay_56Q, rfot=l, delay_112(), rfot=0, delav_56(), rfot=l, delav_112(), rfot=0, d

11、elav_56Q, rfot=l; delav_112(), rfot=0, delav_56Q, rfot=l, delav_56(), rfot=0, delav_560, rfot=l, delav_112Q, rfot=0, delav_560, rfot=l; delav_56(), rfot=0, delay_56Q, rfot=l, delav_56Q;用户反码rfot=0, delav_nis(l); rfot=l;/B键编码)void b_key() unit 1; bit_boot();foi(i=0,i<8,i+) rfo(=0, delay_56(); lfot=

12、l; delay_560;)f01(1=0,1<8,1+) rfot=0, delay_56(); rfot=l; delay12();) rfot=0, delav_56(); rfot=l;delav_56(); rfot=0, delav_56(); rfot=l;delav_56(); rfot=0, delav_56(), rfot=l;delav_l 12(); rfot=0, delav_56(); rfot=l;delav_l 12(); rfot=0, delav_56Q, rfot=l;delav_l 120;rfot=0,delav_56(); rfot=l, de

13、lay_560; rfot=0;delav_56(), rfot=l, delav_1120, rfot=0;用户码delav_56(), rfot=l, delav_1120,rfot=0, delay_56Q, rfot=l, delav_112(); rfot=0, delay_56Q, rfot=l, delav_112(), rfot=0, delav_56(), rfot=l, delay_56Q; rfot=0, delay_56Q, rfot=l; delav_56(); rfot=0, delay_56Q, rfot=l; delav_56Q; rfot=0, delav_5

14、60, rfot=l, delav_112(); rfot=0, delav_560, rfot=l, delav_56Q; rfot=0, delav_56(), rfot=l, delav_56();rfot=0, delav_nis(l); rfot=l;/C键编码) void c_keyQunit 1; bit_bootQ;foi(i=0,i<8,i+) rfo(=0, delay_560; lfot=l; delay_560;)卄) rfot=0, delay_560; rfot=l; delay12();)rfot=0, delav_56();rfot=l; delav_56

15、();rfot=0, delav_56();rfot=l; delay_112();rfot=0,delav_56(), rfot=l;delav_l 12();rfot=0,delav_56(), rfot=l;delav_l 12();rfot=0,delav_56Q, rfot=l;delav_l 120;rfot=0,delav_56(); rfot=l, delay_560; rfot=0;delav_56(), rfot=l, delav_1120, rfot=0;用户码delav_56(), rfot=l, delav_1120,rfot=0, delay_56Q, rfot=l

16、, delav_112(); rfot=0, delay_56Q, rfot=l, delav_56Q; rfot=0, delav_56(), rfot=l, delav_56Q; rfot=0, delay_56Q, rfot=l; delav_56(); rfot=0, delay_56Q, rfot=l; delav_56Q; rfot=0, delav_560, rfot=l, delav_112(); rfot=0, delav_560, rfot=l, delav_56Q; rfot=0, delav_56(), rfot=l, delav_56();ifot=0, delav_

17、ms(l); ffot=l;D键编码 void d_keyQmnt i; bit_bootQ;foi(i=0,i<8,i+)ifot=0, delav_56(); rfot=l, delay_56();foi(i=0j<8j 卄) ifot=0, delav_56(); rfot=l, delay12(),rfot=0, delav_56Q;rfot=l;delav_l 12();rfot=0, delav_56Q;rfot=l, delay_56Q;rfot=0, delav_56Q;rfot=l,delay12();rfot=0, delay_56Q;rfot=l, delay

18、_112();rfot=0, delav_56Q;rfot=l, delay_112();rfot=0.delav_56(); rfot=l, delay_560; rfot=0;delav_56(), rfot=l, delav_1120, rfot=0;用户码delav_56(), rfot=l, delav_1120,rfot=0, delay_56Q, rfot=l, delav_56Q; rfot=0, delay_56Q, rfot=l, delav_112(), rfot=0, delav_56(), rfot=l, delav_56Q; rfot=0, delay_56Q, r

19、fot=l; delav_56(); rfot=0, delay_56Q, rfot=l; delav_56Q; rfot=0, delav_560, rfot=l, delav_112(); rfot=0, delav_560, rfot=l, delav_56Q; rfot=0, delav_56(), rfot=l, delav_56(); rfot=0, delav_nis(l);rfot=l;)void iiut(jTMOD=0x01;TH0=(65536-50000)/256;TLO=(65536-50000)%256;EA=1;ETO=1;)void kevscauQ/键盘扫描程

20、序if(akey=0)delay_jns(5);if(akev=0)a_key(), while(!akev),)if(bkey=0)delav_jns(5);if(bkev=0)b_keyO, while Cbkey),) if(ckev=0)delay_ms(5);if(ckev=0)c_keyQ; wlule(!ckey);)if(dkey=0)delay_ins(5); if(dkev=O)d_kevO;while (!dkey),TRO=TRO,)void n)ainO程序从这里开始imtO;while(l)kevscanQ;)void TO_tin)eOinteinipt 1TH0

21、=(65536-50000)/256;TL0=(65536-50000)%256;注意:单片机的时钟频率为12.289MHz第二部分接受部分接受部分是红外线遥控中的巫点,其中最巫耍的就是解码,如何识别发射信号的“0”和“ 1 ” , 得到准确的数据码,然后要根据相应的编码去实现不同功能的控制。下面我先把发射和接受的整个原理图作出來,如下图:注意:单片机的时钟频率为12-289MHZU21=AfALZm-traJHTWTBP5J1WFTF3ju roEX r iP3.rn 1 2 9 A A A r RmplRdp"P3.H13MPSrrcxrv只4.Ik/tX 门只8lhfa fIJ

22、1-BMAL m PIJ琳M2EeSE9 1 dEFFI15Pi.rnaaTmipsaTT Rf PCTJMT lrancouDP3 rCTJirxD30=3'2注意:单片机的时钟频率为12.289MHz先解释一下上面的电路图,其中也包含发射电,在上一部分我己经说过了,在这电在提一下 就是发射部分U1的输岀信号是接在接受部分U2的P3人7端口上,在程序我己经定义过了,另 外接受部分的单片机我还是选用的AT89C205其位号是U2,它的P1端口我接了 8个发光二极 管,作用是把解码后的数据码氏接送到P1端口上,可以直接看出编码是否正确。下面我就说下我解码的思路,其实思路都是一样的,看下下

23、图的的程序流程图,我相信大家 一看就会很明白了:图五很多有关红外线解码的资料上都会把读数据的延时时间定为0.882J11S,这个时间在具体用的 时候还是需要调整的,关键的是引导区过肩的的第个低电址要多增加0.56J11S的延时才能 正确的解码,更关键的是在每次读出数据后根据P3人7的电平是高是低其后面的延时也是不同 的,如果为零则延时要短一点0.25mS以内,等到出现高电平再延时0.882mS后读数据,如果为 高电平,那必须延时0.56inS以上,再等待高电平出现后延时0.882mS后读数据,否则是无法正 常解码,刚刚说的那些时间都是可以调的,而且是必须电路芯片的不同和实际应用中的环境不 同要

24、不断的调试,方能达到解码的最佳效果! !下面就是接受部分的程序代码,M接生成HEX文件在仿真电路中写入单片机就可以看到结 果了。#mclude <reg51.h>#define ucliai unsigned char#define unit unsigned mt sbit iiin=P3A7; 红外线输入 void delay_i)s(iiint xms) uint 1 j, foia=xins,i>0T for(j=127;p0;j-); void delav_l 12(Junitfor(n)=l;nj>0;ni)foi (u= 14 2,n>0,n);/延

25、时子函数ln)s*xins红外线延时函数,延时1.12毫秒)void delay.56()lllllt 山卫, for(n)= 1 ;ni>0;m) for(n=70,n>0,u-); void delay_50()uint m,u,for(n)= l,ni>0jn) for(n=64,n>0;n);红外线延时换数,延时0.56亳秒红外线延时因数,延时0.5亳秒void delay.35()红外线延时函数,延时 0.35 秒unit mji,foi(n)= 1 ;ni>Ojn) for(n=60,n>0,u-),)x oid delay_30()红外线延时函数,延时0.30毫秒unit mji;for(n)=

温馨提示

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

评论

0/150

提交评论