我在本论坛里面找了一个中断+定时器的遥控器解码程序,可以解得码值,但是,解码程序经常会失灵,不知道是不是与我使用的单片机有关,
当解码程序失灵时,单片机必须要重新上电复位才可用使用解码程序。
单片机是STC12C5A60S2
系统晶振是33mhZ
定时器是256us中断
程序如下:
unsigned char ir_count,count,irtab[4];
unsigned int data continue_ir;
long int data remote_value;
bit ir_flag,ir_9ms_flag;
void time0_init_remote() //扫描遥控器
{
TMOD |= 0X01; //T0:16位定时器HL全用
TH0 = 0xFD; //33MHz,time 256us ,time intterrupt
TL0 = 0x40;
ET0 = ET_TIME0_ON; //启动定时器0中断
TR0 = TR_TIME0_ON; //启动定时器0运行标志,在这里启动定时器0
}
void main()
{
time0_init_remote();
while(1)
{
if(BIT.BIT.IrOK == 1)
{
EX0=0;
执行代码......
EX0=1;
BIT.BIT.IrOK = 0;
}
}
}
/****************************************************************
功能:中断函数
描述:定时器0的中断服务程序
参数:无
返回:无
******************************************************************/
//-----------------------------------------
void Time0_Serv() interrupt 1
{
TH0 = 0xFD; //33MHz,time 256us ,time intterrupt
TL0 = 0x40;
if(ir_flag == 1)
{
count++;
}
if(ir_9ms_flag == 1)
{
continue_ir++;
}
if(continue_ir >= 453) //116ms/0.256ms=453.125
{
ir_9ms_flag = 0; //如果引导码后116ms都没有出现连续码,则无连续码,重新等待按键。
count = 0;
ir_flag = 0;
ir_count = 0;
continue_ir = 0;
}
}
void Extern_int0() interrupt 0 //下降沿触发:接收不到红外时OUT高电平,接收到红外时OUT低电平。
{
ir_flag = 1; //进入中断则标置置1,用于定时器中断中count计数。
if(ir_count == 0)
{
if(count>49 && count<56) // 13.5ms/0.256ms=52.73
{
ir_count++;
ir_9ms_flag = 1; //第一位引导码有效
count = 0; //从0开始计数。
return;
}
else if(count>39 && count<50 && ir_9ms_flag==1) //11.5ms/0.256ms=44.92
{
BIT.BIT.IR_Repeat = 1; //遥控信号连续码置位
continue_ir = 0; //清除超时标志
ir_flag = 0; //清除外部中断标志,禁止count计数。
count = 0; //计数count清零
EX0=0;
return;
}
else
{
count = 0;
ir_count = 0;
return;
}
}
if(count>2 && count<6) //1.125ms/0.256ms=4.39
{
remote_value &= 0x7fffffff; //保存0值到变量中
}
else if(count>6 && count<11) //2.25ms/0.256=8.789
{
remote_value |= 0x80000000; //保存1值到变量中
}
else
{
count = 0;
ir_flag = 0;
ir_9ms_flag = 0;
ir_count = 0;
continue_ir = 0;
}
remote_value >>= 1;
ir_count++;
if(ir_count >=32)
{
irtab[3] = (unsigned char)((remote_value&0xff000000) >> 24);
irtab[2] = (unsigned char)((remote_value&0x00ff0000) >> 16);
irtab[1] = (unsigned char)((remote_value&0x0000ff00) >> 8);
irtab[0] = (unsigned char)(remote_value&0x000000ff);
BIT.BIT.IrOK = 1; //接收完一帧,标志位置1
ir_flag=0;
ir_count=0;
count=0;
remote_value = 0;
}
count=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
单纯一个定时器状态机也不错,
PCA不用说,支持脉冲捕获,更方便,
但最主要最关键是看你怎么编程
一周热门 更多>