找回密码
 立即注册

QQ登录

只需一步,快速开始

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

接收解码问题

[复制链接]
跳转到指定楼层
楼主
80黑币
各位大佬们帮忙看下,如图是接收引脚波形(自定义协议发射的),数码管单独配置输出是可以点亮的,目前我想测试下接收到的数据,接收到就全部点亮,结果发现不能点亮,帮忙看下是不是解码部分有问题。

void main(void)
{
    GPIO_INIT();
    DISI();
    Timer0_INIT();
    ENI();
    while(1)
    {
        CLRWDT();
        if(POWER==0)
        {
            flag1=0;
            PIN1=PIN2=PIN3=PIN4=PIN5=PIN6=PIN7=PIN8=PIN9=PIN10=0;
            if(K1_SDA==0)
            {
                WDTEN=0;                                // 关闭看门狗   
                BWUCON = 0X08;
                PCON1  = 0X80;                          // 关闭定时器0中断                        
                INTE   = 0X02;                          // 打开io变化中断
                INTF=0;
                while(RX==0)
                {
                    SLEEP();
                }
                K1_SDA = 1;
                POWER=1;
               
                ABPLCON = 0XFF;
                IOSTA   = 0XFD;
                PORTA   = 0X00;
   
                BPHCON  = 0XFF;
                IOSTB   = 0XFF;
                PORTB   = 0X00;
                T0MD   = 0X02;                          // 打开看门狗   
                PCON1  = 0X81;                          // 打开定时器0中断
                INTE   = 0X01;                          // 关闭外部中断打开定时器0中断
                Timer1_INIT();        
                WDTEN=1;
                CLRWDT();
            }
        }
        else
        {
            CLRWDT();
            
            /*
            if(lvd==11)
            {
                if(flag1==0)
                {
                    if(PWM_C<3)
                    {
                        if(PWM_H1<1000){lvd=11;}
                        else if(PWM_H1<2000){PIN9=PIN10=1;}
                        else{PWM_H1=0;PWM_C++;}
                    }
                    else
                    {
                        flag1=1;
                    }
                }
                if(flag1==1)
                {
                    POWER=0;
                }
            }
            else
            {
                if(temp==1){PIN9=1;}
                display();
                LED_SCAN();
            }
            */
            des_sever();
            if(temp==1)
            {
                IOSTA   = 0X00;
                IOSTB   = 0X08;
                PIN1=PIN2=PIN3=PIN4=PIN5=PIN6=PIN7=PIN8=1;
                PIN9=PIN10=0;
            }
            //display(temp);
            //LED_SCAN();
        }
    }
}
void isr(void) __interrupt(0)
{
    if(INTFbits.T0IF)
    {
        
        RfDuty_32Bit();
        
        TMR0 = 163;               
        INTF= (unsigned char)~(C_INT_TMR0);    // Clear T0IF flag bit        
    }
    if(INTFbits.T1IF)                                
    {
        if(RX){DIR_InCont++;}
        INTF= (unsigned char)~(C_INT_TMR1);             // 清除T0IF标志位
    }
   
}
//------------------------------------------解码-------------------------------------//
void RfDuty_32Bit(void)
{
    if(IR_State==0)
    {
        DIR_InCont=0;
        T1CR1=0x03;
        IR_State=1;
    }
    else if(IR_State==1)
    {
        IR_Timer=DIR_InCont;
        DIR_InCont=0;
        if((IR_Timer >= 20) && (IR_Timer <= 30))
        {
            IR_State=2;
        }
        else
        {
            IR_State=1;
        }
    }
    else if(IR_State==2)
    {
        IR_Timer=DIR_InCont;
        DIR_InCont=0;
        if((IR_Timer >= 4) && (IR_Timer <= 8))
        {
            IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));    //0
            IR_pData++;
        }
        else if((IR_Timer >= 10) && (IR_Timer <= 14))
        {
            IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));    //1
            IR_pData++;   
        }
        else
        {
            IR_pData=0;
            IR_State=1;
        }
        if(IR_pData>=16)
        {
            IR_pData=0;
            RX_NUM=IR_Data[0];
            RX_LVD=IR_Data[1];
            T1CR1=0x02;
            IR_State=0;
        }
    }
   
   
}
void des_sever(void)
{
//unsigned char dsp_code[14]={0X3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0xF0,0X1F,0XFF};//0111 0111
   
    if(RX_NUM==0x01){temp=1;}
    else if(RX_NUM==0x02){temp=10;}
    else if(RX_NUM==0x03){temp=2;}
    else if(RX_NUM==0x04){temp=3;}
    else if(RX_NUM==0x05){temp=4;}
    else if(RX_NUM==0x06){temp=5;}
    else if(RX_NUM==0x07){temp=6;}
    else if(RX_NUM==0x08){temp=7;}
    else if(RX_NUM==0x09){temp=8;}
    else if(RX_NUM==0x0A){temp=9;}
    else if(RX_NUM==0x0B){temp=10;}
   
    if(RX_LVD==0x01){lvd=11;}
    else if(RX_LVD==0x02){lvd=12;}
    else if(RX_LVD==0x03){lvd=12;}
    else if(RX_LVD==0x04){lvd=0;}
    else if(RX_LVD==0x05){lvd=8;}
    else if(RX_LVD==0x60){lvd=13;}
   
   
}
//------------------------------------------定时器-------------------------------------//
void Timer0_INIT(void)
{
    PCON1 = C_TMR0_Dis;
    TMR0 = 0;   
    T0MD = C_PS0_TMR0 | C_PS0_Div4;
    INTE = C_INT_TMR0 | C_INT_TMR1;
    PCON1 = C_TMR0_En;
}
void Timer1_INIT(void)
{
    TMRH = 0;
    TMR1 = 97;            //50us
    T1CR1 = 0x02;
    T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;
    INTE = C_INT_TMR0 | C_INT_TMR1;
}

123456.png (27.42 KB, 下载次数: 0)

接收引脚收到的波形

接收引脚收到的波形

最佳答案

查看完整内容

RfDuty_32Bit();应该用RX脚的下降沿来触发,而不是定时器
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2024-11-25 20:55 | 只看该作者
RfDuty_32Bit();应该用RX脚的下降沿来触发,而不是定时器
回复

使用道具 举报

板凳
ID:161164 发表于 2024-11-25 23:13 | 只看该作者
请描述一下自定义协议的时序
回复

使用道具 举报

地板
ID:1125252 发表于 2024-11-26 08:17 | 只看该作者
lkc8210 发表于 2024-11-25 23:13
请描述一下自定义协议的时序

一共16位,都是电平不翻转直接发送过来的。RX[0]是代表电机档位一档就是发送0x01过来,二档0x02,三挡0x03,....,十档0x0A,RX[1]是代表电量的,满电0X06,这里我开始以为我接收的是反的,写成0x60,电量有0x05,0x04,0x03,0x02,0x01。定义规则是起始位是高电平2.5ms,1ms低电平,然后1是高电平1.2ms,500us低电平,0是600us高电平,500us低电平。上面的定时是100us的。
回复

使用道具 举报

5#
ID:1125252 发表于 2024-11-27 10:30 | 只看该作者
lkc8210 发表于 2024-11-26 14:25
RfDuty_32Bit();应该用RX脚的下降沿来触发,而不是定时器

谢谢!已经解决了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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