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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

英飛凌單片機XC866-2FR紅外接收程序(狀態機)

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年11月28日   【字體:

     這是本人在外參與的第一個項目,主要負責紅外發送與接收部分,本程序為接收部分適用于英飛凌單片機XC866-2FR芯片,在和大家分享分享,稍加刪減便可為你所用。

#include "MAIN.H"

#define State_Free   0    //定義的五種狀態
#define State_Start  1
#define State_Data   2
#define State_Stop   3
#define State_Error  4
#define Rx_Lg        13   //定義的最大接收數據


uword T2_Counter=0;    //計算進入定時器T2的中斷次數
ubyte Bit_Counter=0;     //接收8bit變量
ubyte State=0;               //狀態變量
ubyte Date_Rx=0;         //數據接收變量
ubyte Table_Cnt;          //接收數據個數變量
ubyte Send_Flag=0;     //發送標志位
ubyte Free_Error=0;     //在空閑狀態下出錯標志位
ubyte Stop_Error=0;     //在停止狀態下出錯標志位

ubyte Get_Cnt=0;         //通過串口發送數據的個數變量
uword Data_Ch1=0,Data_Ch2=0; 

ubyte Table_Rx[14]={0};   //接收數組


 

//****************************************************************************
// @Controller      Infineon XC866-2FR
// @Compiler       Keil
// @Function       T2_vInit(void)
// @Description   通過串口發送數據
// @Input             無
// @Output          無

// @Auth0r           KEVIN
// @Date             2010-11-25
// @Version        1.0
//****************************************************************************
void T2_vInit(void)
{
        T2_RC2L      =  0x20;           // load timer 2 reload/capture register,   
        T2_RC2H      =  0xEF;         // load timer 2 reload/capture register,   
        T2_T2MOD   =  0x10;         // load timer 2 mode register

        ET2 = 1;                              // Enable interrupt

        TR2 = 1;                              //   start timer

} 
//****************************************************************************
// @Controller    Infineon XC866-2FR
// @Compiler      Keil
// @Function      Send_Data() 
// @Description  通過串口發送數據
// @Input            無
// @Output         無

// @Auth0r          KEVIN

// @Date            2010-11-25
// @Version       1.0
//****************************************************************************
void Send_Data()
{
    Data_Ch1=(Table_Rx[1]-0x30)+(Table_Rx[3]-0x30)*16+(Table_Rx[2]-0x30)

                                 +(Table_Rx[7]-0x30)*4096+(Table_Rx[6]-0x30)*256

                                 +(Table_Rx[5]-0x30)*16+(Table_Rx[4]-0x30);
             Data_Ch2=(Table_Rx[11]-0x30)*4096+(Table_Rx[10]-0x30)*256

                                 +(Table_Rx[9]-0x30)*16+(Table_Rx[8]-0x30);
  
             if(Data_Ch1!=Data_Ch2)
             {
                      Table_Rx[13]=1;
             }

             for(Get_Cnt=0;Get_Cnt<14;Get_Cnt++)            //通過串口,發送該16個數據
             {
                          UART_vSendData8(Table_Rx[Get_Cnt]);           //發送緩沖區數據
                          while(!TI);             //等待發送完成
                          TI=0;              //發送完成,清標志位
            }
           Table_Rx[13]=0; 
}

//****************************************************************************
// @Controller    Infineon XC866-2FR
// @Compiler      Keil
// @Function      T2_viTmr(void) 
// @Description  定時器T2中斷函數,接收紅外發送的數據
// @Input            無
// @Output         無

// @Auth0r          KEVIN
// @Date             2010-11-25
// @Version        1.0
//****************************************************************************
void T2_viTmr(void) interrupt T2INT
{
         if (TF2)
        {
        TF2 = 0;
        T2_Counter++;
        if(T2_Counter>400)   //防止變量溢出
        {
          T2_Counter=400;
       }
                 switch(State)    //狀態機
                 {
          case State_Free:    if((HWRx==0)&&(Bit_Counter==0))
               {
                if(T2_Counter>15)    //判斷時間是否大于164*16us
                {
                    T2_Counter=0;    //是,清零  
                    State=State_Start;   //將狀態轉為開始狀態
                }
                else       //否則
                {
                   T2_Counter=0;    //清零 
                   Free_Error=1; 
                   State=State_Error;   //將狀態轉為出錯狀態
                } 
              }
               break;        //結束
         case State_Start: if((T2_Counter>=2)&&(HWRx==0)

                &&(Bit_Counter==0)) //判斷是否滿足開始狀態
                         {
                            T2_Counter=0;     //滿足,清零
                         Bit_Counter=8;     //賦初值
                         State=State_Data;     //將狀態轉為數據

                                                                                                        接收狀態
                          }
                      break;        //結束

         case State_Data:  if((T2_Counter>=5)&&((Bit_Counter>0)

                 &&(Bit_Counter<=8))) //判斷數據是否接收完成
                     {
                        T2_Counter=0;     //沒有,清零計數變量
                        Date_Rx>>=1;     //左移一位
                        if(HWRx==1)      //判斷是否高電平到來
                        {
                           Date_Rx|=0x80;    //是,將對應位置1
                        }
                        Bit_Counter--;     //減一
                        if(Bit_Counter==0)    //判斷八位數據是否

                                                                                                         接收完成
                        {
                           State=State_Stop;
                        }
                      }
                                                     break;

         case State_Stop:   if((T2_Counter>=5)&&(Bit_Counter==0)) //判斷該                數據的8位是否全部接收完,并且檢測到停止位
                    {
                                                              T2_Counter=0;       //清零
                                                              if(HWRx==1)        //判斷收完數據是否

                                                                                             HWRx是否被拉高                    {                
                           Table_Rx[Table_Cnt]=Date_Rx;  

                                                                                    //暫存該數據   
                                                                     Date_Rx=0;       //清零,防止影響

                                                                                                  下面的數據
                                                                    Table_Cnt++;      //接收到數據的個數

                                                                                                  自加1
                                                                    if(Table_Rx[0]!=0x40)    //判斷第一個

                                                                         接收的數據是否為0x40,不是則丟棄
                                                                    {
                                                                            Table_Cnt=0;
                                                                     }
                                                                     State=State_Free;     //將狀態轉為

                                                                                                             空閑狀態          
                                                                    if(Table_Cnt>=Rx_Lg)    //判斷16個

                                                                                                數據是否接收完成
                                                                   {
                                                                           Table_Cnt=0;     //是,則清零
                                                                           Send_Flag=1;     //置發送標志位
                                                                   }
                                                           }
                                                          else         //否則,將進入出錯狀態
                                                          {
                                                                    State=State_Error;
                                                                    Stop_Error=1;
                                                          }
        
                                               }
                                              break;          //結束

                  case State_Error:  if(Free_Error==1)       

                                                {
                                                        if(T2_Counter>50)
                                                         {
                                                                  Free_Error=0;
                                                                  State=State_Free;
                                                         }   
                                               }
                                               if(Stop_Error==1)
                                              {
                                                      if(T2_Counter>18)
                                                      {
                                                              Stop_Error=0;
                                                              State=State_Free;
                                                       }
                                               }        //是,則將狀態轉為空閑狀態
                                               break; 

                            default :      State=State_Free;       //其它情況均轉為空閑狀態
                                                break;       
                }
      }

} 
關閉窗口

相關文章

主站蜘蛛池模板: 亚洲精选久久 | 成人在线看片 | 精品视频在线免费观看 | 99pao成人国产永久免费视频 | 久久国产欧美日韩精品 | 欧美一区二区三区在线视频 | 亚洲一区二区三区在线 | 一区二区精品视频 | 国产一级淫片免费视频 | 日本色综合 | 国产男女视频网站 | 国产99视频精品免视看9 | 久久精品91久久久久久再现 | 91最新视频| 蜜桃免费一区二区三区 | 天堂影院av | 久久久久国产精品 | 日日干夜夜操 | 狠狠干五月天 | 日韩精品 电影一区 亚洲 | 亚洲一区视频在线 | 91九色婷婷 | 久久久久国产一级毛片高清网站 | 中文字幕在线一区 | 中文字幕av一区 | 99国产精品99久久久久久 | 欧美在线观看一区 | av天天干| 欧美国产中文字幕 | 成人精品毛片国产亚洲av十九禁 | 一区二区三区四区五区在线视频 | 免费看黄视频网站 | 超碰婷婷 | h视频在线看 | 亚洲免费精品 | 2018国产精品 | 日韩一区二区三区视频 | 日韩a在线| 人人射人人插 | 中日韩欧美一级片 | 青青操91|