关于用捕获读取红外编码的问题?帮忙找一下原因。

2020-01-25 15:31发布

写一程序,用STC12C5A60S2读取红外编码值。以前在PIC上用定时器实现过。现用STC的捕获来实现,代码如下。 搞了好久就是不能读取红外编码。大家帮忙找一下原因。谢谢!!

捕获中断能进入,启始码也能读取。但读数据码1和0时,就很难测到,但多按几下遥控器也能运行到测试代码。我想问题就在这里,数据码不能完整读取,但程序上找不出问题。红外接收器用1838,在其电源脚和接地脚上接了一220微的电容。以前在PIC上测试时能正常工作。捕获端口用高阻输入模式和双向IO模式都一样。接上拉电阻试了也一样,估计硬件电路问题不大。

/*此处为晶振为11.0592M时的取值,如用其它频率的晶振时,要改变相应的取值。*/
unsigned int Imax=12902;//14ms
unsigned int Imin=5529;//6ms
unsigned int Inum1 =645;//0.7ms
unsigned int Inum2 =1474;//1.6ms
unsigned int Inum3 =2765;//3ms

void init()//初始化函数
{
                P0M1=0;
                P0M0=0;           //设P0口设为推挽输出

                P2M1=0;
                P2M0=0xFF;           //设P2口设为推挽输出

                P1M1=0x08;           //P1.3为输入
                P1M0=0;
               
                P1=0xff;
                DU=0;//数码管段选
                BZ=1;
                WE3=1;//数码管位选
                WE2=1;
                WE1=1;
                WE0=1;
                SW0=1;// 按钮
                SW1=1;
                OUT=1;//继电器断开
        
                CMOD=0x80;//PCA计数脉冲为系统时钟的12分频。
                CCAPM0=0x11;//允许下降沿捕获,允许 CCON 中的 CCFn 触发中断

                EA=1;
                ET0=1;
                AUXR &= 0x7F;                //定时器时钟12T模式
                TMOD &= 0xF0;                //设置定时器模式
                TMOD |= 0x01;                //设置定时器模式
                IPH=0x80;          //把PCA中断设为高优先级
                IP=0x80;
}

void Rf_PCA0_Int(void) interrupt 7//遥控接收函数
{
            
   if (CCF0==1)

   {                  
         
       tc=CCAP0H<<8+CCAP0L;        //提取中断时间间隔时长。
        // CCAP0H = 0x00;                  
         //CCAP0L = 0x00;
           CL = 0x00;      //清PCA计数器
       CH = 0x00;
           CR=1;   //启动计数器
           CCF0=0;/*中断标志清零*/
       if(rfif==0)
       {               
                 /*寻找启始码*/
                if((tc>Imin)&&(tc<Imax))
                {
                        m=0;
                        rfif=1;          //测试代码在这里按遥控器能很快测试到,说明启始码能识别到。       
                }
        }

                /*找到启动码后,进入解码流程*/     
                if(rfif==1)          
                {                  
                   
                   if((tc>Inum2)&&(tc<Inum3))
                    {
                        rf_buff[m/8]=rf_buff[m/8]>>1|0x80; m++;/*取码1,m除8取值*///   
                    }
                    if((tc>Inum1)&&(tc<Inum2))
                    {
                        rf_buff[m/8]=rf_buff[m/8]>>1; m++;/*取码0*/        // 测试代码在这里按遥控器很难测试到,但多按两次也能测试到。说明问题取码可能存在问题。       
                    }
       
                    /*取码完成后判断码是否正确*/
                    if(m==32)
                    {
                        m=0;  rfif=0;
                        if((rf_buff[2]&rf_buff[3])==0)
                        {
                         rfok=1; //测试代码在这里按遥控器不能测试到
                        }
                    }
                }
                if(rfok==1)
                {       
                        rf_interpretation();//遥控键值解释
                        rfdataif(); //遥控判断函数
                        rfok=0;
                }
               
            
         }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wxl
1楼-- · 2020-01-25 19:51
我用stm8的输入捕获就没搞定,直接用中断+定时器了。这样流程更简洁。
mowin
2楼-- · 2020-01-26 00:46
 精彩回答 2  元偷偷看……
xueju
3楼-- · 2020-01-26 01:57
wxl 发表于 2013-12-5 09:51
我用stm8的输入捕获就没搞定,直接用中断+定时器了。这样流程更简洁。

其实用捕获跟中断是差不多的,以前PIC上是用电平变化中断,实现过,现在在STC上用捕获代码基本上没变化。但就是不知道哪里出错了。呵呵
xueju
4楼-- · 2020-01-26 06:59
mowin 发表于 2013-12-5 10:08
我实在没心思看代码。
能说的是:我在M3上用i/o下降沿中断+自由运行的计数器,解过NEC编码,工作非常稳定, ...

谢谢,我一进入中断,先读取计数值,然后就把计数器给清了。
Firman
5楼-- · 2020-01-26 10:02
用示波器看看MCU输入的波形对不对.
红外接收头是高增益运放,容易产生自激.
xueju
6楼-- · 2020-01-26 10:19
Firman 发表于 2013-12-5 10:54
用示波器看看MCU输入的波形对不对.
红外接收头是高增益运放,容易产生自激. ...

没有示波器呀!

一周热门 更多>