我们的开发板上会有一个红外接收头和一个遥控器。通过这两个小东西就可以完成红外实验。其中这个遥控器采用了NEC协议。除了这个协议还有RC5、RC6类型的。我们接下来就说说红外接受和红外发射。

  1. 红外发送与接收
    发射段就是一个红外发光二极管,产生红外光信号;接收端接收光信号通过光敏电阻把光信号转换成电信号,进一步装换成数字信号。但是发射端的功率较弱,那么光信号就比较弱,为了解决这个问题我们就引入了载波的概念。

  2. 载波
    载波就是一个车,我可以做上这个车到达下一个地方。这个车就是载波。那么上车和下车就是调制解调

  3. 调制
    调制就是按下遥控器的数字,然后通过把这个按键的信号转换成一个载波信号。信号遥控器发送的数据码由以下部分组成:引导码,8位的客户码,8位客户码的补码,8位的按键值,8位按键值的补码;

  4. 解调
    解调就是把这个载波信号通过接收端转换位时序信号,通过接收端的输出引脚把时序信号传送给MCU的外部中断,让主机来判断信号。

    那么我们就想,数字信号是由0和1组成的。发射段最终把他的光信号包含的信息也是最终转换成了接收端的0和1。他是怎么做到的呐。

    上边阴影部分代表载波。载波-空闲-载波-空闲。第一部分空闲2.25ms-560微秒,第二部分空闲时间是1.12ms-560微秒。通过两个载波之间的空闲时间来判断是1或者0。通过0和1来传递信息

  5. NEC协议
    我们的单片机有一个红外遥控器,按下其中的一个按钮的时候就会发出如下的载波信号

    每个按键被按下会发送不停的信号。但是最开始都是9ms载波加上4.5ms的空闲。之后是32位数据,一共四个字节:地址码,地址码反码,数据码,数据码反码。红外接收端把载波信号转换成时序信号共主机来判断。
    另外我们需要注意的一点是发射端和接收端的0和1是相反的。 当红外接收端接收到载波信号的时候,out引脚输出低电平。如下图所示。这就是解调的过程。调制是把信息转换成载波信号,解调就是重新载波信号解调出来。


下边我们俩看看红外发送与接收需要那些东西

  1. 首先是需要定时器,因为通过定时器来计算两个载波之间空闲时间
  2. 外部中断1,我用的板子是MCS51 。红外接收端的OUT引脚连接的是
    P3.2(外部中断1),因为接收端接收到载波信号输出低电平,所以我们需要外部中断1为低电平触发。
  3. 需要说明一点的是,在项目中,外部中断1中断级别0,是最高级别,比我们用的定时器中断级别要高,所以面对两个中断是,主机先处理外部中断。当载波接收完毕,就开始接收空闲信号,这个时候外部中断不被触发,开始执行定时器中端,开始计数,通过计数数值结合定时器单次溢出时间来判断时序信号的0和1.

上代码


#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit IR=P3^2;           //红外接口标志
sbit dula=P2^6;        //定义锁存使能端口 段锁存
sbit wela=P2^7;        //                 位锁存unsigned char code Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char  irtime;  //红外用全局变量bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];void Ir_work(void);
void Ircordpro(void);void tim0_isr (void) interrupt 1 using 1
{irtime++;  //用于计数2个下降沿之间的时间
}void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{static unsigned char  i;             //接收红外信号处理static bit startflag=0;                //是否开始处理标志位if(startflag)                         {if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}
}void Ir_work(void)//红外键值散转程序
{switch(IRcord[2])//判断第三个数码值{case 0x0c:P0=Table[1];break;//1 显示相应的按键值case 0x18:P0=Table[2];break;//2case 0x5e:P0=Table[3];break;//3case 0x08:P0=Table[4];break;//4case 0x1c:P0=Table[5];break;//5case 0x5a:P0=Table[6];break;//6case 0x42:P0=Table[7];break;//7case 0x52:P0=Table[8];break;//8case 0x4a:P0=Table[9];break;//9default:break;}irpro_ok=0;//处理完成标志}
void Ircordpro(void)//红外码值处理函数
{ unsigned char i, j, k,cord,value;k=1;for(i=0;i<4;i++)      //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value=value|0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;     } irpro_ok=1;//处理完毕标志位置1
}void TIM0init(void)//定时器0初始化
{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1;    //开中断TR0=1;
}
void EX0init(void)
{IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1;   //使能外部中断EA = 1;    //开总中断
}void main(void)
{EX0init(); //初始化外部中断TIM0init();//初始化定时器dula=0;      //位锁存P0=0xfe; //取位码 第一位数码管选通,即二进制1111 1110wela=1;      //位锁存wela=0;P0=0x3f; //取位码 第一位数码管选通,即二进制1111 1110dula=1;      //位锁存while(1)//主循环{if(irok)                        //如果接收好了进行红外处理{   Ircordpro();irok=0;}if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}
}
  • 注释
    代码中的Ir_work()函数中用到了按键时序信号和按键值的对应关系,比如:
    0x0c对应按键1。这里每个遥控器有所不同,可以通过看说明书获得,也可以通过示波器测波形,也可以通过串口通信把数字打印在上位机上

51单片机之CHQ1838红外接收(NEC协议)相关推荐

  1. 51单片机的改装遥控风扇制作

    51单片机通过1838D红外接收头控制风扇 用到的元器件 控制方式 制作过程和思路 程序清单 成品图 由于在寝室睡觉时想关风扇十分不方便,为了科学创新和锻炼自己的动手能力决定用手头的元器件将 风扇改为 ...

  2. 51单片机学习篇-- --红外通信(PPM脉时)笔记

    开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇 从学完帮网友写完<倒计时数字钟–矩阵按键可调>然后在CSDN上总结完之后,学习了剩下的模 ...

  3. 【物联网毕设基础】单片机:NEC 协议红外遥控器

    文章目录 NEC 协议红外遥控器 NEC 协议红外遥控器 家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概 ...

  4. SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)

    链接:https://pan.baidu.com/s/1g8jkENjO8v4eXq0bN0acEw?pwd=45c8  提取码:45c8 目录 一. 什么是SPI 1-1 SPI简介 1-2 SPI ...

  5. STM32F4驱动NEC协议的红外接收头

    红外遥控是一种无线.非接触式控制技术,具有抗干扰能力强.传输可靠.价格便宜.功耗低.易实现等优点.被很多的家用电器所采用.目前常用的红外遥控器协议有NEC协议(PWM脉冲宽度调制).Philips R ...

  6. 51单片机c语言485通讯案例,485通讯协议程序怎么写(51单片机的485通信程序案例)...

    RS-485总线接口是一种常用的串口,具有网络连接方便.抗干扰性能好.传输距离远等优点.RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达20 ...

  7. 红外遥控c语言,NEC协议红外遥控器

    家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概有几十种,常用的就有 ITT 协议.NEC 协议.Shar ...

  8. 51单片机学习笔记-15 红外遥控

    15 红外遥控 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓 ...

  9. 16.3 NEC协议红外遥控器

    家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概有几十种,常用的就有 ITT 协议.NEC 协议.Shar ...

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

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

最新文章

  1. python 遍历文件夹下面所有的文件
  2. Xamarin Essentials教程使用指南针Compass
  3. 兰州理工大学计算机考研真题,2017年兰州理工大学计算机与通信学院893计算机操作系统考研题库...
  4. phpcms v9 index.php,【转】phpcms v9中tags列表页url用拼音作为路径的方法
  5. Kettle使用_23 Excel表格输入ODS POI
  6. 【C#程序设计】教学讲义——第一章:C#语言概述
  7. xml可以html标签吗,自定义html标签(XML)
  8. Python 基础 - 4.3 random模块
  9. 关于std:auto_ptr
  10. 案例讲解asp.net中jquery post的用法
  11. python入门经典27版_【python】编程语言入门经典100例--27
  12. jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API
  13. Windows11升级绕过不支持该处理器
  14. iOS,QRCord(矩阵二维码)
  15. DL-31/6电流继电器
  16. java isbn_Java ISBN formating
  17. 判断已知顺序的三个点是顺时针还是逆时针
  18. 《Python编程从入门到实践》笔记吐血整理
  19. python json模块_python json模块使用详情
  20. 易基因技术推介|m1A RNA甲基化测序(MeRIP-seq/m1A-seq)

热门文章

  1. 干货流出|腾讯内部几近满分的项目管理课程PPT
  2. 科技文献检索与计算机应用,科技文献检索与计算机应用.doc
  3. logit回归怎么看显著性_spss logistic回归分析结果如何分析
  4. 使用 vue 开发一个简单的滑块拖动验证码
  5. jquery消息插件 toastr 消息提示插件 弹框提示
  6. Nvivo用法--数据可视化工具
  7. 马哥Linux学习笔记2-3Linux命令帮助的获取详解
  8. 自来水公司SCADA调度系统方案
  9. java实现录屏_javacv实现桌面端录屏
  10. 将微信表情包保存为图片