51单片机解码NEC协议红外遥控器,串口助手显示键值码

在这里插入图片描述
#include <reg52.h>
#include <intrins.h>//这个为啥可以省略我也不知道,后面有用到 右移所以保守不省略。去掉也是可以完成此功能

unsigned char IR_Time;//33位数据脉宽时间用计时器0中断个数表示 ,进入一次中断需要1.085*256=277.76us

unsigned char IR_Date[33];//红外接收头发给单片机解码的33位数据(引导码1+用户码16+按键键值码8+键值码反码8)

unsigned char IR_Byte[4]; //去掉引导码剩余的32位,即4字节数据
bit StartFlag; //位0或者为1的脉宽时间做标记

bit IR_DateOK; //32位数据的脉宽时间接收成功标记

bit IR_DecodeOK;//去掉引导码剩余的32位脉宽时间的数据已经解码为32位二进制成功标志

void init()//以下都叫定时器,也可以叫计数器,是一样的
{EA=1; //开总中断
ET0=1;// 开定时器0中断
TMOD|=0x02;// 设置定时器0工作模式2,8位自动重装
TH0=TL0=0;// //初始化定时器0寄存器,定时器0溢出一次时间为256个机器周期
TR0=1;// 启动定时器0

EX0=1;// 开外部中断0
IT0=1; //外部中断0设置下降沿触发

TMOD|=0x20;//设置定时器1工作模式2,8位自动重装
TH1=0xfd;// 设置波特率为9600
TL1=0xfd; // 设置波特率为9600
TR1=1; // 开启定时器1
SM1=1;//设置串口工作模式1,10位异步收发,为啥增加SM0=1;我也不知道。
}

void time0( )interrupt 1 //定时器0中断,每中断一次需要256*1.085us = 277.76us
{IR_Time++;//记录数据脉宽时间,以便解码
}

void int0( )interrupt 0
{static unsigned char i; //静态变量用于存入33次数据计数

if(StartFlag)
{/判断引导码,如果是引导码则从起始码开始存/
if((IR_Time>=32)&&(IR_Time<53)) i=0;
IR_Date[i]=IR_Time;//以定时器0溢出的次数来计算脉宽把这个时间存放在数组中
IR_Time=0;//计数清零
i++;
if(i==33)//易错误点写成32,i等于33那么就表示已经存入了33次脉宽
{i=0; //把脉宽计数清零准备下次存入
IR_DateOK=1; //脉宽检查完成
StartFlag=0; //易漏写 ,
}
}
else
{StartFlag=1; // 开始处理标志位置1
IR_Time=0; //定时器0计数清零
}
}

void IR_Decode()//把提取的33次脉宽进行解码 NEC协议
{unsigned char i,j,k=1; //i是用于计数处理4个字节,j用于计数处理1个字节的8位数据,k用于计数处理33次脉宽,为1是去掉引导码
for(i=0;i<4;i++)
{for(j=0;j<8;j++)
{if(IR_Date[k]>5) IR_Byte[i]|=0x80; //如果脉宽大于数据0标准的1125us那么就判定为数据1,写1
if(j<7) IR_Byte[i]>>=1; //只能右移7次,如果右移8次则会把第一位数据移出去
k++;
}
}
if(k==33)
IR_DecodeOK=1; //解码完成

}

void main()
{ unsigned char i; //计数串口发送字节数
init(); //初始化
while(1)
{ if(IR_DateOK)//判断33次脉宽是否提取完成
{ IR_DateOK=0;//易漏写,
IR_Decode(); //根据脉宽解码出4个字节的数据
if(IR_DecodeOK) //判断解码是否完成
{ IR_DecodeOK=0;//清零解码标志位
for(i=0;i<4;i++) //串口发送4个字节数据
{ SBUF=IR_Byte[i]; //往串口发送数据
while(!TI); //等待发送完成标志
TI=0; //清零发送完成标志位
}

    }

  }

}

}
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值