通常的红外遥控器是将二进制脉冲码调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。

以下是常用的红外接收头的实物

发送数据格式

起始码是一个9ms的低电平,4.5ms的高电平,紧随其后的为数据码。

数据码‘ 0 ’和 ‘ 1 ’表示方法如下:

程序根据起始码和数据码的高低电平时间特征进行程序判断即可顺利解码,在实际应用中我们需要进行中容错处理,将时间增加或减少一定数量,防止实际产品中的误差而产生错误。

对于单片机来说,读取IO电平时间是一个比较基础的操作。

下面的代码利用单片机IO中断再读取IO定时器计数值的方法来获取IO变化时间,最后通过时间按照IR数据时间来解码。

其实还有很多种方法都可以实现此功能,比如用单片机的定时器的捕获功能,获取IO变化时间。还可以用一个定时器中断,固定时间读IO的电平状态来判断时间达到解码目的。

最简单的方法是利用带IR解码功能的单片机,直接读取IR数据。

IR发射只需按照编码时间控制IO变化再进行输出即可。

IR接收解码代码如下:

void main(void)

{

//程序使用一个定时器来计时。在IO变化时产生中断,来读取定时器的计数值。

TMOD = 0x01;//打开定时器1,

TR0 = 0; //关闭允许定时器1

IT0 = 1;

EX0 = 1;   //开外部中断1,下降沿触发,注意与单片机IO对应。

EA = 1;          //开总中断

while (1)

{

if (InFrared_Way == 1)   //判断是否接收到红外信号,若是能接收到信号,则进入函数。

{

EX0 = 0;          //关闭外部中断。

TR0 = 1;          //允许定时器1计时。

InFrared_Init(); // 初始化

TR0 = 1;          //关闭允许定时器1计时。

EX0 = 1;          //打开外部中断。

InFrared_Way = 0; //清零InFrared_Way ,已经结束红外接收。

}

}

}

中断函数:

bit InFrared_Way = 0;        //外部中断接收标志位,主要起到通知主函数中一个中断进入,可以执行解码工作了,这是一个全局变量。

void Int_0(void) interrupt 0 //外部中断程序

{

InFrared_Way  = 1;       //让变量置1,从而在主程序里判断接受到红外信号。

}

接收处理类函数如下:

sbit INIR = P3^2;            //51单片机的引脚定义,注意一定要是带中断功能的引脚,有些IO是不带中断功能的所以不能用。

unsigned char Data[4] = {0}; //定义四组8位的数据,刚好储存红外信号的32位数据。

红外接收处理函数:

void InFrared_Init(void)

{

unsigned char i, j;          //定义4个数据,每个数据8个位,i表示数据,j表示位。

TH0 = 0;

TL0 = 0;                 //定时器1清0

while (INIR == 0 && TH0 <= 35);  //等待9ms低电平。

if (INIR == 1)           //判断是否为高电平。

{

while (INIR == 1 && TH0 <= 55);  //等待4.5ms高电平。

//开始接收数据。

for (i = 0; i < 4; i++)

{

for (j = 0; j < 8; j++)   //接收4组8位数据。

{

TH0 = 0;

TL0 = 0;                 //定时器1时间清0。

while (INIR == 0 && TH0 <= 3);   //等待560us低电平。

while (INIR == 1); //判断高电平时间。

Data[i] >>= 1; //数据左移一位。

if (TH0 >= 7)  //判断是否大于阈值。

{

Data[i] |= 0x80;  //数据写1

}

}

}

}

}

整体代码:

#include <STC12C5A60S2>       //这个根据自己的51单片机芯片来修改。

sbit INIR = P3^2;                //这个根据自己定义引脚,注意要带中断功能。

bit InFrared_Way = 0;

unsigned char Data[4] = {0};

void InFrared_Init(void);

void main(void)

{

TMOD = 0x01;

TR0 = 0;

IT0 = 1;

EX0 = 1;

EA = 1;

while (1)

{

if (InFrared_Way == 1)

{

EX0 = 0;

TR0 = 1;

InFrared_Init();

TR0 = 1;

EX0 = 1;

InFrared_Way = 0;

}

}

}

void Int_0(void) interrupt 0

{

InFrared_Way  = 1;

}

void InFrared_Init(void)

{

unsigned char i, j;

TH0 = 0;

TL0 = 0;

while (INIR == 0 && TH0 <= 35);

if (INIR == 1)

{

while (INIR == 1 && TH0 <= 55);

for (i = 0; i < 4; i++)

{

for (j = 0; j < 8; j++)

{

TH0 = 0;

TL0 = 0;

while (INIR == 0 && TH0 <= 3);

while (INIR == 1);

Data[i] >>= 1;

if (TH0 >= 7)

{

Data[i] |= 0x80;

}

}

}

}

}

当IR数据解码出来后,数据就可以使用了,如用串口发送出去,或直接进行输出控制,还可以进行数据加解密码处理等等。

这里只是一个比较简单的IR解码方法,在抗干扰,单片机利用率和数据处理上都还有很大的优化空间。有兴趣的可以参考前面提到的其它解码方法去实现代码、优化代码。据我所知,很多的无线通信也是采用的这种方式。

51单片机的红外接收解码相关推荐

  1. 基于51单片机+红外遥控解码+LCD1602显示

    红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...

  2. 51单片机红外通信解码教程

    ** 下面先提供一段芯片手册 ** HT6221/2解码手册 下面我们对这个遥控器编写一个解码程序, 依照模块化设计的思想,逐个函数进行编写 因为波形是与时间相关联的,我们先编写延时函数 //函数功能 ...

  3. 51单片机PS2键盘解码实验--C51源代码

    //地址:http://www.jdgcs.org/wiki/Downloads #include <at89x51.h> #include "KBCODE.H" #d ...

  4. 433遥控器无线解码 1527中断方式解码 51单片机

    433遥控器无线解码 1527中断方式解码 51单片机 这版为1527遥控器解码,是为了项目洗臀器做遥控器控制.1527遥控器原理如下. 码分别为:同步码 地址码20位 键码4位(也可以同步码16位 ...

  5. 求义隆单片机c语言红外解码程序,只用一个单片机定时器的红外接收解码程序...

    /****************<51单片机轻松入门-基于STC15W4K系列>配套例程 ************* ★★★★★★★★★★★★★★★★★★★★★★★★ <51单片机 ...

  6. 51单片机红外收发器的编码与解码

    最近在研究信号的编码和解码,正好手头有51单片机开发板,所以打算通过研究开发板上的红外模块来加深对编码和解码的认识和理解. 在各类开发板中基本都会有红外模块,该模块主要由红外遥控器(发射端)和红外接收 ...

  7. AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  8. 51单片机常用功能及相关内容

    一.基本概念: 1.引脚 图1.1 这里只介绍常用及主要的引脚. I/O口引脚:P0.P1.P2.P3 P0口:39脚~32脚,双向8位三态I/O口,每个口可独立控制,但内部无上拉电阻,为高阻态,故不 ...

  9. 基于51单片机的旋转LED

    大三的期末设计(大三好几个期末设计),当初感觉这个东西挺酷炫的,就去搞了一下,然而未曾料到,大三期末太多设计,同时51单片机的项目以前有做过,就没花很多时间在这个设计上,做了一周多,效果差强人意. 先 ...

  10. 51单片机红外通信及控制LED灯(LCD1602显示)

    51单片机红外通信及控制LED灯(LCD1602显示) 大家好,又和大家见面了,离上一次DS18B20传感器的文章已经过去了一个星期了,这期我将给大家带来,基于STC89C52芯片和HS0038红外接 ...

最新文章

  1. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM
  2. 在线编译工具 Jenkins Hudson 的关系
  3. c#读取string类型的xml格式的字符串
  4. 线性表-----队列
  5. 【程序设计】流程图的规范和绘制
  6. 太难了!经营12年的明星机构都关停了,却还是有玩家疯狂入局
  7. mysql 分区表 限制_Mysql分区表使用的一些限制和需要注意的地方-阿里云开发者社区...
  8. Excel日期转换mysql_EXCEL与MySQL日期格式转换
  9. webpack手动构建vue和vue-cli构建使用 px2rem-loader ,全局自动转换px单位,让自适应来的更简单点!...
  10. .NET Reflector 反射下载
  11. PLC对接SQL数据库,实现数据采集和边缘计算
  12. 某P2P开发商ERP系统核心业务介绍
  13. dns服务器 响应超时,DNS 客户端解析超时 - Windows Server | Microsoft Docs
  14. mac关闭渐隐和弹出动画效果
  15. AE入门教程及素材资料链接
  16. ssm合集(spring)---007
  17. 计算机仿真文献标识码,【计算机仿真论文】计算机仿真纸币识别体系分析(共4309字)...
  18. 电子商务系统需求分析
  19. boostrap安装和使用
  20. 阿里云游戏盾价格(收费标准)

热门文章

  1. Java使用jfreechart画饼图_JFreeChart饼图
  2. 如何修改dns服务器ip,如何修改DNS服务器IP地址
  3. 「新手指南」如何在Mac上格式化U盘和移动硬盘?
  4. matlab 角速度,从您的移动设备获取并绘制角速度和方向数据
  5. matplotlib之pyplot模块——阶梯图(step():基本功能、参数)
  6. 利用MsOffice将PPT转换成图片
  7. 完美商业计划书全攻略
  8. 【并发编程】Once 基本用法和如何实现以及常见错误
  9. Linux下修改Mysql的用户(root)密码和查看默认端口的方法
  10. 行人重识别论文阅读5-基于换衣服的行人重识别