新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 英飛凌單片機(jī)XC866-2FR紅外接收程序(狀態(tài)機(jī))

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

作者: 時(shí)間:2012-08-31 來源:網(wǎng)絡(luò) 收藏
這是本人在外參與的第一個(gè)項(xiàng)目,主要負(fù)責(zé)紅外發(fā)送與接收部分,本程序?yàn)榻邮詹糠诌m用于英飛凌芯片,在和大家分享分享,稍加刪減便可為你所用。
#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 // @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 registerET2 = 1;                              // Enable interruptTR2 = 1;                              //   start timer} //****************************************************************************// @Controller    Infineon // @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_Cnt14;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)    //{        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;    //是,將對(duì)應(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位是否全部接收完,并且檢測(cè)到停止位             {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ù)自加1if(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;       }}} 


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉