各位,请帮忙分析一下以程序,解码总是不对,不知为何
//========================================================
//********************************************************
//========================================================
#include <SN8P2501B.h> // 头文件
#include "global.h" //
//========================================================
//********************************************************
//**** BIT变量定义 ***************************************
sfr Flag0 =0x2f;
sbit IR_ST_Code_bz =Flag0:0; //1101
sbit IR_NO_Code_bz =Flag0:1; //没有代码一直保持高电平
sbit IR_2B_Code_bz =Flag0:2; //两次帧码档志
uchar IR_Cnt =0;
uchar IR_12Code =0; //位码计数器
uchar IR_Code =0; //新代码
uchar IR_Code1 =0; //旧代码
uchar IR_H_Cnt =0; //高电平计数器
uchar IR_L_Cnt =0; //低电平计数器
//***** <IR > ********************************************
sbit IR_Prot =0xd0:0; // 红外接收口
sbit LED1 =0xd2:5; // P2.5
sbit LED2 =0xd2:4; // P2.4
sbit LED3 =0xd2:3; // P2.3
//********************************************************
//函数声明
//********************************************************
//void Sys_Init(void); // 系统初始化
//void TimeDeal(void); // 时间处理
//void KeyeDeal(void); // 按键处理
//void KeyeScan(void); // 按键扫描
//void KeyPress(void); // 按键保护
//void DispDeal(void); // 显示处理
//void DispAll_Off(void) // 显示关闭
//void DispAll_On(void); // 显示全显
//void Display_A( uchar SMG_Data); // 共阳显示
//void LoadDeal(void); // 负载处理
//void KeyPress(void);
//********************************************************
//系统初始化
//********************************************************
void Sys_Init(void) //
{ //--- Fcpu Config ------------------------------------
Clr_WDT(); // 清看门狗
OSCM = 0x00; // 普通模式(双时钟)
INTEN= 0x00; //
INTRQ= 0x00; //
P1OC = 0x00; // 0禁止漏极输出
//--- I0 Config --------------------------------------
P0UR = 0x00; // 0=不上拉 1=上拉
P1UR = 0x00; //
P2UR = 0x00; //
P5UR = 0x00; //
P0M = 0x00; // 0=输入 1=输出
P1M = 0xFF; //
P2M = 0xFF; //
P5M = 0xFF; //
P0 = 0x01; // 0=低电平 1=高电平
P1 = 0xFF; //
P2 = 0x00;
P5 = 0xFF; //
//--- TC0 Config--------------------------------------
TC0M = 0x64; // 16MHz/4= Fcpu/4/125
TC0R = 131; //
TC0C = 131; //
FTC0IEN=1; // Enable TC0 Interrput
FTC0ENB=1; // 定时器开启
//--- Int0 Config-------------------------------------
//PEDGE =0x10; // 下降沿触发
//FP00IRQ=0; //
//FP00IEN=1; // 允许Int0
//----Start Run---------------------------------------
FGIE = 1; // Enable all Interrput
//----------------------------------------------------
}
void DelayUs(ulong k)
{
while(k--);
}
//********************************************************
//时间处理
//********************************************************
void TimeDeal(void) //
{
}
//********************************************************
//红外5104解码处理()
//********************************************************
void IRM_Deal(void)
{
if(Key_bz )
{ Key_bz=0;
if(KeyVal==0x81)
{
if(IR_bz)LED1=0,IR_bz=0;
else LED1=1,IR_bz=1;
}
}
}
//********************************************************
//主程序
//********************************************************
void main(void) // 主程序
{
Sys_Init(); // 系统初始化
while(1) // 主循环程序
{ Clr_WDT(); // 看门狗
} //
} //
//********************************************************
//中断处理
//********************************************************
void __interrupt[0x8] ISR(void) // 125us
{
if(FTC0IRQ) // TC0 interrput
{ FTC0IRQ=0; // Clr flag
T_2msCnt++;
//IR--------------------------------------------
if(IR_Prot) //
{ if(IR_L_Cnt==0)IR_NO_Code_bz=1; // 一直为高电平
else
{ if(IR_L_Cnt>=8) // 判断遥控码是高还是低125*8=1ms
{ if(IR_Code>0) //
{ IR_Code<<=1; //
IR_Code++; // 大于1ms为1,小于为0
}else IR_Code=1; //
}else IR_Code<<=1; // 0
//IR_L_Cnt=0;
//---------------------------------------
if(IR_ST_Code_bz) // 已经有启始码标志
{ IR_H_Cnt=0;
IR_L_Cnt=0; //
IR_12Code++;
if(IR_12Code==8)
{
if(IR_Code==IR_Code1)
{
if(IR_2B_Code_bz==0)
{ KeyVal=IR_Code;
IR_2B_Code_bz=1;
Key_bz=1;
}
}
else //还没收到2帧相同的码
{ IR_Code1=IR_Code;
IR_H_Cnt=0;
}
}
}
else //没有收到启始码
{ IR_L_Cnt=0; //
IR_Code &=0x0F; //
if(IR_Code==0x0D) // 是否等于启始码1101
{ IR_ST_Code_bz=1; // 是
IR_12Code=0; //
IR_Code=0; //
IR_H_Cnt=0; //
}
else IR_NO_Code_bz=1; // 没码
}
}
//------------------------------------------
if(IR_NO_Code_bz) //
{ IR_NO_Code_bz=0; //
IR_L_Cnt=0; //
IR_H_Cnt++; //
if(IR_H_Cnt>=127) // 如果大于16ms
{ IR_2B_Code_bz=0; // 2次帧码标志清0
IR_Code1=0; // 旧代码清0
IR_H_Cnt=0; // 高电平计数清0
}
else if(IR_H_Cnt>=31) // 如果大于4ms,启始码错误
{ IR_Code=0; //
IR_ST_Code_bz=0; //
}
}
}else IR_L_Cnt++; // 低电平计数
} //
} //
//********************************************************
// ---------end------------------------------------------
//******************************************************** |