433M遥控器无线解码1527协议

433M遥控器无线解码1527协议,定时器轮询

1527协议,最前面是引导码,紧接着前20位为地址码,每个遥控器不一样,后4位是按键码,每个遥控器都是一样的,

逻辑分析仪捕捉图形如下图:

分别按下遥控器的四个按键结果如下图:


 
#define GPIO_IRQ         0//测试gpio硬件中断
#define GPIO_LUOFEN     0//测试逻辑分析
 
#define LED    GPIO_PB4//B4 需要关闭打印口
#define KEY    GPIO_PA0
 
extern unsigned char RxFlag;//接收状态标记
extern unsigned int RxBuf[4+1];//多开一个
 
void timer_irq_handler(void);
void ev1527_init(void);
void ev1527decode(void);
void ev1527_task(void);
 
 
//----------------------------------
typedef enum{
    OFF,
    ON,
    BLINK,
}LED_TypeDef;
 
typedef enum{
    NO_KEY,
    KEY1_PRESS,                /* 按下 */
    KEY1_SHORT_RELEASE,        /* 按下立马释放 */
    KEY1_LONG_PRESS,        /* 长按 */
    KEY1_LONG_RELEASE,        /* 长按后释放 */
 
    KEY2_PRESS,                /* 按下 */
    KEY2_SHORT_RELEASE,        /* 按下立马释放 */
    KEY2_LONG_PRESS,        /* 长按 */
    KEY2_LONG_RELEASE,        /* 长按后释放 */
}KEY_TypeDef;
 
 
#define KEY1        GPIO_PB7//S1   配对按键
#define KEY2        GPIO_PB6//S2 up stop down stop
 
#define LED1        GPIO_PB5//LED指示灯
 
#define MOTORUP        GPIO_PD3//上升
#define MOTORDOWN    GPIO_PD6//下降
 
#define LED1ON()            gpio_write(LED1, 0)
#define LED1OFF()            gpio_write(LED1, 1)
 
#define MOTORUPON()            gpio_write(MOTORUP, 1)
#define MOTORUPOFF()        gpio_write(MOTORUP, 0)
#define MOTORDOWNON()        gpio_write(MOTORDOWN, 1)
#define MOTORDOWNOFF()        gpio_write(MOTORDOWN, 0)
 
extern LED_TypeDef LedFlag;
extern unsigned char learning_flag;
 
void motor_set(unsigned char a);
void led_task(void);
void motor_auto_stop(void);
void led_auto_off(void);
void led_auto_off1(void);
void user_led_key_init(void);
unsigned char key_scan(void);
void key_task(void);
void led_task(void);
void learning_key(void);
void ble_task(void);


 
#define NUMBER_COUNT  1 //1判断1次    2判断2次    3 判断3次
 
static Timer LedTimeHandle;//led闪烁定时器句柄
 
#define LED_OFF_TIME         (10*1000)//ms
static Timer LedOffTimeHandle;//led自动关闭定时器句柄
 
#define MOTOR_OFF_TIME         (2*60*1000)//ms 4分钟
static Timer MotorOffTimeHandle;//电机自动关闭句柄
 
#define MOTOR_ON_TIME         (600)//ms     600豪秒
static Timer MotorOnTimeHandle;//电机延迟启动句柄
 
#if (NUMBER_COUNT == 1)
    #define K433_OFF_TIME         (110)
#endif
#if (NUMBER_COUNT == 2)
    #define K433_OFF_TIME         (140)
#endif
#if (NUMBER_COUNT == 3)
    #define K433_OFF_TIME         (170)
#endif
static Timer K433TimeHandle;//433超时关闭
 
unsigned char learning_flag = 0;//学习遥控器flag,1开始学习,0学习结束
LED_TypeDef LedFlag = ON;//led状态
 
void timer_irq_handler(void)//放irq_handler();里面
{
//    static unsigned char a = 0;
    static unsigned char msindex = 0;
#if GPIO_IRQ
    if((reg_irq_src & FLD_IRQ_GPIO_EN)==FLD_IRQ_GPIO_EN){
        reg_irq_src |= FLD_IRQ_GPIO_EN; // clear the relevant irq
        gpio_irqsrc = (reg_gpio_irq_from_pad & KEY);
        DBG("KEY = %d\n", gpio_irqsrc);
        gpio_irq_cnt++;
    }
#endif
 
    if(timer_get_interrupt_status(FLD_TMR_STA_TMR0))
    {
        timer_clear_interrupt_status(FLD_TMR_STA_TMR0); //clear irq status
#if !GPIO_LUOFEN
        ev1527decode();
#endif
#if GPIO_LUOFEN
        static int gpio_irq_cnt = 0;
        if(gpio_irq_cnt++ % 2) gpio_write(LED, 0);
        else gpio_write(LED, 1);
#endif
    }
 
    if(msindex++ >= 20)
    {
        msindex = 0;
        software_timer_ticks();
    }
}
 
void ev1527_init(void)
{
#if GPIO_IRQ
    gpio_set_func(LED ,AS_GPIO);
    gpio_set_output_en(LED, 1);         //enable output
    gpio_set_input_en(LED ,0);            //disable input
    gpio_write(LED, 0);
 
    gpio_set_func(KEY ,AS_GPIO);
    gpio_set_output_en(KEY, 0);             // disable output
    gpio_set_input_en(KEY ,1);                // enable input
 
    gpio_setup_up_down_resistor(KEY, PM_PIN_PULLUP_10K);
    /****GPIO_IRQ POL_FALLING   Press SW2 to connect KEY1 and KEY3 to trigger an interrupt. **/
    /* POL_FALLING(下降沿)   POL_FALLING(上升沿) */
    gpio_set_interrupt(KEY, POL_FALLING);    //When SW2 is pressed, the falling edge triggers the interrupt.
    irq_enable();
#endif
 
    gpio_set_func(KEY ,AS_GPIO);
    gpio_set_output_en(KEY, 0);             // disable output
    gpio_set_input_en(KEY ,1);                // enable input
    gpio_setup_up_down_resistor(KEY, PM_PIN_PULLUP_10K);
#if GPIO_LUOFEN
    gpio_set_func(LED ,AS_GPIO);
    gpio_set_output_en(LED, 1);         //enable
)EV1527中断法解码 ① 设定定时器中断时间,设定为 80us,80us 进入中断进行解码。具体中断时间多少由自己 软件设定,但是中断时间不能太大。 ② 设定同步码解码范围,同步码定为 5.6ms - 16ms。进入中断判断到低电平,低电平判断 一直累加 Count_Lead++,累积低电平的采集时间,判断到高电平,就判断此时 Count_Lead 的值是否在 70 跟 200之间。(备注:5.6ms/80us=70 16ms/80us=200)。 ③ 引导头通过进入数据判断,刚开始是数据高电平,累积高电平的时间 Count_Data_Hi++, 当判断到低电平时候,判断 Count_Data_Hi 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分,先把 Count_Data_Hi 的值保存在 Hi_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ④ 高电平判断通过,开始判断低电平,累积低电平的时间 Count_Data_lo++,当判断到高电 平时候,判断 Count_Data_Lo 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分, 先把 Count_Data_Lo 的值保存在 Lo_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ⑤ 对 0 跟 1 进行区分,把 24bit 数据整理成三个 byte,存在数组 RfData[0],RfData[1], RfData[2]数组里面。 ⑥ 进行相应功能码的操作。 具体解码方法参考例子程序,因为不同的震荡电阻,1527 出来的编码长度不同,例子 程序是参考 1 lck=100us 波形来做的。具体时间参数可以根据自己的 1527 发射实际长度来 编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值