RF315和RF433通用解码程序

        前提条件:50us的定时器中断

        还未完善变量名、相关注释等

#define RF_RECV_PIN RF_DECODE_PIN // 接收RF信号的引脚

static u32 __rf_data = 0xFFFFFFFF; // 存放接收到的rf数据(在定时器中断中使用)
volatile u32 rf_data = 0xFFFFFFFF; // 存放接收到的rf数据
volatile u32 rf_addr = 0xFFFFFFFF; // 存放遥控器的地址 (后续可能要改成支持多个遥控器,可能要换成数组来存放)

void 中断服务函数(void)
{
    // 清除中断标志,屏蔽其他中断(可选)

    static bool bit_end;                // 可以换成只有1bit的变量
    static u8 Pluse_H_cnt, Pluse_L_cnt; // 高低电平计数
    static u8 rf_bit_cnt;               // 数据位计数(总共应为24bits)

    static bool f_levelbuf; // (可以换成只有1bit的变量)
    bool flagerror = 0;     // 标志位,表示接收错误(可以换成只有1bit的变量)
    bool flagsuccess = 0;   // 标志位(可以换成只有1bit的变量)

#define MAX_PULSE 30
#define MIN_PULSE 3     // 最小脉宽不应小于滤波宽度
#define FILTER_CNT 0X07 // 滤波因数 0b_0111
    static u8 filter;
    static bool f_level;

    filter <<= 1;
    // 检测IO是否为高电平
    if (gpio_read(RF_RECV_PIN))
        filter |= 0x01;

    filter &= FILTER_CNT;
    if (filter == FILTER_CNT)
    {
        f_level = 1; // 高电平
    }
    else if (filter == 0x00)
    {
        f_level = 0; // 低电平
    }

    if (f_level) // 高电平判断(如果当前是高电平)
    {
        if (bit_end) // 一位结束
        {
            bit_end = 0;
            if (Pluse_L_cnt >= MIN_PULSE)
            {
                __rf_data <<= 1;
                if (Pluse_H_cnt > Pluse_L_cnt)
                {
                    __rf_data |= 0x01;
                }
                else
                {
                    __rf_data &= ~(0x01);
                }
                Pluse_H_cnt = 0;
            }
            else // 低电平小于150us认为出错
            {
                flagerror = 1;
            }
        }
        else
        {
            f_levelbuf = 1;
            Pluse_H_cnt++;
            if (Pluse_H_cnt >= MAX_PULSE)
            {
                flagerror = 1;
            }
            Pluse_L_cnt = 0;
        }
    }
    else // 低电平判断(如果当前是低电平)
    {
        Pluse_L_cnt++;
        if (Pluse_L_cnt >= MAX_PULSE) // 低电平超出最大值
        {
            if (rf_bit_cnt != 25)
            {
                flagerror = 1;
                __rf_data = 0xFFFFFFFF;
                // printf("rf decode err \n");
            }
            else // 解码成功
            {
                __rf_data &= 0xFFFFFF; // 只保留低24位的数据,清除之前的数据残留
                flagsuccess = 1;       //

                // 可以在这里给相应的标志位置一,或是发送消息给到其他线程:
            }
        }
        else
        {
            if (f_levelbuf)
            {
                f_levelbuf = 0;
                Pluse_L_cnt = 0;
                bit_end = 1;
                if (Pluse_H_cnt >= MIN_PULSE)
                {
                    rf_bit_cnt++;
                    if (rf_bit_cnt >= 26)
                    {
                        flagerror = 1;
                    }
                }
                else
                {
                    flagerror = 1;
                }
            }
        }
    }

    if (flagerror || flagsuccess) // 出错/收尾处理
    {
        rf_bit_cnt = 0;
        Pluse_H_cnt = 0;
        Pluse_L_cnt = 0;
        f_levelbuf = 0;
        bit_end = 0;
    }

    // 退出中断
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值