找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1639|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机红外IR程序中有个问题想不通,就是high_t 高电平保持的时间清0的时机

[复制链接]
跳转到指定楼层
楼主
ID:390267 发表于 2018-8-27 01:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     我的红外处理程序中有个问题想不通,存放IR_PIN的高电平时间的变量,清0的时机选择问题。具体请看下注释,
  1.             void IR_Recevie()                          {
  2.                 static uchar i,j,high_t;
  3.                 uint err_time;
  4.                 high_t=0;
  5.                 Delay8us(875);
  6.                 if(IR_Pin==LOW)
  7.                 {
  8.                         err_time=10;
  9.                         while((IR_Pin==LOW)&&(err_time>0))
  10.                         {
  11.                                 Delay8us(125);                //延时1ms
  12.                                 err_time--;        
  13.                         }
  14.                         if(IR_Pin==HIGH)
  15.                         {
  16.                                 err_time=6;
  17.                                 while((IR_Pin==HIGH)&&(err_time>0))
  18.                                 {
  19.                                         Delay8us(100);                //延时0.8ms
  20.                                         err_time--;
  21.                                 }                                                     for(i=0;i<4;i++)
  22.                                 {
  23.                                         for(j=0;j<8;j++)
  24.                                         {
  25.                                                 err_time=2;
  26.                                                 while((IR_Pin==LOW)&&(err_time>0))
  27.                                                 {
  28.                                                         Delay8us(40);                //延时0.32ms
  29.                                                         err_time--;
  30.                                                 }
  31.                                                 err_time=100;
  32.                                                 while((IR_Pin==HIGH)&&(err_time>0))
  33.                                                 {
  34.                                                         Delay8us(20);                //延时0.16ms
  35.                                                         err_time--;
  36.                                                         high_t++;
  37.                                                         if(high_t>20)  
  38.                                                                 return;
  39.                                                 }
  40.                                                 ir_code[i]=ir_code[i]>>1;
  41.                                                 if(high_t>=6)
  42.                                                 {
  43.                                                         ir_code[i]|=0x80;   [b] //   当high_t 如果在这里面清0,[/b][b]遥控就接受不到正确的值[/b]
  44.                                                 }
  45.                                                high_t=0;
  46.                                         }
  47.                                 }
  48.                         }
  49.                         if(ir_code[2]!=~ir_code[3])
  50.                         return;
  51.                     }
  52.            }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-8-27 01:44 | 只看该作者
您这个问题给的信息不全,估计是没人能回答得了的,先转移到冷门区了,自行编辑补充一下吧,审核员会帮你重新转到热门问答区的
回复

使用道具 举报

板凳
ID:390267 发表于 2018-8-27 01:55 | 只看该作者
admin 发表于 2018-8-27 01:44
您这个问题给的信息不全,估计是没人能回答得了的,先转移到冷门区了,自行编辑补充一下吧,审核员会帮你重 ...

谢谢回复,刚发帖时误按了TAB键。
回复

使用道具 举报

地板
ID:382067 发表于 2018-8-27 07:41 | 只看该作者
                                                while((IR_Pin==HIGH)&&(err_time>0))
                                                {
                                                        Delay8us(20);                //延时0.16ms
                                                        err_time--;
                                                        high_t++;
                                                        if(high_t>20)  
                                                                return;
                                                }
                                                ir_code[ i]=ir_code[ i]>>1;
                                                if(high_t>=6)
                                                {
                                                        ir_code[ i]|=0x80;    //   当high_t 如果在这里面清0,遥控就接受不到正确的值
                                                }
                                               high_t=0;

这段代码主要是对接收0和1的区分,high_t时间稍长的是1,所以他设定了一个区间, if(high_t>=6)时,才确定判断接收到1(隐含条件小于20),但是这个计数high_t在接收完一个bit后要清零,进行下一位的判断

评分

参与人数 1黑币 +70 收起 理由
admin + 70 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:390267 发表于 2018-8-27 17:03 来自手机 | 只看该作者
yang阳 发表于 2018-8-27 07:41
while((IR_Pin==HIGH)&&(err_time>0))
                ...

了解了,我今天想到了,提取到0也是要清零的,之前一直纠结在提取1后清零,谢谢指导!
回复

使用道具 举报

6#
ID:382067 发表于 2018-8-27 21:00 | 只看该作者
祥祥俱乐部 发表于 2018-8-27 17:03
了解了,我今天想到了,提取到0也是要清零的,之前一直纠结在提取1后清零,谢谢指导!

没事 很高兴能帮助到你
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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