控制/MCU
一、实验原理
本次介绍一下红外遥控的使用方法,使用的红外接收头是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点亮或者熄灭。
全部0条评论
快来发表一下你的评论吧 !