找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 933|回复: 6
收起左侧

请教一下51单片机关于接收红外信号的程序的问题

[复制链接]
ID:978416 发表于 2022-11-9 12:29 | 显示全部楼层 |阅读模式
void ReadIr() interrupt 0
{
        uchar j,k;
        uint err;
        time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/        
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
                {                        
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                                
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        time=0;                //用完时间要重新赋值                                                        
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                        
}

在这段程序中
while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }


这一段是什么意思;
return返回是返回到while这还是直接返回到引用void ReadIr() interrupt 0的地方
回复

使用道具 举报

ID:86926 发表于 2022-11-9 14:27 | 显示全部楼层
返回到调用中断函数的地方;就是结束退出这个函数;
回复

使用道具 举报

ID:77589 发表于 2022-11-9 16:55 | 显示全部楼层
在560us低电平之后,如果出现560us高电平表示接收0,如果出现1680us高电平表示接收1。
这段代码就是在判断560us低电平之后,出现高电平的宽度。
while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
{
      delay(10);         // 0.1ms
       time++;          // 在高电平持续期间,每0.1ms增加1
       err--;              // 错误计数减1,防止由于出现错误,输入引脚一直为高时,进入死循环
       if(time>30)      // 如果输入引脚电平持续了3ms,远超过了1.68ms(误差范围已经放的很宽了)表示,接收出现错误,必须立即返回
       {
                return;     // 接收出现错误,必须立即返回(后续电平信号已经没有意义)
       }
}
IrValue[k] >>= 1;         // 往低移动一位,便于在高位保存接收到的bit数据
if(time>=8)                 // 如果高电平出现大于565us,那么是1
{
       IrValue[k]|=0x80;  // 把1保存到最高位
}
// 如果接收到的为0,不需要单独再保存到最高位,因为在向低移动一位时,就自动在最高位补了0
time=0;                       // 用完时间要重新赋值 0,便于解析下一bit
回复

使用道具 举报

ID:123289 发表于 2022-11-10 09:43 | 显示全部楼层
关键是掌握解码的原理。板凳解释的很到位!赞一下。
这个程序是不适用的,原因是当它与LED扫描显示一起用时,红外一输入,LED显示就异常了。
自己可以改改,用中断判断脉冲宽度,不用DELAY,DELAY影响LED扫描显示。
回复

使用道具 举报

ID:978416 发表于 2022-11-10 13:48 | 显示全部楼层
Longan.Wang 发表于 2022-11-9 16:55
在560us低电平之后,如果出现560us高电平表示接收0,如果出现1680us高电平表示接收1。
这段代码就是在判断 ...

明白了,非常感谢,每一步都很详细,谢谢。
回复

使用道具 举报

ID:978416 发表于 2022-11-10 13:49 | 显示全部楼层
yzwzfyz 发表于 2022-11-10 09:43
关键是掌握解码的原理。板凳解释的很到位!赞一下。
这个程序是不适用的,原因是当它与LED扫描显示一起用 ...

谢谢,感谢您的意见,后续完成了我试着改一下
回复

使用道具 举报

ID:978416 发表于 2022-11-10 13:50 | 显示全部楼层
蓝魄 发表于 2022-11-9 14:27
返回到调用中断函数的地方;就是结束退出这个函数;

好的,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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