[其它应用]

红外遥控程序

[复制链接]
691|15
手机看帖
扫描二维码
随时随地手机跟帖
dingy|  楼主 | 2022-6-18 21:50 | 显示全部楼层 |阅读模式
求教sh79f084 红外遥控程序,软件延时问题。sh79f084我用内部16.6M的RC震荡器做系统晶振,NEC的遥控器,软件延时好像有问题

使用特权

评论回复
renyaq| | 2022-6-18 21:52 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
dingy|  楼主 | 2022-6-18 21:58 | 显示全部楼层

sbit IRIN = P3^0;                           //红外接收器位声明        //p3.0--红外串口接收


unsigned char DisplayData[8];               //用来存放要显示的8位数的值
unsigned char IrValue[6];                   //用来存放读取到的红外值
unsigned char Time;


void IrInit();
void DelayMs(unsigned int);
void Delay1ms()        ;

void Delay1ms()                //@16.6MHz
{
        unsigned char i, j;

        i = 17;
        j = 34;
        do
        {
                while (--j);
        } while (--i);
}

void DelayMs(unsigned int x)                 //
{
    unsigned char i;
    while(x--)
    {
        //for (i = 0; i<13; i++);
                Delay1ms();
    }
}


void IrInit()
{
    IT0=1;                                   //下降沿触发
    EX0=1;                                   //打开中断0允许
    IE0=0;                                    
        EA=1;                                    //打开总中断
    IRIN=1;                                  //初始化端口
}


void ReadIr() interrupt 0
{
    unsigned char j,k;
    unsigned int err;
    Time=0;                  
    DelayMs(70);
    if(IRIN==0)                              //确认是否真的接收到正确的信号
    {   
        err=1000;                            //1000*10us=10ms,超过说明接收到错误的信号
        while((IRIN==0)&&(err>0))            //等待前面9ms的低电平过去        
        {           
            DelayMs(1);
            err--;
        }
        if(IRIN==1)                          //如果正确等到9ms低电平
        {
            err=500;
            while((IRIN==1)&&(err>0))        //等待4.5ms的起始高电平过去
            {
                DelayMs(1);
                err--;
            }
            for(k=0;k<4;k++)                 //共有4组数据
            {               
                for(j=0;j<8;j++)             //接收一组数据
                {
                    err=60;     
                    while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                    {
                        DelayMs(1);
                        err--;
                    }
                    err=500;
                    while((IRIN==1)&&(err>0))//计算高电平的时间长度。
                    {
                        DelayMs(1);          //0.14ms
                        Time++;
                        err--;
                        if(Time>30)
                        {
                            EX0=1;
                            return;
                        }
                    }
                    IrValue[k]>>=1;          //k表示第几组数据
                    if(Time>=8)              //如果高电平出现大于565us,那么是1
                    {
                        IrValue[k]|=0x80;
                    }
                    Time=0;                  //用完时间要重新赋值                           
                }
            }
        }
        if(IrValue[2]!=~IrValue[3])          //反码取反后与原码相同则说明信号接受正确
        {
            return;
        }
    }           
}

使用特权

评论回复
dingy|  楼主 | 2022-6-18 22:01 | 显示全部楼层
有什么问题?

使用特权

评论回复
dingy|  楼主 | 2022-6-18 22:03 | 显示全部楼层
软件延时不准。这个怎么解决?

使用特权

评论回复
dingy|  楼主 | 2022-6-18 22:05 | 显示全部楼层
看不懂,中断函数里有这么多延时函数,肯定是软件架构错误。

使用特权

评论回复
llljh| | 2022-6-18 22:08 | 显示全部楼层

正确的方法是定时器中断,对输入的脉冲先滤波,然后判断高低电平的时间

使用特权

评论回复
zwll| | 2022-6-18 22:11 | 显示全部楼层
嗯,解码起始标志和后续的数据

使用特权

评论回复
dengdc| | 2022-6-18 22:13 | 显示全部楼层
软件延时只能根据你的晶振进行大约的计算,不能非常准确

使用特权

评论回复
wyjie| | 2022-6-18 22:15 | 显示全部楼层
嗯,想要精确延时就要用定时器

使用特权

评论回复
llljh| | 2022-6-18 22:17 | 显示全部楼层
遥控解码时,对于读取某个电平,延时可以略大于该电平的时间

使用特权

评论回复
zhanghqi| | 2022-6-18 22:19 | 显示全部楼层
嗯,但不能过多,不然会影响到下一个电平的读取

使用特权

评论回复
dingy|  楼主 | 2022-6-18 22:21 | 显示全部楼层
其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
guijial511| | 2022-6-21 18:53 | 显示全部楼层
延时不精确

使用特权

评论回复
caigang13| | 2022-7-1 19:17 | 显示全部楼层
网上很多相关代码,下载看看。

使用特权

评论回复
sadicy| | 2022-7-3 14:59 | 显示全部楼层
红外模块不都是现成的代码么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

745

主题

10920

帖子

6

粉丝