msp430用软件模拟usart

2019-07-15 16:50发布

msp430f449,不用硬件模拟,用tiMESA模拟Usart通讯
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
wangxz5200
2019-07-15 18:37
#include "msp430x44x.h"
  
unsigned int T_DATA=0x00;  //发送缓冲器
unsigned int R_DATA=0x00;  //接收缓冲器

void Delay_bit (unsigned char n);  
void txd (unsigned char byte);  

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  FLL_CTL0 |= XCAP14PF;                   // 匹配14pf电容
  SCFI0 |= FN_2;                           
  SCFQCTL = 121;                          // SMCLK=(121+1) x 32768  = 3.998 MHz
  __delay_cycles(20000);                    //延时20ms,等待晶振起振稳定
  do
  {
    IFG1 &= ~OFIFG;
    for(unsigned int i=5000;i>0;i--);
  }
  while(IFG1&OFIFG);
  TACTL |= TASSEL_2 + TACLR;  
  P2DIR |= BIT4;
  P2OUT |= BIT4;
  P2IES |= BIT5;                        //下降沿捕获
  P2IE |= BIT5;                         //开启P2.5中断功能
  P2IFG = 0;
  
  _EINT();  
  while(1)
  {
    //LPM3;   
  }
}

void Delay_bit (unsigned char n)       //发送1.5字节时间
{

  TACTL |= TACLR + MC_2;   
  switch(n)
  {
    case 0:
    {
      while(TAR<1665);     
    }
    break;
    case 1:
    {
      while(TAR<2498);
    }
    break ;  
  }
  TACTL |= TACLR;
}

void txd (unsigned char byte)            //发送一字节数据
{
  T_DATA=byte;
  T_DATA=T_DATA<<1;                       //将字节数据向左移一位,构造最低位为起始位。
  T_DATA=T_DATA|0x0200;                  //将字的第10位设为1,以作停止位使用。
  for(unsigned char i=0;i<10;i++)
  {
    if(T_DATA&0x0001)
    {
      P2OUT |= BIT4;
    }
    else
    {
      P2OUT &= ~BIT4;
    }
    T_DATA >>= 1;
    Delay_bit(0);
  }  
  P2OUT |= BIT4;
}

#pragma vector=PORT2_VECTOR
__interrupt void P2_Interrupt(void)
{
  if(P2IFG&BIT5)                    
  {
    while(P2IN&BIT5);
    Delay_bit(1);
    for(unsigned char i=0;i<8;i++)
    {
      R_DATA >>= 1;
      if(P2IN&BIT5)
      {
        R_DATA |= 0x80;
      }
      else
      {
        R_DATA |= 0x00;
      }     
      Delay_bit(0);
    }
  }  
  txd(R_DATA);
  P2IFG=0;
}

一周热门 更多>