找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4081|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430单片机软件串口的例子 定时器TA串口

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 18:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.8.21)))完整例程下载:http://www.51hei.com/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 单片机教程网

快速回复 返回顶部 返回列表