基于51单片机的红外遥控LED实验

控制/MCU

1878人已加入

描述

一、实验原理

本次介绍一下红外遥控的使用方法,使用的红外接收头是HX1838,接收头和遥控器是遵循NEC编码协议的,感兴趣的同学可以去搜索一下,深入了解,下面附上图片,想学习的可以直接去购买。

红外遥控器在发送数据时也会同时发送出一个频率为38KHz的电磁波,作为载波;顾名思义,“载波”就是运载数据的,避免数据在传播过程中出现问题,外部干扰的信号太多了,所以用一个合适的频率电磁波和数据脉冲调制在一起,一起发送出去,避免外部干扰,接收头接收到脉冲后再进行解调操作,把38KHz的电磁波“过滤”掉,因为这款红外接收头内部有解调电路,所以咱们在使用时就不用再进行解调操作了,直接取出数据就可以了。

我们学习任何一个外设,都要先了解这些外设和我们的单片机是如何进行通信的,通信协议使用的是哪一种,常见的就是IIC、SPI、CAN总线、单总线等等,还有一些要根据时序图自己用IO口模拟时序进行通信,本质上都是需要模拟这些时序,用来接收和发送数据,只不过是有些单片机型号把这些功能直接集成在了单片机内部,这样使用起来比较方便,直接操作寄存器调用就好了。

外部中断

上图是起始信号、发送“0”、发送“1”以及连发信号的时序图

外部中断

P3^2引脚对应STC89C52RC单片机的外部中断引脚

一帧数据是从起始信号开始的,单片机的IO口需要一直检测起始信号是否到了,检测到起始信号后开始接收发送过来的数据信号,所以,为了能够第一时间接收到起始信号,防止数据出错,红外接收模块的数据引脚要和单片机的外部中断引脚连接在一起;数据构成是:起始信号+接收到的数据,数据=地址码+地址反码+命令码+命令反码,地址码和命令码都是8位,所以一个完整的数据有32位。于是,我们接收数据时,要把第三位数据(命令码)取出来进行判断。

命令码:咱们在购买遥控器和红外接收头时可以让卖家提供,得到命令码后,在函数中宏定义一下就可以直接使用了,初始化完成基本的函数后,在主函数中,运用if判断语句或者switch case语句,判断对应的命令码使其完成你想要的效果。

二、关键代码

void Int0_Init(void)//初始化外部中断
{
  IT0=1;
  IE0=0;
  EX0=1;
  EA=1;
  PX0=1;
}

外部中断0初始化,在外部中断函数中检测起始信号。

void main()
{
  IR_Init();  //红外遥控初始化
  while(1)
  {
    if(IR_GetDataFlag() || IR_GetRepeatFlag())  //如果收到数据帧或连发帧
    {
      Command=IR_GetCommand();    //获取遥控命令码


      if(Command==IR_0)
       {
         led=0;
       }
       if(Command==IR_POWER)
       {
         led=1;
       }
    }
  }
}

主函数:运用if判断句,当所按下的按键返回回来的命令码是正确的时,咱们让LED点亮或者熄灭。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分