找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 928|回复: 1
收起左侧

辉芒60F021芯片写1527遥控器解码程序0和1判断条件范围加大;还是不能正常执行;请教大神

[复制链接]
ID:1003176 发表于 2022-8-27 17:30 | 显示全部楼层 |阅读模式
// 芯片型号: FT60F021    SOP-8
// 芯片参数: Flash 2KX14b, EEPROM 256X8b, SRAM 128X8b
// 作者:
// 公司:
// 版本:
// 日期:
/*                         FT60F021  SOP8
*                          ----------------
*           VDD-----------|4(VDD)   (GND)13|-----------GND
*      指示灯3------------|5(PA4)   (PA6)12|------------指示灯2
*           RF------------|6(PA2)   (PA7)11|------------指示灯1
*  按键+指示灯------------|7(PA0)   (PA1)10|------------指示灯0
*                                       ----------------
//===========================================================*/
#include        "SYSCFG.h"
//========================宏定义===========================
#define  SET_SE                    PA0
#define  RF             PA2
#define  LED3                PA4  
#define  LED2                PA6
#define  LED1                PA7   
#define  LED0                PA1
#define  uchar                unsigned char   
#define  uint                    unsigned int
#define  ulong          unsigned long
#define  T0_N           256-228
//===========================================================
//=======================函数声明==========================
void POWER_INITIAL (void);                    //IO口初始化
void DelayUs(uint Time);                      //微秒延时函数
void delay_1ms(uint Time);                    //毫秒延时函数
void INT_INITIAL(void);                       //中断初始化函数
void Eeprom_Write(uchar address, uchar value);//写数据到EEPROM
void rx_receive(void)   ;   //数据接收函数
void TIMER0_INITIAL (void); //定时器中断初始化函数
void interrupt ISR(void);   //定时器中断初始化函数

//===========================================================
//=======================变量定义==========================
//ulong mma,mm;  //接收数据保存变?
//uchar l;
uchar data1_1,data1_2,data1_3;
uchar data2_1,data2_2,data2_3;
     uchar hle_w=0;      //高电平时间
     uchar lle_w=0;      //低电平时间        
     uchar old_bit;  //1位数据读完标记位
     uchar tb_ok=0;    //前导码判断完成标记位
     uchar rf_ok1=0;     //第一组数据接收完毕标记位
     uchar rf_ok2;     //第二组数据接收完毕标记位
//===========================================================

/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
   POWER_INITIAL();//系统初始化
   TIMER0_INITIAL ();//计时器中断初始化//计时50微秒中断一次
   while(1)
   {
       LED0=0;LED1=0;LED2=0;LED3=0;
   }
}
/*----------------------------------------------------
* 函数名称:rx_receive
* 功能:    接收RF数据
* 输入参数:无
* 返回参数:无
----------------------------------------------------*/
void rx_receive(void)//数据接收函数
{   
    uchar bma;       //接收数据保存
    uchar ma_n=0;    //数据接收位数
    if (!RF)     
    {
       lle_w++;      //数据低电平时间
        old_bit=1;    //一位数据接收完成标记
    }
    else
    {
       hle_w++;      //数据高电平时间  
           if (old_bit) //数据接收完成进入
       { // LED2=1;
          Eeprom_Write(0x20,ma_n); //测试用来看执行了多少位
          if ((!tb_ok)&&(hle_w>=2)&&(hle_w<=8)&&(lle_w>=100)&&(lle_w<=200)) //判断前导码  
          {  
              Eeprom_Write(0x00,hle_w); Eeprom_Write(0x03,lle_w);//测试用来看高低电平时间
              ma_n=0;tb_ok=1;bma=0;hle_w=0;lle_w=0;old_bit=0;  //接收位数标记;前导码判断完常;数据清零
          }
          else if(tb_ok&&(lle_w>=10)&&(lle_w<=30))//判断数据0
          {
             Eeprom_Write(0x11,lle_w);LED2=1; //测试用来看低电平时间
                     ma_n++;                //接收数据位数标记位
             bma=bma<<1;     //数据左移1位保存
             hle_w=0;lle_w=0;old_bit=0;
          }
          else if(tb_ok&&(lle_w>=3)&&(lle_w<=8))//判断数据1
         {   
            Eeprom_Write(0x12,lle_w);//测试用来看低电平时间
            ma_n++;
            bma=bma<<1;    //数据先左移1位 //写0
            bma=bma+1;      //写1
            hle_w=0;lle_w=0;old_bit=0;
         }
         else{ma_n=0;tb_ok=0;bma=0;hle_w=0;lle_w=0;rf_ok1=0;rf_ok2=0;old_bit=0;} //接收数据有误标记位全部清零

         if(ma_n==8){data1_1=bma;bma=0;}
         else if(ma_n==16){data1_2=bma;bma=0;}
         else if(ma_n==24){data1_3=bma;bma=0;tb_ok=0;old_bit=0;}   
         if(ma_n==24)      //数据接收够24位进入
         {
            if(!rf_ok1)    //判断是不是接收到的第一组数据
                    {   
                LED0=1;
                            data2_1=data1_1;    //把data1数据复制data2
                data2_2=data1_2;
                data2_3=data1_3;
                        rf_ok1=1;   //第一组数据接收完毕标记位置1
                            ma_n=0;     //接收数据位数标记位清零
                    }
                    else if(rf_ok1)  
                {
                     LED1=1;
                     rf_ok2=1;   //第二组数据接收完毕标位置1                           
                      ma_n=0;     //接收数据位数标记位清零        
            }     
         }                                                                                                                                                      
       }
    }
    if(rf_ok2)//第二组数据接收完毕进入
    {
       if(data2_1 == data1_1&&data2_2 == data1_2&&data2_3 == data1_3) //接收的两次数据对比
           {
                  rf_ok1 = 0;     //第一组数据接收完毕标记位清零
                  rf_ok2 = 0;     //第二组数据接收完毕标记位清零
          Eeprom_Write(0x30,data2_1);//写数据
          Eeprom_Write(0x31,data2_2);
          Eeprom_Write(0x32,data2_3);
          LED3=1;
          delay_1ms(1000);//完成闪灯
          LED3 = 0;
          delay_1ms(1000);
          LED3 = 1;
          delay_1ms(1000);
          LED3 = 0;
       }
    }
}
/*----------------------------------------------------
* 函数名:TIMER0_INITIAL
* 功能: 初始化设置定时器 Timer0
* 设置 TMR0 定时时长=(1/系统时钟频率)*指令周期*预分频值*255
(1/16000000)*2*2*(256-228)=60us//计算的时间实际测试有误差,现在的取值实际测试刚好是60US
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
    OPTION = 0B00000000;
    //Bit5: T0CS Timer0 时钟源选择
    // 1-外部引脚电平变化 T0CKI 0-内部时钟(FOSC/2)
    //Bit4: T0CKI 引脚触发方式 1-下降沿 0-上升沿
    //Bit3: PSA 预分频器分配位 0-Timer0 1-WDT
    //Bit[2:0]: PS 8 个预分频比 111 - 1:256
    T0IF = T0_N; //清空 T0 软件中断
    T0IE = 1;
    GIE  = 1;
}
/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能: Timer0 的中断处理函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt ISR(void)
{
   if(T0IE && T0IF) //60us 进一次
   {
      T0IF = 0;
      TMR0 = T0_N;
     // LED0 = ~LED0;
      rx_receive();
   }
}
/*----------------------------------------------------
* 函数名称:EEPROM_write
* 功能:    写数据到EEPROM
* 输入参数:EEAddr 需要写入数据的地址
*                         Data 需要写入的数据
* 返回参数:无
----------------------------------------------------*/
void Eeprom_Write(uchar address, uchar value)//EERM写数据函数
{
CLRWDT();
        EEADR = address;

        EEDAT = value;
        EECON1 = 0x34;
        WR = 1;
        while(WR==1)CLRWDT();
        WREN1 = 0;
        WREN2 = 0;
        WREN3 = 0;
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能:  上电系统初始化
* 输入:  无
* 输出:  无
--------------------------------------------------*/        
void POWER_INITIAL (void)
{
        OSCCON = 0B01110001;                //WDT=32k IRCF=111=16M
    INTCON = 0;                                        //暂禁止所有中断
        PORTA = 0B00000000;               
        TRISA = 0B00000101;                        //PA输入输出 0-输出 1-输入  //PA1,PA4,PA6,PA7,PA1,-输入 PA0-输出                                                        
        //PORTC = 0B00000000;         
        //TRISC = 0B00000000;                //PC输入输出 0-输出 1-输入  
        WPUA = 0B00000000;                     //PA端口上拉控制 1-开上拉 0-关上拉  //开PA6,PA7,PA1上拉                                                
        OPTION = 0B00001000;                //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1      
    WDTCON = 0b00000000;
    //Bit4=0,禁止LVR(60F01x O版之前)      
        //Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)  
    //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)           
        CMCON0 = 0B00000111;                //关闭比较器,CxIN为数字IO口
}
/*----------------------------------------------------
* 函数名称:DelayUs
* 功能:    短延时函数 --16M-2T--大概快1%左右.
* 输入参数:Time延时时间长度 延时时长Time Us
* 返回参数:无
----------------------------------------------------*/
void DelayUs(uint Time)
{
        uint a;
        for(a=0;a<Time;a++) { NOP();}
}                  
/*----------------------------------------------------
* 函数名称:DelayMs
* 功能:    短延时函数
* 输入参数:Time延时时间长度 延时时长Time ms
* 返回参数:无
----------------------------------------------------*/
void delay_1ms(uint Time)
{
        uchar b;//
    uint a;
        for(a=0;a<Time;a++)
        {
                for(b=0;b<5;b++) {DelayUs(197);}                //快1%
        }
}


回复

使用道具 举报

ID:1003176 发表于 2022-8-27 17:34 | 显示全部楼层
264d8931b4fd5b8333cb3491eb1632d.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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