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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4064|回復: 0
打印 上一主題 下一主題
收起左側

MSP430單片機UART定長幀與變長幀處理程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:108615 發表于 2016-3-14 19:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例2.9.13)))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html

關于本程序的詳細解說大家可以下載電子書點擊上圖即可
MSP430單片機UART定長幀處理程序:
  1. #include <msp430x42x.h>
  2. #define FRAME_SIZE  8                              /*定長幀的長度*/
  3. #define LOCAL_ADDR  0x01
  4. unsigned char FrameBuff[FRAME_SIZE];          /*接收幀緩沖區數組*/
  5. unsigned int  UART_RcvCnt=0;                /*接收計數*/
  6. unsigned char FrameRcvStatus=0;         /*幀接收狀態*/
  7. #define FREE     0
  8. #define RECEIVE  1

  9. #pragma vector=UART0RX_VECTOR
  10. __interrupt void UART0_RX (void)         // 串口接收中斷
  11. {
  12.    if(FrameRcvStatus==FREE)             // 空閑狀態下
  13.    {
  14.      if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))   
  15.      {                                //如果收到的是幀首字節,且與本機地址相符
  16.          FrameBuff[0]=U0RXBUF;        //接收該字節
  17.          FrameRcvStatus=RECEIVE;      //狀態跳轉至接收狀態
  18.          UART_RcvCnt=1;               //接收計數(已經接收1字節)
  19.      }
  20.    }
  21.    else if(FrameRcvStatus==RECEIVE)     // 在接收狀態下
  22.    {
  23.       if((U0RCTL & RXWAKE)==0)            //如果收到的是數據
  24.       {
  25.         FrameBuff[UART_RcvCnt]=U0RXBUF; //接收該字節數據
  26.         UART_RcvCnt++;                  //指向下一單元
  27.       }
  28.       else                              //如果又收到是幀首字節(數據幀中斷或漏發)
  29.       {
  30.         if(U0RXBUF==LOCAL_ADDR)         //且地址相符
  31.         {
  32.           FrameBuff[0]=U0RXBUF;         //接收該字節數據
  33.           UART_RcvCnt=1;                //重新接收數據
  34.         }
  35.         else                            //地址不符
  36.         {
  37.           UART_RcvCnt=0;                //接收數組清零
  38.           FrameRcvStatus=FREE;          //重新回到空閑狀態,等待幀起始
  39.         }
  40.       }
  41.       if(UART_RcvCnt>=FRAME_SIZE )
  42.       {
  43. //--------------------------------------------------------------------------
  44. //                  數據幀接收完畢,在這里寫數據幀處理程序
  45.           _NOP();  //在這里設斷點查看FrameBuff[]數組的數據
  46. //--------------------------------------------------------------------------        
  47.           UART_RcvCnt=0;                //接收數組清零
  48.           FrameRcvStatus=FREE;          //重新回到空閑狀態,等待幀起始        
  49.       }
  50.    }
  51. }

  52. void main( void )
  53. {                                                               
  54.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看門狗
  55.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振負載電容
  56.   U0CTL = CHAR;                                // 異步通訊模式,8位數據,無校驗,1位停止位。
  57.   ME1 |= UTXE0 + URXE0;                        // 開啟串口0收發模塊
  58.   U0TCTL |= SSEL0;                        // 選擇ACLK作為串口波特率時鐘源。
  59.   U0BR1 = 0;                                //
  60.   U0BR0 = 13;                                // 分頻系數整數部分=13
  61.   U0MCTL = 0x6B;                        // 分頻系數小數部分調制=5/8。(2400bps)
  62.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
  63.   IE1 |= URXIE0;                         // 開啟UART0的接收中斷,在中斷內接收數據
  64.   _EINT();                                // 總中斷允許
  65.   while(1)
  66.   {   
  67.     //CPU可以執行其他任務
  68.   }
  69. }
復制代碼

MSP430單片機UART變長幀處理程序:
  1. #include <msp430x42x.h>
  2. #define FRAMEBUF_SIZE  32                /*最大幀長度*/
  3. unsigned char FrameBuff[FRAMEBUF_SIZE]; /*接收幀緩沖區數組*/
  4. unsigned int  UART_RcvCnt=0;                /*接收計數*/

  5. #pragma vector=UART0RX_VECTOR
  6. __interrupt void UART0_RX (void)         // 串口接收中斷
  7. {
  8.   int i;
  9.   if(U0RXBUF==0x0D) return;             //對回車命令的第一字節不響應
  10.   if(U0RXBUF==0x0A)                     //收到結束符
  11.     {
  12. //--------------------------------------------------------------------------
  13. // 數據幀接收完畢,在這里寫數據幀處理程序,注意緩沖區只用前UART_RcvCnt個數據
  14.        _NOP();  //在這里設斷點查看FrameBuff[]數組的數據
  15. //--------------------------------------------------------------------------        
  16.       UART_RcvCnt=0;                    //清除接收緩沖區字節數清零
  17.       for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff[i]=0; //清除接收緩沖區(可省略)
  18.       return;
  19.     }
  20.    if(UART_RcvCnt<FRAMEBUF_SIZE)        //正常數據,若緩沖區未滿
  21.     {
  22.       FrameBuff[UART_RcvCnt]=U0RXBUF;    //接收一字節數據
  23.       UART_RcvCnt++;                     //指向下一字節
  24.     }
  25. }

  26. void main( void )
  27. {                                                               
  28.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看門狗
  29.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振負載電容
  30.   U0CTL = CHAR;                                // 異步通訊模式,8位數據,無校驗,1位停止位。
  31.   ME1 |= UTXE0 + URXE0;                        // 開啟串口0收發模塊
  32.   U0TCTL |= SSEL0;                        // 選擇ACLK作為串口波特率時鐘源。
  33.   U0BR1 = 0;                                //
  34.   U0BR0 = 13;                                // 分頻系數整數部分=13
  35.   U0MCTL = 0x6B;                        // 分頻系數小數部分調制=5/8。(2400bps)
  36.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
  37.   IE1 |= URXIE0;                         // 開啟UART0的接收中斷,在中斷內接收數據
  38.   _EINT();                                // 總中斷允許
  39.   while(1)
  40.   {   
  41.     //CPU可以執行其他任務
  42.   }
  43. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久久久 | 在线播放国产一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 91在线观看免费 | 蜜桃视频麻豆 | 五月天婷婷激情 | 国产成人免费视频网站高清观看视频 | 精品1区2区 | 韩日在线视频 | 亚洲交性 | 91av视频在线免费观看 | 成人免费大片黄在线播放 | 日韩免费1区二区电影 | 欧美jizzhd精品欧美巨大免费 | 国产精品高潮呻吟久久久久 | 欧美一区二区在线 | 午夜影晥 | 亚洲成人www | 在线看av网址 | 国产精品日韩一区二区 | 日日天天| 又爽又黄axxx片免费观看 | 国产精品乱码一区二区三区 | 亚洲网站在线观看 | 日本色高清 | 国产免费一区 | 日韩精品一区二区三区高清免费 | 国产激情综合五月久久 | 国产三级精品三级在线观看四季网 | 日韩免费视频 | 91九色porny首页最多播放 | 99福利视频导航 | 欧美精品乱码久久久久久按摩 | av日韩在线播放 | 国产丝袜一区二区三区免费视频 | 国产av毛片| 亚洲精品视频在线 | 五月婷婷视频 | 国产精品久久九九 | 国产精品福利在线 | 97精品超碰一区二区三区 |