找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6568|回復: 2
打印 上一主題 下一主題
收起左側(cè)

msp430單片機定時器模擬串口

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:110653 發(fā)表于 2016-3-30 19:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
     不知道怎么的,我的開發(fā)板沒有定串口,所以只好想法子看怎么才能實現(xiàn)定時器的功能,網(wǎng)上一搜還真的可以,所以分享給大家。我用的是msp430g2231.

部分源碼預覽(完整版本請下載附件)
  1. #include <msp430G2231.h>
  2. #include "uart.h"

  3. static uchar   bitcnt=0;
  4. static uint   uart_buf;

  5. static uchar  RXData0;  //用來存儲接收的8位數(shù)據(jù)
  6. static uchar   RXBitCnt0;//接收數(shù)據(jù)位數(shù)
  7. uchar  rx_sign=0;

  8. volatile int Send_flag=0;

  9. void FaultRoutine(void)
  10. {
  11.    while(1);// 異常掛起
  12. }
  13. void ConfigClocks()
  14. {
  15.    uint i;
  16.   for(i = 0; i < 0xFFFF; i++){};
  17.   _BIS_SR(OSCOFF);
  18.   if(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0xff)
  19.   {
  20.     while(1);
  21.   }
  22.   BCSCTL1 = CALBC1_1MHZ;// Set range
  23.   DCOCTL = CALDCO_1MHZ;  // Set DCO step + modulation
  24.   BCSCTL2 |=SELM_0+DIVS_0+DIVM_0;;              // MCLK = DCO = SMCLK=1MHZ         
  25. }
  26. void ConfigPins()
  27. {
  28.   P1DIR |= TXD+LED+BIT6;
  29.   P1SEL |=RXD;
  30.   P1DIR &= ~RXD;                                        // P1.2 input, other outputs
  31.   
  32.   P1OUT |= TXD;                                                      // clear output pins
  33.   P1OUT &=~LED;
  34. }

  35. //----------發(fā)送一個字節(jié)------------------------------------------//
  36. void send_char(uchar tchar)
  37. {
  38.   TACTL = TACLR + TASSEL_2; //清零計數(shù)器 選擇SMCLK時鐘
  39.   CCR0 = BITTIME_1b;   //crr0定時間隔為1bit時間寬度
  40.   CCTL0 |= CCIE;      //打開CCR0中斷
  41.   bitcnt = 10;     //待發(fā)送的位數(shù),1位開始位,8位數(shù)據(jù)位,1位停止位
  42.   uart_buf = 0x0100;   //stop bit 停止位
  43.   uart_buf |= tchar;  //data bit 數(shù)據(jù)位
  44.   uart_buf <<=1;//start bit.開始位
  45.   Send_flag = 0;
  46.   TACTL |= MC_1; //Start TA, Timer A mode control: 1 - Up to CCR0
  47.   _BIS_SR(GIE);
  48.   while(!Send_flag); //wait until send complete
  49.   Send_flag = 1;
  50. }
  51. //---------------------------------------------------------------------//

  52. void RXReady(void)
  53. {
  54. // RXBitCnt0=0x08;//初始化接收數(shù)據(jù)計數(shù)器
  55.   TACTL=TASSEL_2+MC_2+TACLR;//SMCLK  連續(xù)記數(shù)模式  清零計數(shù)器
  56.   TACCTL1=CM_2+CAP+SCS+CCIE+CCIS_0;
  57.   //下降沿捕獲  同步捕獲源  捕獲模式  捕獲中斷使能  捕獲輸入為CCI1A
  58.   _EINT();
  59. }

  60. // Timer A0 interrupt service routine
  61. #pragma vector=TIMERA0_VECTOR
  62. __interrupt void Timer_A0 (void) //串口發(fā)送程序處理過程,位操作
  63. {
  64.    if(bitcnt>0)
  65.   {
  66.     if(uart_buf & 0x01)
  67.       POUT |= TXD;//發(fā)送數(shù)據(jù)1
  68.     else
  69.       POUT &= ~TXD;//發(fā)送數(shù)據(jù)0
  70.     uart_buf >>= 1;
  71.     bitcnt--;
  72.   }
  73.    else
  74.   {
  75.     POUT|=TXD;//默認狀態(tài)置高
  76.     TACTL &= ~MC_3; //Close the TA when a Byte send over. 00 停止模式
  77.     CCTL0 &= ~CCIE; //關閉CCR0中斷
  78.     Send_flag = 1;
  79.   }
  80. }
  81. //---------------------------------------------------------------------//

  82. #pragma vector=TIMERA1_VECTOR
  83. __interrupt void Timer_A1 (void)  //接收串口數(shù)據(jù)處理過程,利用串口協(xié)議的時間間隔來進行。
  84. {
  85.                P1OUT ^= LED;
  86.                TACCR1+=BITTIME_1b;//增加一位定時間隔
  87.               if(TACCTL1&CAP) //判斷是否為捕獲模式
  88.              {
  89.                   RXBitCnt0=0;
  90.               }
  91.              switch(RXBitCnt0)
  92.              {
  93.                 case 0:   //為捕獲模式
  94.                           RXData0=0;//清空緩沖區(qū)
  95.                           TACCR1+=BITTIME_1b5;
  96.                           TACCTL1&=~CAP;//改為比較模式
  97.                           RXBitCnt0++;
  98.                           break;   
  99.                 case 9:  //比較模式改為捕獲模式
  100.                           TACCTL1|=CAP;
  101.                           rx_sign=1; //作為接收完畢的信號
  102.                           break;
  103.                 default://1~8 有效數(shù)據(jù)位
  104.                       RXData0=RXData0>>1;//右移一位,等待下一個數(shù)據(jù)進來
  105.                       if(TACCTL1&SCCI)RXData0|=0x80;//輸入為1
  106.                       RXBitCnt0++;
  107.                       break;
  108.                }
  109. }
復制代碼

全部源碼下載:
msp430G2231_uart.rar (45.71 KB, 下載次數(shù): 53)
msp430g2452.pdf (266.87 KB, 下載次數(shù): 22)


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

相關帖子

回復

使用道具 舉報

沙發(fā)
ID:117823 發(fā)表于 2016-6-4 02:08 來自手機 | 只看該作者
定時器模擬串口可行,但波特率要設置低點穩(wěn)定些
回復

使用道具 舉報

板凳
ID:166714 發(fā)表于 2017-2-26 13:09 | 只看該作者
非常感謝,但是我怎么下載不了啊
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表