这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 通讯及无线技术 » 红外遥控解码有点问题,求各位大佬指导

共7条 1/1 1 跳转至

红外遥控解码有点问题,求各位大佬指导

工程师
2019-06-26 14:32:39     打赏
用的PIC16F877A,程序不知道哪里出错了,找茬了一天了。求指导;
CCP1输入捕获方式,用D端口的指示灯指示接收到的数据。指示灯用电阻上拉的。
程序如下:请指导下。
#include<pic.h>
//__CONFIG(0xFF32);

void ccp1_init()  //capture mode
{
        T1CON = 0x00;                //no postscale and no prescale
        CCP1CON = 0x04;         //capture mode and falling edge
        TMR1L = 0x00; //timer1 count from TMR1 to 0xffff
        TMR1H = 0x00;
        GIE = 1;
        PEIE = 1;
        CCP1IE = 1;
        CCP1IF = 0;
}

volatile unsigned int countl = 0;   //捕获的时间
volatile unsigned char leadcode_ok = 0; //引导码OK
volatile unsigned char time_start = 0;  //解码开始
volatile unsigned char i = 0; 
volatile unsigned char ir_code[4] = {0,0,0,0}; // 红外接收到的4个数据

void main()                 

        TRISD = 0x00;                          //portd 输出  LED端口
        PORTD = 0xff;
        TRISC = 0xff;                        // CCP1 输入,对应红外输入
        ccp1_init();                                
        while (1)        
        {
                ;
        }        
}

void interrupt ccp1(void)
{
        if(CCP1IF && CCP1IE )
        {
                CCP1IE = 0;
                if(time_start == 0)
                { 
                        TMR1H = 0;
                        TMR1L = 0 ;
                        TMR1ON = 1;
                        time_start = 1;
                }        
                else
                {
                        TMR1ON = 0;
                        countl = TMR1H*256+TMR1L;
                        TMR1H = 0;
                        TMR1L = 0;
                        TMR1ON = 1;
                        if((countl >12500)&&(countl <14500)&&(leadcode_ok == 0))
                        {
                                leadcode_ok = 1;        
                                i = 0;
                        }
                        else
                        {
                                if((countl >2000)&&(countl <2500)&&(leadcode_ok==1)) //bit 1
                                {
                                        ir_code[i/8] = ir_code[i/8]<<1+1;
                                        i++;
                                } 
                                else                                
                                if((countl >1000)&&(countl <1300)&&(leadcode_ok==1))   //bit 0
                                {
                                        ir_code[i/8] = ir_code[i/8] <<1 ;
                                        i++;
                                }
                                else 
                                {
                                        time_start = 0;
                                        leadcode_ok = 0;
                                        i = 0;                                        
                                }                        
                        }
                        if(i==32)
                                {
                                        i = 0;
                                        time_start = 0;
                                        leadcode_ok = 0;
                                        PORTD = ~ir_code[3]; //用指示灯输出 红外数据
                                }
                }
                TMR1IF = 0;
                CCP1IF = 0;
                CCP1IE = 1;
        }        
}        





关键词: 指导    

工程师
2019-06-26 14:39:53     打赏
2楼

只要把代码的第67行那个if的判定条件改一下就好了


工程师
2019-06-26 14:40:18     打赏
3楼

接收还是发射啊? 做遥控器推荐中颖sh77p1654 效果非常非常好。


工程师
2019-06-26 14:41:34     打赏
4楼

//测试成功,修改
//----------------------------------------------------------------------------------------------------------------------------------
// 程序名:HW6-2.c
// 程序功能:红外线遥控LED
// --------------------------------------------------------------------------------------------------------------------------------

#include<reg51.h>                                                   //头文件
sbit IRIN=P3^2;                                                       //定义红外IR信号输入位
sbit SPK=P3^7;                                     //定义蜂鸣器接口
sbit RELAY=P2^7;                                   //定义继电器接口
unsigned char IRDATA[7];                                   //定义数组,存储红外接收到的数据

//-------------------------------------- 主函数 -------------------------------------- 
void main()
{
        EA=1;                                          // 允许总中断
    EX0=1;                                         // 允许外部中断INT0中断
        IT0=1;                                         // 外部中断INT0采用脉冲触发方式
        P1=0x00;                                       // 设置P1初始值
        SPK=1;                                         // 设置SPK初始值
        IRIN=1;                                        // IR 输入位设置为高电平
        while(1);                                      // 无限循环
}

//--------------------------------------- 延时函数  ------------------------------------

void delay(unsigned char x)                               //延时约x*0.1ms  
{                                                                                         
        unsigned char i;                                                                
        while(x--)                                                            
        {for(i=0;i<10;i++){}}                                
}

//-------------------------------------  发声函数  -------------------------------------

void fs_d ( )                                                  
{                                                                                                                   
        unsigned char i;                                                
        for(i=0;i<100;i++)
         {
           delay(4);                                                     
           SPK=~SPK;
         }                                                                         
        SPK=1;
}

//-------------------------------------  中断解码函数   -----------------------------------


void IR_IN() interrupt 0 using 0                           //外部中断INT0函数
{
        unsigned char j,k,n=0;                                               //先定义变量,且n=0
    EX0=0;                                                                               //暂时先关中断
        delay(20);                                                           //延时0.10ms*20=2ms
        if(IRIN==1)                                                   //如果IRIN出现高电平,是干扰信号
         {                                                                     
           EX0=1;
           return;                                      //返回                 
         } 
        while(!IRIN){delay(1);}                                    //避开9ms前导低电平信

   for(j=0;j<4;j++)                                                        //一共有4组数据
     {        
          for(k=0;k<8;k++)                                                //每组数据有8位
         {
   while(IRIN){delay(1);}                                // 避开4.5ms高电平
   while(!IRIN){delay(1);}                                  
// 开始接收数据          
    while(IRIN)                                                 
        {
           delay(1);                                                //延时0.1ms
       n++;                                                                //每过0.1ms时n就加1
           if(n>=30)                                            //如果超过30,放弃
           {                                                              
                  EX0=1;
                  return;
           }                                  //返回
        }
                   
              IRDATA[j]=IRDATA[j]>>1;                   //右移1位
          if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}                                                                    
              n=0;                                            //n清0
            }
     }
//检查接收的数据和数据反码是否相反           
    if(IRDATA[2]!=~IRDATA[3])                            //判断数据码和数据反码是不是相反
        {                                                                            //否则就放弃
             EX0=1;
             return;
        }        
        else {}
           fs_d ( );                                   //调用发声函数
           P1=IRDATA[2];                                   // P1端口输出  
           EX0=1;                                                               //开中断
}        

//--------------------------------------------------------------------------------------------------



工程师
2019-06-26 15:06:28     打赏
5楼

可以啊楼主 做的不错


菜鸟
2019-06-26 15:18:20     打赏
6楼

加油吧1


工程师
2019-06-28 18:29:43     打赏
7楼

对PIC单片机,不是很了解。爱莫能助。。。


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]