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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

MSP430單片機軟件串口的例子 定時器TA串口

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

關于本程序的詳細解說大家可以下載電子書點擊上圖即可
  1. //                MSP430F413
  2. //            -----------------
  3. //        /|\|              XIN|-
  4. //         | |                 | 32kHz
  5. //         --|RST          XOUT|-
  6. //           |                 |
  7. //           |    P1.0/CCI0A/TX|--------->
  8. //           |                 | 9600 8N1
  9. //           |    P1.1/CCI0B/RX|<---------
  10. //
  11. //*****************************************************************************
  12. #include  <msp430x41x.h>
  13. //波特率=9600 軟件串口的例子
  14. #define Bitime_5  0x47                 // 大約0.5bit所需的時間(略作調整)
  15. #define Bitime    0x6C                 // 9600波特率(實際9620),一比特所需時間

  16. unsigned int RXTXData;                 // 軟件模擬的串口收發緩存變量
  17. unsigned char BitCnt;                  // 比特計數

  18. void TX_Byte (void);
  19. void RX_Ready (void);

  20. void main (void)
  21. {
  22.   WDTCTL = WDTPW + WDTHOLD;                 // 關狗
  23.   FLL_CTL0 |= XCAP18PF;                     // 晶振匹配電容
  24.   TACCTL0 = OUT;                            // TXD腳默認置高
  25.   TACTL = TASSEL_2 + MC_2;                  // TA時鐘選用SMCLK, 連續模式
  26.   P1SEL = BIT0 + BIT1;                      // P1.0與P1.1分別作為TXD與RXD功能
  27.   P1DIR |= BIT0 ;                           // P1.0輸出(TXD)
  28.   _EINT();                                  // 開啟總中斷
  29.   while(1)
  30.   {
  31.     RX_Ready();                             // 接收一個字節
  32.     LPM0;                                   // 休眠,等待接受完喚醒
  33.     TX_Byte();                              // 將受到的數據原樣發回
  34.   }
  35. }

  36. // 將RXTXData變量內的數據從軟件串口中發出
  37. void TX_Byte (void)
  38. {
  39.   BitCnt = 10;                              // 8位數據+起始+結束共10比特
  40.   TACCR0 = TAR;                             // 得到當前TAR值
  41.   TACCR0 += Bitime;                         // 第一次中斷設在1比特時間之后
  42.   RXTXData |= 0x100;                        // 最高位之后添加結束位(1)
  43.   RXTXData = RXTXData << 1;                 // 最低位之前添加起始位(0)
  44.   TACCTL0 = OUTMOD0 + CCIE;                 // TA0(P1.0)電平由OUT標志決定
  45.   while ( TACCTL0 & CCIE );               // 等待發送完成
  46. }


  47. // 開始接收字節,接收結果將存于RXTXData變量內
  48. void RX_Ready (void)
  49. {
  50.   BitCnt = 8;                                         // 接收數據共8比特
  51.   CCTL0 = SCS + CCIS0 + OUTMOD0 + CM1 + CAP + CCIE;   // 用捕獲模式接收
  52.   // 同步模式, P1.1(RXD),下降沿捕獲, 開中斷
  53. }



  54. #pragma vector=TIMERA0_VECTOR   // Timer_A的捕獲比較模塊0的中斷
  55. __interrupt void Timer_A (void)
  56. {
  57.   TACCR0 += Bitime;             // TACCR0偏移1比特時間,為下次中斷做準備

  58.   // RX
  59.   if (TACCTL0 & CCIS0)        // 如果是接收定/捕獲時中斷
  60.   {
  61.     if( TACCTL0 & CAP )         // 如果是第一個比特(起始位)
  62.     {
  63.       TACCTL0 &= ~ CAP;         // 變成比較模式(定時中斷)
  64.       CCR0 += Bitime_5;         // 偏移半個比特,判斷比特中間電平
  65.     }
  66.     else                        // 如果是之后的比特(數據位)
  67.     {
  68.       RXTXData = RXTXData >> 1; //接收緩存字節移位
  69.       if (TACCTL0 & SCCI)       //根據RXD(P1.1)引腳電平獲得當前比特位
  70.         RXTXData |= 0x80;       //低位在先
  71.       BitCnt --;                // 所有的8比特都接收完畢?
  72.       if ( BitCnt == 0)
  73. //------------------------這里相當于接收1字節中斷--------------------------
  74.       {
  75.         CCTL0 &= ~ CCIE;        // 所有都接收完畢關閉比較/捕獲模塊1的中斷
  76.         __low_power_mode_off_on_exit();  // 退出時喚醒CPU
  77.       }
  78. //--------------------------------------------------------------------------
  79.     }
  80.   }
  81.   // TX
  82.   else                          // 如果是發送定/捕獲時中斷
  83.   {
  84.     if ( BitCnt == 0)
  85.       TACCTL0 &= ~ CCIE;          // 所有比特都發送完畢,關閉比較/捕獲模塊1的中斷
  86.     else                          //依次發送每個比特
  87.     {
  88.       TACCTL0 |=  OUTMOD2;        // 發送“1”
  89.       if (RXTXData & 0x01)
  90.         TACCTL0 &= ~ OUTMOD2;     // 發送“0”
  91.       RXTXData = RXTXData >> 1;   // 下一比特
  92.       BitCnt --;                  // 發送比特計數
  93.     }
  94.   }
  95. }
復制代碼



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品视频一区 | 日韩国产欧美视频 | 91就要激情 | 亚洲欧美日韩国产综合 | 久久久91精品国产一区二区三区 | 亚洲一区综合 | 精品在线一区 | 成人国产精品久久 | 91影视| 亚洲国产精品一区 | 激情网站在线观看 | 91视视频在线观看入口直接观看 | 美女黄色在线观看 | 97久久精品午夜一区二区 | 成人欧美一区二区三区在线播放 | 成人高清在线视频 | 欧美天堂在线 | 精品国产99 | 黄色免费观看网站 | 国产精品五区 | 一级做a爰片性色毛片16美国 | 在线久草 | h视频网站在线观看 | 伊人影院在线观看 | 麻豆av一区二区三区久久 | 国产精品一区二区在线观看 | 国产精品久久99 | 狠狠操操| 羞羞的视频在线看 | 国产成人精品久久久 | 久久国产精品99久久久久久丝袜 | 青青青伊人 | 国产免费拔擦拔擦8x高清 | 久在线视频 | 日韩精品av一区二区三区 | 亚洲视频中文字幕 | 欧美一区二区三区久久精品 | 亚洲国产成人在线 | 成人一区av| 久久久久国产精品 | 精品久久久久国产 |