找回密码
 立即注册
查看: 1007|回复: 28

求助贴:红外接收不到信号

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 11:14:20 | 显示全部楼层 |阅读模式
我是用的江科协的代码,自己使用的是stc8h64u芯片,频率是35MHz,目前可以判断红外接收管正常工作,可以接收到红外信号。应该是单片机没有正确处理信号导致遥控不了。


我自己排查了一下,感觉是中断内部处理信号的代码的关系,请各位大佬帮忙看看。
  1. void Int0_Routine(void) interrupt 0
  2. {
  3.         if(IR_State==0)                                //状态0,空闲状态
  4.         {
  5.                 Timer0_SetCounter(0);        //定时计数器清0
  6.                 Timer0_Run(1);                        //定时器启动
  7.                 IR_State=1;                                //置状态为1
  8.         }
  9.         else if(IR_State==1)                //状态1,等待Start信号或Repeat信号
  10.         {
  11.                 IR_Time=Timer0_GetCounter();        //获取上一次中断到此次中断的时间
  12.                 Timer0_SetCounter(0);        //定时计数器清0
  13.                 //如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)
  14.                 if(IR_Time>39374-500 && IR_Time<39374+500)
  15.                 {
  16.                         IR_pData=0;
  17.                         IR_Data[0]=0;
  18.                         IR_Data[1]=0;
  19.                         IR_Data[2]=0;
  20.                         IR_Data[3]=0;
  21.                         IR_State=2;                        //置状态为2
  22.                 }
  23.                 //如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)
  24.                 else if(IR_Time>32812-500 && IR_Time<32812+500)
  25.                 {
  26.                         IR_RepeatFlag=1;        //置收到连发帧标志位为1
  27.                         //Timer0_Run(0);                //定时器停止
  28.                         IR_State=0;                        //置状态为0
  29.                 }
  30.                 else                                        //接收出错
  31.                 {
  32.                         IR_State=0;                        //置状态为1
  33.                 }
  34.         }
  35.         else if(IR_State==2)                //状态2,接收数据
  36.         {
  37.                
  38.                 IR_Time=Timer0_GetCounter();        //获取上一次中断到此次中断的时间
  39.                 Timer0_SetCounter(0);        //定时计数器清0
  40.                 //如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032,按倍数计算35        M)
  41.                 if(IR_Time>3267-500 && IR_Time<3267+500)
  42.                 {
  43.                         IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));        //数据对应位清0
  44.                         IR_pData++;                        //数据位置指针自增
  45.                 }
  46.                 //如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074,按倍数计算35        M)
  47.                 else if(IR_Time>6049-500 && IR_Time<6049+500)
  48.                 {
  49.                         IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));        //数据对应位置1
  50.                         IR_pData++;                        //数据位置指针自增
  51.                 }
  52.                 else                                        //接收出错
  53.                 {
  54.                         IR_pData=0;                        //数据位置指针清0
  55.                         IR_State=1;                        //置状态为1
  56.                 }
  57.                
  58.                 if(IR_pData>=31)                //如果接收到了32位数据
  59.                 {
  60.                         IR_pData=0;                        //数据位置指针清0
  61.                         if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))        //数据验证
  62.                         {
  63.                                 IR_Address=IR_Data[0];        //转存数据
  64.                                 IR_Command=IR_Data[2];
  65.                                 IR_DataFlag=1;        //置收到连发帧标志位为1
  66.                         }
  67.                         Timer0_Run(0);                //定时器停止
  68.                         IR_State=0;                        //置状态为0
  69.                 }
  70.         }
  71. }
复制代码

红外接收.zip

298.58 KB, 下载次数: 85

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 11:17:53 | 显示全部楼层
以下是我排查的一点步骤:
红外接收管接收到信号会输出低电平,即将单片机的io口置0
由此特性,先判断是否接收到低电平:
  1. while(1)
  2. {
  3. if(P32==0){led1=~led1;}
  4. }
复制代码

在main中添加语句,判断当p32口低电平时,led灯翻转提示。经测试可行,说明io口接收到了对应的低电平。
然后进入判断数据帧语句,如果接收到数据帧,使led翻转,经测试不行,说明此函数有问题。
  1. while(1)
  2. {
  3.         if(IR_GetDataFlag())        //如果收到数据帧
  4.                 {
  5.                         led1=~led1;}}
复制代码


然后前往此函数的定义:
  1. unsigned char IR_GetDataFlag(void)
  2. {
  3.         if(IR_DataFlag)
  4.         {
  5.                 IR_DataFlag=0;
  6.                 return 1;
  7.         }
  8.         return 0;
  9. }
复制代码

此函数是判断是否有信号进入,如IR_DataFlag=1则返回1
在中断函数中,只有当判断整个数据码完整时才会IR_DataFlag=1
根据中断函数内容,只有完整接收码后才IR_DataFlag=1,因此判断中断内容有误。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 11:18:33 | 显示全部楼层
目前就是找不到错误的问题,程序也是搬过来的,看了好几天了,不知道该怎么改了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-8-23 14:46:04 | 显示全部楼层
OO.这个问题刚好我碰到过,因为多了自动重装功能,所以和以前的定时器用法不一样!

Timer0_SetCounter(0);        //定时计数器清0

这个前面加上停止计数,清零后再重新启动,就可以解决了
截图202408231436099870.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 15:21:02 | 显示全部楼层
lez*** 发表于 2024-8-23 14:46
OO.这个问题刚好我碰到过,因为多了自动重装功能,所以和以前的定时器用法不一样!

Timer0_SetCounter(0); ...

感谢!请问有没有具体的代码啊,我觉得我还掌握不了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-8-23 15:32:02 | 显示全部楼层
wsz*** 发表于 2024-8-23 15:21
感谢!请问有没有具体的代码啊,我觉得我还掌握不了

现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 15:44:40 | 显示全部楼层
lez*** 发表于 2024-8-23 15:32
现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下 ...

好的好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 16:23:49 来自手机 | 显示全部楼层
lezjin 发表于 2024-8-23 15:32
现在电脑上没有,你在前面加上关闭定时器,清零后再启动,应该就可以了,你先试下 ...

还是只能接收到低电平,感觉连中断都没进,我在中断一开始就加了led管脚反转的语句,LED灯没亮
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-8-23 17:15:13 | 显示全部楼层
本帖最后由 lezjin 于 2024-8-23 17:18 编辑

你前面不是说接收正常,怎么又进不了中断了?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-23 17:23:03 | 显示全部楼层
lez*** 发表于 2024-8-23 17:15
你前面不是说接收正常,怎么又进不了中断了?

是接收管可以输出波形,但是单片机没有反应
我在中断函数不同位置加了led的判断语句,都不没反应
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:52 , Processed in 0.225829 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表