標題:
關(guān)于nec紅外的單片機解碼程序
[打印本頁]
作者:
不死鳥a
時間:
2025-5-10 17:49
標題:
關(guān)于nec紅外的單片機解碼程序
#include "ray_decode.h"
sbit led2 = P1^0;
sbit led = P1^1;
sbit IR_INPUT = P3^3; //紅外接收引腳
bit irflag = 0; //紅外接收標志,收到一幀正確數(shù)據(jù)后置1
unsigned char IR_bit_Time = 0;
unsigned char ircode[4]; //紅外代碼接收緩沖區(qū)
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計數(shù)
ET1 = 1;
IT1 = 1; //設置INT1為負邊沿觸發(fā)
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) //如果計數(shù)值不在這個范圍內(nèi),說明數(shù)據(jù)錯誤退出
{
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中斷服務函數(shù),執(zhí)行紅外接收及解碼 */
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;
}
}
復制代碼
每次下降沿進入中斷,然后啟動定時器開始計數(shù),,但是解碼得出的結(jié)果總是不對,找了兩天問題了還是找不出,希望大佬們幫幫忙
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1