红外线发射与接收C51用C语言解决方案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//红外线延时函数,延时 0.56 毫秒
//红外线延时函数,延时 0.5 毫秒
delay_ms(9); rfot=1; delay_ms(4); delay_50(); } void a_key() { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; //A 键编码
用户码
用户反码
rfot=0; delay_ms(1); rfot=1; } void c_key() { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; //C 键编码
用户码
用户反码
rfot=0; delay_ms(1); rfot=1; } void d_key() { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; //D 键编码

1
注意:单片机的时钟频率为 12.289MHz
如上图所示,发射部分的电路其实很简单,单片机我选的是 AT89C2051,相信大家都很熟悉 还有就是四个按键 A,B,C,D, AT89C2051 的 P1^6 端口是发射信号的输出端, 就等同于红外接受头 的输出脚(一般是第 3 个脚,大家可以查资料) 。 上面的电路是起什么作用呢,我解释一下,作用就是仿真红外线发射部分向接受部分发出的 信号,具体的就是,如果我按下了 A 键,那么电路就会发出一个固定的编码,按下不同的键其编 码是不同的。下面有个表格,四个按键的编码就一目了然了: 表 一 键 项目 用户码 用户反码 数据码 数据反码 A B C D 0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0x0F 0x39 0x75 0xF9 0xF0 0xC6 0x8A 0x06
delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56();
现在大家已经知道了每个键的编码,在写程序之前,先要说一下有关红外线发射的知识,我 想大家对这些知识应该是很了解的了,在这里补充说一下是为了在下一步写程序是大家能明白我 的思路是对还是错? 再不考虑发射芯片的型号,就用大家常用的编码方式: 首先先来说说引导区,如下图:
图 二 每个按键在被按下之后首先会有像上图所的信号发出,称为引导区,实际生活中,用遥控器 发出的信号与上面的信号是相反的,经过红外线接收头解码以后就和上图一样了,值得大家注意 的是发射模块的芯片不同,引导区的时间和数据都有所不同,但解决的方法都是一样的。 在写程序是就按照上面的图来写: P1^6=0; Delay(); //延时 9mS P1^6=1; Delay(); //延时 4.5mS
//用户码
//用户反码
rfot=0; delay_ms(1); rfot=1; } void b_key() //B 键编码 { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0;
下面就是数据“0”和“1”的信号波形了,如下图:
图 三 写程序“0”的代码: P1^6=0; Delay(); //延时 0.56mS P1^6=1; Delay(); //延时 0.56mS 写程序“1”的代码: P1^6=0; Delay(); //延时 0.56mS P1^6=1; Delay(); //延时 0.56mS Delay(); //延时 0.56mS 除了引导码之外,信号都是以低电平开始的,这一点是很重要的。如下图
上面的图就是我用仿真软件仿真出来的编码,包含引导区和用户码和用户反码,从图中可 以看出数据“1”的信号明显要比“0”的信号宽很多,整个一条数据码除去引导区总共有 32 位 数据,4 个字节,分别是用户码,用户反码,数据码,数据反码,在红外线接受端我只接受了 数据码。 下面是完整的 C 语言的程序代码,直接生成 HEX 文件,把此文件关联到仿真电路图上的 AT89c2051 中,用示波器看 P1^6 脚,当每按下一个键放开,都能看到该键的编码波形。 #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit rfot=P1^6; //红外线输出 sbit akey=P1^2; //A 键输入 sbit bkey=P1^3; //B 键输入 sbit ckey=P1^4; //C 键输入 sbit dkey=P1^5; //D 键输入 void delay_ms(uint xms) //延时子函数 1ms*xms { uint i,j; for(i=xms;i>0;i--) for(j=127;j>0;j--); } void delay_112() //红外线延时函数,延时 1.12 毫秒 { uint m,n; for(m=1;m>0;m--) for(n=142;n>0;n--); } void delay_56() { uint m,n; for(m=1;m>0;m--) for(n=70;n>0;n--); } void delay_50() { uint m,n; for(m=1;m>0;m--) for(n=64;n>0;n--); } void bit_boot() { rfot=0;
delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56();
红外线发射与接收 C51 单片机解决案
作者:sunny ——包含 C 语言源程序以及仿真电路图 Email:sunaun_man@163.com 日期:2011-10-5
目前红外线遥控器控制技术已应用非常广泛,其技术日趋成熟,利用单片机,用简单的几句 C 语言命令便能实现对目标设备精准控制。 虽然此技术已经很成熟,但对于初学单片机技术的学员来看还是有一定难度的,我呢在网上 也查找了有关红外线遥控相关的资料,让我很失望,资料很多都是有头没尾,或者就是程序写的 晦涩难懂,而且很多都是用汇编语言编写,对只学习了 C 语言而又不喜欢汇编的同学来说容易晕 头转向不知道从哪里下手, 这里我呢正好有一个很好的红外线遥控的列子, 拿来和大家分享一下, 若有不足之处,还请大家多多指教,文章前面有我的邮箱地址,大家若是有问题或是更好的方案, 不防拿出来大家一起分享。 首先,我先把我的思路和大家说说,红外线遥控包括发射和接受两个部分,这两个部分我都 是用 Keil uVision2 和 Proteus 7 Professional 仿真软件来实现的,也就是所有的过程都是在电脑上 实现的,不需要任何硬件或是外接设备,主要的是用 C 语言写出发射和接受的程序来,并在理想 的仿真环境下实现其功能,当然若要在硬件上实现还需要调整一些程序上的函数值来实现了。 废话少说,现在就开始我的第一步,设计原理图: 先上一张发射部分的仿真的原理图 图 1:
delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56();Biblioteka Baidurfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56();
相关文档
最新文档