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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年11月28日   【字體:

     這是本人在外參與的第一個(gè)項(xiàng)目,主要負(fù)責(zé)紅外發(fā)送與接收部分,本程序?yàn)榻邮詹糠诌m用于英飛凌單片機(jī)XC866-2FR芯片,在和大家分享分享,稍加刪減便可為你所用。

#include "MAIN.H"

#define State_Free   0    //定義的五種狀態(tài)
#define State_Start  1
#define State_Data   2
#define State_Stop   3
#define State_Error  4
#define Rx_Lg        13   //定義的最大接收數(shù)據(jù)


uword T2_Counter=0;    //計(jì)算進(jìn)入定時(shí)器T2的中斷次數(shù)
ubyte Bit_Counter=0;     //接收8bit變量
ubyte State=0;               //狀態(tài)變量
ubyte Date_Rx=0;         //數(shù)據(jù)接收變量
ubyte Table_Cnt;          //接收數(shù)據(jù)個(gè)數(shù)變量
ubyte Send_Flag=0;     //發(fā)送標(biāo)志位
ubyte Free_Error=0;     //在空閑狀態(tài)下出錯(cuò)標(biāo)志位
ubyte Stop_Error=0;     //在停止?fàn)顟B(tài)下出錯(cuò)標(biāo)志位

ubyte Get_Cnt=0;         //通過串口發(fā)送數(shù)據(jù)的個(gè)數(shù)變量
uword Data_Ch1=0,Data_Ch2=0; 

ubyte Table_Rx[14]={0};   //接收數(shù)組


 

//****************************************************************************
// @Controller      Infineon XC866-2FR
// @Compiler       Keil
// @Function       T2_vInit(void)
// @Description   通過串口發(fā)送數(shù)據(jù)
// @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  通過串口發(fā)送數(shù)據(jù)
// @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++)            //通過串口,發(fā)送該16個(gè)數(shù)據(jù)
             {
                          UART_vSendData8(Table_Rx[Get_Cnt]);           //發(fā)送緩沖區(qū)數(shù)據(jù)
                          while(!TI);             //等待發(fā)送完成
                          TI=0;              //發(fā)送完成,清標(biāo)志位
            }
           Table_Rx[13]=0; 
}

//****************************************************************************
// @Controller    Infineon XC866-2FR
// @Compiler      Keil
// @Function      T2_viTmr(void) 
// @Description  定時(shí)器T2中斷函數(shù),接收紅外發(fā)送的數(shù)據(jù)
// @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)    //狀態(tài)機(jī)
                 {
          case State_Free:    if((HWRx==0)&&(Bit_Counter==0))
               {
                if(T2_Counter>15)    //判斷時(shí)間是否大于164*16us
                {
                    T2_Counter=0;    //是,清零  
                    State=State_Start;   //將狀態(tài)轉(zhuǎn)為開始狀態(tài)
                }
                else       //否則
                {
                   T2_Counter=0;    //清零 
                   Free_Error=1; 
                   State=State_Error;   //將狀態(tài)轉(zhuǎn)為出錯(cuò)狀態(tài)
                } 
              }
               break;        //結(jié)束
         case State_Start: if((T2_Counter>=2)&&(HWRx==0)

                &&(Bit_Counter==0)) //判斷是否滿足開始狀態(tài)
                         {
                            T2_Counter=0;     //滿足,清零
                         Bit_Counter=8;     //賦初值
                         State=State_Data;     //將狀態(tài)轉(zhuǎn)為數(shù)據(jù)

                                                                                                        接收狀態(tài)
                          }
                      break;        //結(jié)束

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

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

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

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

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

                                                                                    //暫存該數(shù)據(jù)   
                                                                     Date_Rx=0;       //清零,防止影響

                                                                                                  下面的數(shù)據(jù)
                                                                    Table_Cnt++;      //接收到數(shù)據(jù)的個(gè)數(shù)

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

                                                                         接收的數(shù)據(jù)是否為0x40,不是則丟棄
                                                                    {
                                                                            Table_Cnt=0;
                                                                     }
                                                                     State=State_Free;     //將狀態(tài)轉(zhuǎn)為

                                                                                                             空閑狀態(tài)          
                                                                    if(Table_Cnt>=Rx_Lg)    //判斷16個(gè)

                                                                                                數(shù)據(jù)是否接收完成
                                                                   {
                                                                           Table_Cnt=0;     //是,則清零
                                                                           Send_Flag=1;     //置發(fā)送標(biāo)志位
                                                                   }
                                                           }
                                                          else         //否則,將進(jìn)入出錯(cuò)狀態(tài)
                                                          {
                                                                    State=State_Error;
                                                                    Stop_Error=1;
                                                          }
        
                                               }
                                              break;          //結(jié)束

                  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;
                                                       }
                                               }        //是,則將狀態(tài)轉(zhuǎn)為空閑狀態(tài)
                                               break; 

                            default :      State=State_Free;       //其它情況均轉(zhuǎn)為空閑狀態(tài)
                                                break;       
                }
      }

} 
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 日韩三级免费观看 | 国产大学生情侣呻吟视频 | 国产亚洲精品久久久久动 | 亚洲国产片 | 毛片区| 亚洲成av片人久久久 | 国产精品久久久久久久久图文区 | 最新国产精品精品视频 | 中文字幕一区在线观看视频 | 亚洲精品成人在线 | 久久精品毛片 | 欧洲色综合 | 久草中文在线 | 色综合激情| 99精品视频一区二区三区 | 久久69精品久久久久久久电影好 | 午夜视频一区二区 | 国产一区在线视频 | 天天躁日日躁aaaa视频 | 亚洲播放 | 日韩最新网址 | 男女免费网站 | 日本在线小视频 | 99re6热在线精品视频播放 | 国产天堂 | 91亚洲国产成人久久精品网站 | 亚洲日韩中文字幕 | 国产精品久久av | 青青久视频 | 国产精品精品视频一区二区三区 | 国产视频第一页 | 亚洲欧美中文日韩在线v日本 | 欧美日韩在线成人 | 亚洲资源在线 | 亚洲交性| 成人特区| 国产999精品久久久久久绿帽 | 日韩不卡在线观看 | 91精品中文字幕一区二区三区 | 日日综合| 九九九国产 |