找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5862|回复: 2
收起左侧

msp430单片机定时器模拟串口

[复制链接]
ID:110653 发表于 2016-3-30 19:00 | 显示全部楼层 |阅读模式
     不知道怎么的,我的开发板没有定串口,所以只好想法子看怎么才能实现定时器的功能,网上一搜还真的可以,所以分享给大家。我用的是msp430g2231.

部分源码预览(完整版本请下载附件)
  1. #include <msp430G2231.h>
  2. #include "uart.h"

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

  5. static uchar  RXData0;  //用来存储接收的8位数据
  6. static uchar   RXBitCnt0;//接收数据位数
  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. //----------发送一个字节------------------------------------------//
  36. void send_char(uchar tchar)
  37. {
  38.   TACTL = TACLR + TASSEL_2; //清零计数器 选择SMCLK时钟
  39.   CCR0 = BITTIME_1b;   //crr0定时间隔为1bit时间宽度
  40.   CCTL0 |= CCIE;      //打开CCR0中断
  41.   bitcnt = 10;     //待发送的位数,1位开始位,8位数据位,1位停止位
  42.   uart_buf = 0x0100;   //stop bit 停止位
  43.   uart_buf |= tchar;  //data bit 数据位
  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;//初始化接收数据计数器
  55.   TACTL=TASSEL_2+MC_2+TACLR;//SMCLK  连续记数模式  清零计数器
  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) //串口发送程序处理过程,位操作
  63. {
  64.    if(bitcnt>0)
  65.   {
  66.     if(uart_buf & 0x01)
  67.       POUT |= TXD;//发送数据1
  68.     else
  69.       POUT &= ~TXD;//发送数据0
  70.     uart_buf >>= 1;
  71.     bitcnt--;
  72.   }
  73.    else
  74.   {
  75.     POUT|=TXD;//默认状态置高
  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)  //接收串口数据处理过程,利用串口协议的时间间隔来进行。
  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;//清空缓冲区
  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 有效数据位
  104.                       RXData0=RXData0>>1;//右移一位,等待下一个数据进来
  105.                       if(TACCTL1&SCCI)RXData0|=0x80;//输入为1
  106.                       RXBitCnt0++;
  107.                       break;
  108.                }
  109. }
复制代码

全部源码下载:
msp430G2231_uart.rar (45.71 KB, 下载次数: 52)
回复

使用道具 举报

ID:117823 发表于 2016-6-4 02:08 来自手机 | 显示全部楼层
定时器模拟串口可行,但波特率要设置低点稳定些
回复

使用道具 举报

ID:166714 发表于 2017-2-26 13:09 | 显示全部楼层
非常感谢,但是我怎么下载不了啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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