久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1613|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91黄在线观看| www.久久.com | 国产馆 | 欧美一级欧美三级在线观看 | 天天综合日日夜夜 | 欧美日韩亚洲一区 | 国产亚洲精品久久yy50 | 一区二区三区欧美 | 国产一区二区在线视频 | 男女羞羞在线观看 | 久久久久久成人 | 成人片免费看 | 免费观看色| av在线免费播放 | 国产精品自产av一区二区三区 | 欧美在线二区 | 日韩羞羞 | 亚洲一区二区视频在线观看 | 日韩成人免费视频 | 国产乱码久久久久久一区二区 | 久久9久 | 精品国产一区二区三区性色av | 亚洲一二三区在线观看 | www国产精| av午夜激情| 岛国毛片| 欧美在线观看一区二区 | 日本一区二区三区在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 欧美精品乱码久久久久久按摩 | 亚洲精品视频免费 | 男人天堂久久 | 久久久毛片 | 日本成人中文字幕在线观看 | 欧美精品一区在线 | 波多野结衣一区二区三区 | 国产欧美视频一区二区三区 | 一区二区三区四区不卡 | 在线免费观看日本 | 水蜜桃久久夜色精品一区 | 99精品视频在线 |