这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » 定时开关插座 315M无线遥控C51解码程序

共1条 1/1 1 跳转至

定时开关插座 315M无线遥控C51解码程序

高工
2015-07-31 11:01:17     打赏

/*315M无线解码程序*/

/*无线码宽电平脉冲时间1.8ms,低电平脉冲时间600us,同步码低电平时间18.6ms

P1口接LED显示接收到的无线码的最后一字节数据

 

MCUSTC12C405212MHzOSC,调试通过*/

#include <stc12c4052.h>

 

#define  uchar unsigned char

#define WUXIAN P3_2       //无线信号输入脚

#define _rlcar_(RX)  CY=RX&0X80  //RX带进位左移1位,数据放入ACC

uchar bdata wx_data0,wx_data1,wx_data2;  //存储24位无线数据

uchar data wx_code0,wx_code1,wx_code2;

uchar data wx_count,wxcount_buf;   //低电平时间计数器

uchar data wx_bit;       //无线码位数

uchar data t_10ms;

uchar data t_500ms;

bit tb_flag;        //同步码接收成功标志

bit wx_ok;         //无线码接收成功标志

bit wx_sta;         //无线信号输入脚的高低电平状态

 

 

 

void mcu_initialize() {

 WDT_CONTR=0x00;       //关闭看门狗

 AUXR=0;         //定时器01设为传统8051速度,12分频

 P1M0=0;P1M1=0x0;      //P1为准双向口

 P1=0;

 

 P3M0=0x04;P3M1=0x00;     //P3.2设置成输入脚

 

 TR0=0;

 TH0=0x9c;TL0=0x00;      //100us中断一次

 

 TMOD|=0x02;        //设置T0为自动装入的8位定时器

 ET0=1;          //允许T0中断

 EA=1;

 TR0=1;         //启动T0

}

 

 

void main() {

 

 mcu_initialize();

 while(1);

 

}

 

 

 

void decode() {

 if(WUXIAN) {           //检测无线I/O口为高

 

  if(!wx_sta) {

   wx_sta=1;          //无线信号从低变高

   wxcount_buf=wx_count;

  

   if(tb_flag) {         //同步码标志为1

     if((0x02<wxcount_buf)&&(wxcount_buf<0x08)){           //低电平脉宽范围在200us800us之间

      CY=1;

    

     }

     else if((0x0d<wxcount_buf)&&(wxcount_buf<0x14)){     //低电平脉宽范围在1.3ms2ms之间

      CY=0;

     

     }

     else{        //干扰码

     loop2:wx_count=0;

      wx_bit=0;

      wxcount_buf=0;tb_flag=0;

      return;

     }

    _rlcar_(wx_data0);      //移位寄存器,接收一位数据

    wx_data0=ACC;

    _rlcar_(wx_data1);

    wx_data1=ACC;

    _rlcar_(wx_data2);

    wx_data2=ACC;

 

     

   

    if(++wx_bit==24){      //接收完24位码,接收成功标志wx_ok1

     tb_flag=0;

     wx_bit=0;

     wx_ok=1;

     wx_code0=wx_data0;wx_code1=wx_data1;wx_code2=wx_data2;

    

     P1=wx_code0;      //p1口接LED显示数据

    }

     }

     else {

      if((0x87<wxcount_buf)&&(wxcount_buf<0xc8))

    tb_flag=1;        //抵电平脉宽范围在13.5ms20ms之间,把同步码标志置1

   else

    goto loop2;

     }

    }

 }

 else {

  if(wx_sta) {

   wx_count=0;         //无线信号从高变低,清零低电平脉宽计数器

   wx_sta=0;

   

   }

 

  else

   wx_count++;         //无线信号为低电平,低电平脉宽计数器加1

    }

}

void timer0_isr() interrupt 1 {

 decode();

 if(++t_10ms>=100){         //P3.7口接的LED0.5s的速度闪烁

  t_10ms=0;

  if(++t_500ms>=50){

   P3_7=!P3_7;

   t_500ms=0;

  }

 }

 

}



共1条 1/1 1 跳转至

回复

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