标题:
关于nec红外的单片机解码程序
[打印本页]
作者:
不死鸟a
时间:
2025-5-10 17:49
标题:
关于nec红外的单片机解码程序
#include "ray_decode.h"
sbit led2 = P1^0;
sbit led = P1^1;
sbit IR_INPUT = P3^3; //红外接收引脚
bit irflag = 0; //红外接收标志,收到一帧正确数据后置1
unsigned char IR_bit_Time = 0;
unsigned char ircode[4]; //红外代码接收缓冲区
unsigned char xdata Ray_bit_timer_Buffer[33];
/* 初始化红外接收功能 */
void InitInfrared()
{
IR_INPUT = 1; //确保红外接收引脚被释放
TMOD &= 0x0F; //清零T1的控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 0xA4;
TL1 = 0xa4;
TR1 = 0; //停止T1计数
ET1 = 1;
IT1 = 1; //设置INT1为负边沿触发
EX1 = 1; //使能INT1中断
}
//低电平560+2= 1120us 高电平 560+560x3 = 2240us
void IR_Decode()
{
unsigned char value = 0;
unsigned char i,j,k = 1;
if(irflag)
{
irflag = 0;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
value >>= 1;
if(Ray_bit_timer_Buffer[k] <19 || Ray_bit_timer_Buffer[k]>26) //如果计数值不在这个范围内,说明数据错误退出
{
return;
}
else
{
value |= 0x80;
}
if(Ray_bit_timer_Buffer[k]<9 || Ray_bit_timer_Buffer[k]>14)
{
return;
}
else
{
value &= 0x7f;
}
k++;
}
//LedShow(Ray_bit_timer_Buffer[2]);
ircode[i] = value;
}
}
}
//100us进入一次
void Timer1_ISR() interrupt 3
{
led = ~led;
IR_bit_Time++;
}
/* INT1中断服务函数,执行红外接收及解码 */
void EXINT1_ISR() interrupt 2
{
static unsigned char i = 1;
static unsigned char IR_start = 0;
led2 = ~led2;
TR1 = 1;
if(IR_start == 0)
{
Ray_bit_timer_Buffer[0] = IR_bit_Time;
if(Ray_bit_timer_Buffer[0]<130 || Ray_bit_timer_Buffer[0]>140)
{
//TR1 = 0;
IR_bit_Time = 0;
return;
}
IR_bit_Time = 0;
IR_start = 1;
}
Ray_bit_timer_Buffer[i] = IR_bit_Time;
LedShow(IR_bit_Time);
IR_bit_Time = 0;
if(++i >= 33)
{
i=1;
irflag = 1; //接收完毕后设置标志
TR1 = 0;
IR_start = 0;
}
}
复制代码
每次下降沿进入中断,然后启动定时器开始计数,,但是解码得出的结果总是不对,找了两天问题了还是找不出,希望大佬们帮帮忙
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1