<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發(fā)網(wǎng)

      電子開發(fā)網(wǎng)電子設(shè)計 | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
      搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> 單片機(jī)實例 >> 正文

      51通訊協(xié)議—奇偶校驗,單片機(jī)c語言

      作者:佚名    文章來源:本站原創(chuàng)    點擊數(shù):    更新時間:2018-12-19

       單片機(jī)c語言編程,代碼如下

       
      #include "at89x52.h"
       
      /***************************************************
       *          類型定義,方便代碼移植
       ***************************************************/
      typedef unsigned char   UINT8;
      typedef unsigned int    UINT16;
      typedef unsigned long   UINT32; 
          
      typedef char            INT8;
      typedef int             INT16;
      typedef long            INT32;
      typedef bit             BOOL;
       
      /***************************************************
       *          大量宏定義,便于代碼移植和閱讀
       ***************************************************/
      //--------------------------------
                                         //----頭部----
      #define DCMD_CTRL_HEAD1      0x10  //PC下傳控制包頭部1
      #define DCMD_CTRL_HEAD2      0x01  //PC下傳控制包頭部2
       
                                         //----命令碼----
      #define DCMD_NULL            0x00  //命令碼:空操作
      #define DCMD_CTRL_BELL       0x01  //命令碼:控制蜂鳴器
      #define DCMD_CTRL_LED        0x02  //命令碼:控制LED
      #define DCMD_REQ_DATA        0x03  //命令碼:請求數(shù)據(jù)
       
                                         //----數(shù)據(jù)----
      #define DCTRL_BELL_ON        0x01  //蜂鳴器響
      #define DCTRL_BELL_OFF       0x02  //蜂鳴器禁鳴
      #define DCTRL_LED_ON         0x03  //LED亮
      #define DCTRL_LED_OFF        0x04  //LED滅
       
      //--------------------------------
                                         //----頭部----
      #define UCMD_CTRL_HEAD1      0x20  //MCU上傳控制包頭部1
      #define UCMD_CTRL_HEAD2      0x01  //MCU上傳控制包頭部2
       
                                         //----命令碼----
      #define UCMD_NULL            0x00  //命令碼:空操作
      #define UCMD_REQ_DATA        0x01  //命令碼:請求數(shù)據(jù)
       
       
      #define CTRL_FRAME_LEN       0x04  //幀長度(不包含數(shù)據(jù)和校驗值)
      #define PARITY_LEN           0x01  //檢驗值長度
      #define EN_UART()            ES=1  //允許串口中斷
      #define NOT_EN_UART()       ES=0  //禁止串口中斷
       
      #define BELL(x)             {if((x))P0_6=1 ;else P0_6=0;} //蜂鳴器控制宏函數(shù)
      #define LED(x)              {if((x))P2=0x00;else P2=0xFF;}//LED控制宏函數(shù)    
       
      #define TRUE                1
      #define FALSE               0
       
      #define HIGH                1
      #define LOW                 0   
       
      #define ON                  1
      #define OFF                 0
       
      #define NULL                (void *)0 
       
      /*使用結(jié)構(gòu)體對數(shù)據(jù)包進(jìn)行封裝
       *方便操作數(shù)據(jù)
       */
      typedef  struct _PKT_PARITY
      {
          UINT8 m_ucHead1;       //首部1
          UINT8 m_ucHead2;       //首部2
          UINT8 m_ucOptCode;     //操作碼
          UINT8 m_ucDataLength;  //數(shù)據(jù)長度
          UINT8 m_szDataBuf[16]; //數(shù)據(jù)
       
          UINT8 m_ucParity;      //校驗值為1個字節(jié)
       
      }PKT_PARITY;
       
      /*使用共用體再一次對數(shù)據(jù)包進(jìn)行封裝
       *操作數(shù)據(jù)更加方便
       */
      typedef union _PKT_PARITY_EX
      {
          PKT_PARITY r;
          UINT8 p[32];
      } PKT_PARITY_EX;
       
       
      PKT_PARITY_EX    PktParityEx; //定義數(shù)據(jù)包變量
      BOOL  bLedOn=FALSE;     //定義是否點亮LED布爾變量
      BOOL  bBellOn=FALSE;    //定義是否蜂鳴器響布爾變量
      BOOL  bReqData=FALSE;   //定義是否請求數(shù)據(jù)布爾變量
       
      /******************************************************
      *函數(shù)名稱:OddParity
      *輸    入:buf 要校驗的數(shù)據(jù); len 校驗數(shù)據(jù)的長
      *輸    出:校驗值
      *功    能:偶校驗
      *******************************************************/
      BOOL OddParity(UINT8 *buf, UINT8 len)   
      {   
          UINT8 i,j;   
          UINT8 data_temp;   
          BOOL  bParity;   
       
          bParity = 1;  
       
          for(j = 0; j < len;j++)   
          {   
              data_temp = *(buf + j); 
       
              for(i = 0; i < 8; i++)   
              {   
           
                  if((data_temp & 0x01) == 0x01)   
                  {   
                      bParity ^= 1;   
                  }   
       
                  data_temp = data_temp >> 1;      
              }   
          }   
       
          return bParity;   
      /*************************************************************
      * 函數(shù)名稱:BufClr
      * 輸    入:dest 緩沖區(qū); size 緩沖區(qū)大小
      * 輸    出:無
      * 說    明:清空緩沖區(qū)
      **************************************************************/
      BOOL BufCpy(UINT8 * dest,UINT8 * src,UINT32 size)
      {
          if(NULL ==dest || NULL==src ||NULL==size)
          {
              return FALSE;
          }
          
          do
          {
              *dest++ = *src++;
              
          }while(--size!=0);
          
          return TRUE;
      }
      /****************************************************
      ** 函數(shù)名稱: UartInit
      ** 輸    入: 無
      ** 輸    出: 無
      ** 功能描述: 串口初始化
      *****************************************************/                                                                               
      void UartInit(void)
      {
          SCON=0x40;
          T2CON=0x34;
          RCAP2L=0xD9;
          RCAP2H=0xFF;
          REN=1;
          ES=1;
      }
      /****************************************************
      ** 函數(shù)名稱: UARTSendByte
      ** 輸    入: b 單個字節(jié)
      ** 輸    出: 無
      ** 功能描述: 串口 發(fā)送單個字節(jié)
      *****************************************************/ 
      void UARTSendByte(UINT8 b)
      {
            SBUF=b;
           while(TI==0);
           TI=0;
      }
      /****************************************************
      ** 函數(shù)名稱: UARTSendByte
      ** 輸    入: b 單個字節(jié)
      ** 輸    出: 無
      ** 功能描述: 串口 發(fā)送單個字節(jié)
      *****************************************************/ 
      void UartSendNBytes(UINT8 *buf,UINT8 len)
      {
           while(len--)
           {
               UARTSendByte(*buf++);
           }
      }
      /****************************************************
      ** 函數(shù)名稱: main
      ** 輸    入: 無
      ** 輸    出: 無
      ** 功能描述: 函數(shù)主題
      *****************************************************/
      void main(void)
      {
            UINT8 i=0;
           UINT8 ucCheckSum=0;
       
           UartInit();//串口初始化
       
           EA=1;      //開總中斷
           
           while(1)
           {
                if(bLedOn)  //是否點亮Led
                {
                   LED(ON);  
                }
                else
                {
                   LED(OFF); 
                }
                
                
                if(bBellOn)//是否響蜂鳴器
                {
                   BELL(ON);
                }
                else
                {
                   BELL(OFF);
                }
                
                if(bReqData)//是否請求數(shù)據(jù)
                {
                   bReqData=FALSE;
       
                   NOT_EN_UART(); //禁止串口中斷
                   
                   PktParityEx.r.m_ucHead1=UCMD_CTRL_HEAD1;//MCU上傳數(shù)據(jù)幀頭部1
                   PktParityEx.r.m_ucHead2=UCMD_CTRL_HEAD2;//MCU上傳數(shù)據(jù)幀頭部2
                   PktParityEx.r.m_ucOptCode=UCMD_REQ_DATA;//MCU上傳數(shù)據(jù)幀命令碼
                   
                   PktParityEx.r.m_ucParity=OddParity(PktParityEx.p,
                                                            CTRL_FRAME_LEN+
                                                         PktParityEx.r.m_ucDataLength);//計算校驗值
       
                     /*
                      這樣做的原因是因為有時寫數(shù)據(jù)長度不一樣,
                        導(dǎo)致PktParityEx.r.m_ucParity會出現(xiàn)為0的情況
                      所以使用BufCpy將校驗值復(fù)制到相應(yīng)的位置
                   */
       
                   BufCpy(&PktParityEx.p[CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength],
                              &PktParityEx.r.m_ucParity,
                            PARITY_LEN);
                   
                   UartSendNBytes(PktParityEx.p,
                                     CTRL_FRAME_LEN+
                                  PktParityEx.r.m_ucDataLength+
                                  PARITY_LEN);//發(fā)送數(shù)據(jù)
       
                   EN_UART();//允許串口中斷
                           
                }
           }
      }
      /****************************************************
      ** 函數(shù)名稱: UartIRQ
      ** 輸    入: 無
      ** 輸    出: 無
      ** 功能描述: 串口中斷服務(wù)函數(shù)
      *****************************************************/
      void UartIRQ(void)interrupt 4
      {
           static UINT8  uccnt=0;
                  UINT8  uclen;
                  UINT8  ucParity;
           
           if(RI) //是否接收到數(shù)據(jù)
           {
              RI=0;
       
              PktParityEx.p[uccnt++]=SBUF;//獲取單個字節(jié)
       
              if(PktParityEx.r.m_ucHead1 == DCMD_CTRL_HEAD1)//是否有效的數(shù)據(jù)幀頭部1
              {
                 if(uccnt<CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength+PARITY_LEN)//是否接收完所有數(shù)據(jù)
                 {
                    if(uccnt>=2 && PktParityEx.r.m_ucHead2!=DCMD_CTRL_HEAD2)//是否有效的數(shù)據(jù)幀頭部2
                    {
                       uccnt=0;
       
                       return;
                    }
                          
                 }
                 else
                 {
                    
                    uclen=CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength;//獲取數(shù)據(jù)幀有效長度(不包括校驗值)
       
                    ucParity=OddParity(PktParityEx.p,uclen);//計算校驗值
       
                      /*
                      這樣做的原因是因為有時寫數(shù)據(jù)長度不一樣,
                        導(dǎo)致PktParityEx.r.m_ucParity會出現(xiàn)為0的情況
                      所以使用BufCpy將校驗值復(fù)制到相應(yīng)的位置
                     */
                    BufCpy(&PktParityEx.r.m_ucParity,
      &PktParityEx.p[uclen],
      PARITY_LEN);
       
                    if(ucParity!=PktParityEx.r.m_ucParity)//校驗值是否匹配
                    {
                        uccnt=0;
       
                        return;  
                    }
       
                    switch(PktParityEx.r.m_ucOptCode)//從命令碼中獲取相對應(yīng)的操作
                    {
                      case DCMD_CTRL_BELL://控制蜂鳴器命令碼
                      {
                           if(DCTRL_BELL_ON==PktParityEx.r.m_szDataBuf[0])//數(shù)據(jù)部分含控制碼
                           {
                              bBellOn=TRUE;
                           }
                           else
                           {
                              bBellOn=FALSE;
                           }
                      }
                      break;
       
                      case DCMD_CTRL_LED://控制LED命令碼
                      {
       
                           if(DCTRL_LED_ON==PktParityEx.r.m_szDataBuf[0])//數(shù)據(jù)部分含控制碼
                           {
                              bLedOn=TRUE;
                           }
                           else
                           {
                              bLedOn=FALSE;
                           }
                      }
                      break;
       
                      case DCMD_REQ_DATA://請求數(shù)據(jù)命令碼
                      {
                           bReqData=TRUE;
                      }
                      break;
       
                    }
       
                    uccnt=0; 
       
                    return;
                 }
       
              }
              else
              {
                  uccnt=0;
              }
       
           }
      }
      Tags:單片機(jī)編程,51通訊協(xié)議  
      責(zé)任編輯:admin
    4. 上一篇文章:
    5. 下一篇文章: 沒有了
    6. 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網(wǎng)友評論
      最新推薦
      熱門文章
      • 此欄目下沒有熱點文章
      關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 小说区图片区综合久久88| 精品综合久久久久久888蜜芽| 97久久婷婷五月综合色d啪蜜芽 | 国产综合精品一区二区| 天堂久久天堂AV色综合| 亚洲综合亚洲综合网成人| 天天色天天射综合网| 亚洲熟女综合一区二区三区| 婷婷综合缴情亚洲狠狠尤物| 久久精品国产9久久综合| 日日狠狠久久偷偷色综合96蜜桃| 久久精品水蜜桃av综合天堂| 国产香蕉尹人综合在线观看| 亚洲国产精品综合福利专区| 国产色婷婷精品综合在线| 色综合久久一区二区三区| 久久综合色之久久综合| 亚洲heyzo专区无码综合| 亚洲国产成人久久综合碰碰动漫3d | 久久久综合中文字幕久久| 一本色道久久综合| 99久久综合狠狠综合久久aⅴ | 亚洲香蕉网久久综合影视| 亚洲欧美国产国产综合一区| 狠狠色综合色综合网络| 六月丁香婷婷综合| 国产综合精品在线| 色综合天天色综合| 人人狠狠综合88综合久久| 久久综合亚洲色HEZYO国产| 色综合一区二区三区| 色婷婷综合久久久久中文字幕| 色五月五月丁香亚洲综合网| 狠狠综合久久久久综合网| 人人狠狠综合88综合久久| 色综合久久88色综合天天 | 国产成人亚洲综合网站不卡| 亚洲色欲啪啪久久WWW综合网 | 色综合天天综合高清网| 亚洲国产综合AV在线观看| 狠狠色噜狠狠狠狠色综合久|