求助贴:红外接收不到信号
我是用的江科协的代码,自己使用的是stc8h64u芯片,频率是35MHz,目前可以判断红外接收管正常工作,可以接收到红外信号。应该是单片机没有正确处理信号导致遥控不了。我自己排查了一下,感觉是中断内部处理信号的代码的关系,请各位大佬帮忙看看。
void Int0_Routine(void) interrupt 0
{
if(IR_State==0) //状态0,空闲状态
{
Timer0_SetCounter(0); //定时计数器清0
Timer0_Run(1); //定时器启动
IR_State=1; //置状态为1
}
else if(IR_State==1) //状态1,等待Start信号或Repeat信号
{
IR_Time=Timer0_GetCounter(); //获取上一次中断到此次中断的时间
Timer0_SetCounter(0); //定时计数器清0
//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)
if(IR_Time>39374-500 && IR_Time<39374+500)
{
IR_pData=0;
IR_Data=0;
IR_Data=0;
IR_Data=0;
IR_Data=0;
IR_State=2; //置状态为2
}
//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)
else if(IR_Time>32812-500 && IR_Time<32812+500)
{
IR_RepeatFlag=1; //置收到连发帧标志位为1
//Timer0_Run(0); //定时器停止
IR_State=0; //置状态为0
}
else //接收出错
{
IR_State=0; //置状态为1
}
}
else if(IR_State==2) //状态2,接收数据
{
IR_Time=Timer0_GetCounter(); //获取上一次中断到此次中断的时间
Timer0_SetCounter(0); //定时计数器清0
//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032,按倍数计算35 M)
if(IR_Time>3267-500 && IR_Time<3267+500)
{
IR_Data&=~(0x01<<(IR_pData%8)); //数据对应位清0
IR_pData++; //数据位置指针自增
}
//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074,按倍数计算35 M)
else if(IR_Time>6049-500 && IR_Time<6049+500)
{
IR_Data|=(0x01<<(IR_pData%8)); //数据对应位置1
IR_pData++; //数据位置指针自增
}
else //接收出错
{
IR_pData=0; //数据位置指针清0
IR_State=1; //置状态为1
}
if(IR_pData>=31) //如果接收到了32位数据
{
IR_pData=0; //数据位置指针清0
if((IR_Data==~IR_Data) && (IR_Data==~IR_Data)) //数据验证
{
IR_Address=IR_Data; //转存数据
IR_Command=IR_Data;
IR_DataFlag=1; //置收到连发帧标志位为1
}
Timer0_Run(0); //定时器停止
IR_State=0; //置状态为0
}
}
}
以下是我排查的一点步骤:
红外接收管接收到信号会输出低电平,即将单片机的io口置0
由此特性,先判断是否接收到低电平:
while(1)
{
if(P32==0){led1=~led1;}
}
在main中添加语句,判断当p32口低电平时,led灯翻转提示。经测试可行,说明io口接收到了对应的低电平。
然后进入判断数据帧语句,如果接收到数据帧,使led翻转,经测试不行,说明此函数有问题。
while(1)
{
if(IR_GetDataFlag()) //如果收到数据帧
{
led1=~led1;}}
然后前往此函数的定义:
unsigned char IR_GetDataFlag(void)
{
if(IR_DataFlag)
{
IR_DataFlag=0;
return 1;
}
return 0;
}
此函数是判断是否有信号进入,如IR_DataFlag=1则返回1
在中断函数中,只有当判断整个数据码完整时才会IR_DataFlag=1
根据中断函数内容,只有完整接收码后才IR_DataFlag=1,因此判断中断内容有误。
目前就是找不到错误的问题,程序也是搬过来的,看了好几天了,不知道该怎么改了 OO.这个问题刚好我碰到过,因为多了自动重装功能,所以和以前的定时器用法不一样!
Timer0_SetCounter(0); //定时计数器清0
这个前面加上停止计数,清零后再重新启动,就可以解决了 lezjin 发表于 2024-8-23 14:46
OO.这个问题刚好我碰到过,因为多了自动重装功能,所以和以前的定时器用法不一样!
Timer0_SetCounter(0); ...
感谢!请问有没有具体的代码啊,我觉得我还掌握不了{:4_167:} wszjw2 发表于 2024-8-23 15:21
感谢!请问有没有具体的代码啊,我觉得我还掌握不了
现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下 lezjin 发表于 2024-8-23 15:32
现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下 ...
好的好的 lezjin 发表于 2024-8-23 15:32
现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下 ...
还是只能接收到低电平,感觉连中断都没进,我在中断一开始就加了led管脚反转的语句,LED灯没亮 本帖最后由 lezjin 于 2024-8-23 17:18 编辑
你前面不是说接收正常,怎么又进不了中断了?{:shocked:} lezjin 发表于 2024-8-23 17:15
你前面不是说接收正常,怎么又进不了中断了?
是接收管可以输出波形,但是单片机没有反应{:4_187:}
我在中断函数不同位置加了led的判断语句,都不没反应{:4_167:}