51 单片机红外遥控 计算NEC时序采用 外部中断下降沿触发的方式。两次下降沿的时间不满足NEC的时序要求。定时器 和外部中断的寄存器配置都没什么问题。
#include
#include "Timer0.h"
#include "INT0.h"
#include "LCD1602.h"
unsigned int IR_Time=0;
unsigned char IR_State=0;
unsigned char IR_Data[4];
unsigned char IR_pData;
unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;
void IR_Init(void)
{
LCD_Init();
Timer0_Init();
INT0_Init();
}
void Int0_Routine(void) interrupt 0
{
if(IR_State==0)
{
Timer0_SetCounter(0);
Timer0_Run(1);
IR_State=1;
}
else if(IR_State==1)
{
IR_Time=Timer0_GetCounter();
LCD_ShowNum(1,1,IR_Time,6);
Timer0_SetCounter(0);
if(IR_Time>13500-800 && IR_Time<13500-800)
{
P2=0;
IR_State=2;
}
else if(IR_Time>11250-800 && IR_Time<11250-800)
{
IR_RepeatFlag=1;
Timer0_Run(0);
IR_State=0;
}
else
{
IR_State=0;
}
}
}
#include
void INT0_Init(void)
{
IT0=1;
IE0=0;
EX0=1;
EA=1;
PX0=1;
}
/*外部中断0中断函数模板
void Int0_Routine(void) interrupt 0
{
}
*/
#include
void Timer0_Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0; //设置定时初值
TH0 = 0; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0不计时
}
void Timer0_SetCounter(unsigned int Value)
{
TH0=Value/256;
TL0=Value%256;
}
unsigned int Timer0_GetCounter(void)
{
return (TH0<<8)|TL0;
}
void Timer0_Run(unsigned char Flag)
{
TR0=Flag;
}
使用外部高速时钟32.768Khz,一定要保证时序准确。