红外NEC协议
一、NEC简介
红外(Infrared,IR)遥控是一种无线、非接触控制技术,常用于遥控器、无线键盘、鼠标等设备之间的通信。IR协议的工作原理是,发送方通过红外线发送一个特定的编码,接收方通过识别该编码来执行相应的操作。
IR协议是指红外线通信协议的总称,而NEC协议是IR协议中的一种具体实现。红外遥控系统分为发射和接收两部分,发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光;接收电路的红外接收管是一种光敏二极管。
二、NEC传输格式
NEC协议采用PPM(Pulse Position Modulation,脉冲位置调制)的形式进行编码,数据的每一位(Bit)脉冲长度为560us,由38KHz的载波脉冲 (carrier burst) 进行调制,推荐的载波占空比为 1/3至 1/4。有载波脉冲的地方,其宽度都为 560us,而载波脉冲的间隔时间是不同的。
逻辑“1”的载波脉冲+载波脉冲间隔时间为2.25ms;逻辑“0”的载波脉冲+载波脉冲间隔时间为逻辑“1”的一半,即1.125ms.
每次信息都是按照引导码 (9ms载波脉冲+4.5ms 空闲信号)地址码、地址反码、控制码和控制反码的格式进行传输,因此,单次信息传输的时间是固定不变的。
当红外遥控器上的按键被一直按下时,红外遥控器只会发送一次完整的信息,其后会每隔 110ms 发送一次重复码(连发码)。重复码的数据格式比较简单,同样是由 9ms的载波脉冲开始,紧接着是2.25ms的空闲信号,随后是560us的载波脉冲。
红外接收头通常被厂家集成在一个元件中,成为一体化红外接收头。红外接收头内部的三极管电路具有信号反向的功能,也就是将1变为0,0变为1,即数据0是0.56ms的低电平和0.56ms的高电平,数据1是0.5ms的低电平和1.69ms的高电平,9ms是高电平变为低电平。
红外发送接收器件介绍
红外发光管
红外发光管:
红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或者浅蓝色或者黑色树脂封装。
红外接收管
红外接收管:
下图为一常用的红外接收模块。内部包含有高频的滤波电路,专门用来滤除红外线合成信号的载波信号(38KHZ),并送出接收到的信号。当红外线合成信号进入到红外接收模块,在其输出端便可以得到原先发射器发出的数字编码,便可以通过MCU程序解码出相应的键码。
应用电路
红外协议
发送信号波形图:
接收信号波形图:
从示波器上看到红外接收管采集到的波形的波形,可以看出采集的·信号与发出的信号反向
红外信号特点
1.地址码与地址反码,以及命令码与命令反码,具有数据校验作用,增强结果的准确性
2.脉冲距离调制,调制占空比
3.载波频率38KHZ
4.逻辑位时间为逻辑0:1.125ms或逻辑1:2.25ms
5.发送的信号与接收到的信号是反向的
代码编写
引脚定义代码
省略
每个单片机的代码都有所区别,这里不写了
获取低电平时间函数
- 运行一下代码需要另外设置定时器1的分频和系统时钟
- 本代码定时器的计数周期为256ms,频率为1/256
- 即定时器产生溢出一次的时间为256ms
void low_time()
{
W_TEMP=0;//计数
T1CNT=255; //T1CNT初始值
while((!NEC)&&W_TEMP<3);//NEC为宏定义,为单片机采集红外信号的引脚
{
if(T1IF)//T1IF为定时器中断溢出标志
{
T1IF=0;//清除标志位
W_TEMP++;//计数加一
}
}
}
高电平时间
该代码与上面代码基本一致
void high_time()
{
W_TEMP=0;
T1CNT=255;
while(NEC&& W_TEMP<8)
{
if(T1IF)
{
T1IF=0;
W_TEMP++;
}
}
}
NEC信号读取
void NEC_rec()
{
if(!NEC)
{
delayms(8);//可以自己用for循环代替只需要延迟这么多时间即可
if(!NEC)
{
delayms(5);//可以自己用for循环代替只需要延迟这么多时间即可
if(NEC)
{
high_time();
for(char i=0;i<4;i++)//读取4个字节的数据
{
STA_TEMP=0;//临时变量
for(char j=0;j<8;j++)
{
low_time();//等待低电平
high_time();
/*获取高电平时间,判断是0还是1主要看高电平持续的时间,低电平时间是一样的*/
if(W_TEMP<5)
/*实际上高电平的话STA_TEMP的值为6,因为一次时间为256ms根据自己定时器时间自行调整W_TEMP值*/
{
STA_TEMP<<=1;//data>>=1;
}
else if(W_TEMP>4)//高电平持续时间长
{
STA_TEMP<<=1;//data>>=1;
STA_TEMP|=0x01; //0000 0001
}
}
if(!i)//0和1的值为相反数,可以检测读取的数值是否正确
{
NEC_CODE1=STA_TEMP;
T1DATA=NEC_CODE1;
}
else if(i==1)
{
//写判断读取正确错误代码
}
else if(i==2)
{
NEC_CODE2=STA_TEMP;
T1DATA=NEC_CODE2;
}
else if(i==3)
{
//写判断读取正确错误代码
}
}
}
}
}
}
标签:脉冲,RISC,NEC,红外,实操,ms,载波,接收
From: https://blog.csdn.net/2401_85236922/article/details/141429114