315无线遥控解码带学习功能解码

2019-11-25 15:32发布

/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type           : ATmega48V
clock frequency     : 7.372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/
#include <mega48.h>
#define lck1   10                       //lck1*4=lck4
#define lck4   40                       //数据位H和L电平只和 lck4*wucha4<255
#define wucha1  2                       //lck1的允许正负误差  
#define wucha4  8                       //wucha1*4=wucha4
#define in_1   PINC.0==1                //定义遥控接收端口
#define in_0   PINC.0==0
#define k_1    PINC.1==1
#define k_0    PINC.1==0

unsigned int  time_init;
unsigned char time, time_h, time_l, data0, data1, data2, n, jishu, biaoji, linshi;
unsigned char eeprom e_data0, e_data1, e_data2;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  IF(in_1) {if(jishu<5) jishu++;} else {if(jishu>0) jishu--;}  //积分检测 jishu<lck1-wucha1
  if(jishu==5) biaoji=1;                //上升沿判断
  if(jishu==0) biaoji=0;                //下降沿判断
  if(time<255) time++;
  if(time_init<65535) time_init++;
}

void main(void)
{  
  DDRC=252;  PORTC=255;                 //C0接收信号 C1记忆按键 C2点亮LED
  UCSR0B=8; UCSR0C=0x06; UBRR0L=3;      //串口初始化/监视辅助语句
  TCCR0A=0; TCCR0B=1; TIMSK0=1;         //时钟1分频/溢出中断使能 255/7.3728=34.6us中断一次
  SREG|=128;                            //全局中断使能         
  
  while (1)
  {  
    while(biaoji==0);                   //等待上升沿
    while(biaoji==1);                   //等待下降沿
    time_init=0;                        //同步信号L电平计时复位
    while(biaoji==0);                   //等待上升沿
   
    time=0; time_h=0; time_l=0;         //时间清零
    data0=0; data1=0; data2=0;          //数据清零
   
    if(time_init>(lck1-wucha1)*31 && time_init<(lck1+wucha1)*31)
    {      
      for(n=0; n<24; n++)
      {
        while(biaoji==1);               //等待下降沿
        time_h=time;                    //记录高电平的持续时间  
        time=0;  
        //UDR0=time_h;                  //辅助语句/通过串口输出H电平的时间值   
        while(biaoji==0);               //等待上升沿
        time_l=time;                    //记录低电平的持续时间
        time=0;
        //UDR0=time_l;                  //辅助语句/通过串口输出L电平的时间值   
         
        linshi=time_h+time_l;
         
        if(time_h==time_l || time_h>lck4 || time_l>lck4) break;  //这条语句和下面那条语句要分先后
        if(linshi>lck4+wucha4 || linshi<lck4-wucha4) break;

        if(time_h>time_l)               //如果数据位是1则更新记录/实际应用时建议再检测1和0的H和L电平的宽度
        {
          if(n<16) {if(n<8) data0+=1<<(7-n); else data1+=1<<(15-n);} else data2+=1<<(23-n);
        }
      }
    }
    if(data0==e_data0 || data1==e_data1)                //遥控点亮LED测试
    {
      if(data2==e_data2+4) PORTC.2=1;
      if(data2==e_data2+8) PORTC.2=0;
    }
    if(k_0 && n==24)                                    //记忆数据/第三个数据取高4位/低4位是按键位
    {
      e_data0=data0; e_data1=data1; e_data2=data2&240;
      while(k_0);                                       //等待按键松开/防止EEPROM被反复擦写
    }   
  }
}
这是我在别网上转的程序 我现在没有ATmega48V单片机 我手上有stc11F16XE  STC11F08XE还有STC89C54RD+想把上面的程序用在这些蕊片上选那款好,怎么改上面程序  也不知道行不行
***目标就是想做一个带学习功能315解码程序 手上有晶振3.6864m 4m 12m  我手上现在做好的315不带学习功能解码程序
***望各位师傅指点 !也不知道上面程序