打印

USART异步串口通信问题

[复制链接]
777|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
打算用USART1作为串口用,程序如下,但是不知道为什么就是没用,请大神帮忙看看~
#include<msp430x14x.h>
#define uint unsigned int
#define uchar unsigned char
void stop();
unsigned char TBuff[2]={1,2}; // 发送缓冲区

#define keyin    (P1IN & 0x0F)
void delay(void);


/*******************************************
函数名称:delay
功    能:用于延时消抖
参    数:无
返回值  :无
********************************************/
void delay(void)
{
    int tmp1;
    int tmp2;
   
    for(tmp1 =2000;tmp1 > 0;tmp1--)
    {
        for(tmp2=200;tmp2>0;tmp2--);
    }
}




/****************************************************************************
* 名称:Sys_Ini()
* 功能:系统初始化
* 入口参数:无  
* 出口参数:无
****************************************************************************/
void Sys_Ini(void)
{
  unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 &= ~XT2OFF;                       // XT2on
  BCSCTL2|=SELM1+SELS;                      //MCLK为8MHZ,SMCLK为8MHZ
  do
  {
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);               // Time for flag to set
    _NOP();
  }
  while ((IFG1 & OFIFG)!=0);                   // OSCFault flag still set?
  IFG1&=~OFIFG;
  BCSCTL2 |= SELM_2 + SELS;
}





void ini_uart(void)
{
    P3SEL |= BIT6+BIT7;                            // 选择P3.6和P3.7做UART通信端口
    P3DIR |=BIT6;                               //设置TXD1方向为输出
    ME2 |= UTXE1 + URXE1;                     // 使能USART1的发送和接收
    U1CTL |= CHAR+SWRST;                       // 选择8位字符
    U1TCTL |= SSEL1;                          // UCLK = ACLK
    U1BR0 = 0x03;                             // 波特率9600
    U1BR1 = 0x00;                             //
    U1MCTL = 0x4A;                            // 波特率调整
    U1CTL &= ~SWRST;                          // 初始化UART状态机
    IE2 |= URXIE1+UTXE1;                            // 使能USART0的接收中断
    IFG2 &=~UTXIFG1;
    _EINT();                            //打开全局中断
    _BIS_SR(LPM3_bits +GIE);
    }

void sent_byte(uchar data)
{
  while(!(IFG2&UTXIFG1));
  U1TXBUF=data;
}

#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
  uchar data=0;
  data=U1RXBUF;
  sent_byte(data);
}

void PutString(char *ptr)
{
      while(*ptr != '\0')
      {
            while (!(IFG1 & UTXIFG0));                // TX缓存空闲?
            TXBUF0 = *ptr++;                       // 发送数据
      }
      while (!(IFG1 & UTXIFG0));
      TXBUF0 = '\n';
}
char *F2S(double d,char * str)
{
  char str1[40];
  int j=0,k,i;
  i = (int)d;  //浮点数的整数部分
  //d = d-(int)d;
  while(i>0)
  {
    str1[j++] = i%10+'0';
    i /= 10;
  }
  for(k=0;k<j;k++)
    str[k] = str1[j-1-k]; //
  str[j++] = '.';
  d -= (int)d;
  for(i=0;i<10;i++)
  {
    d *= 10;
    str[j++] = (int)d+'0';
    d -= (int)d;
  }
  while(str[--j]=='0');
    str[++j] = '\0';
  return str;
}

void Print_Str(uchar *s)
{
  Send_Byte(*s++);
  delay_ms(2);
}
/********************主函数********************/
void main( void )
{

  Sys_Ini();        //系统初始化
  ini_uart();       //串口设置初始化
  //Port_Inti();      //端口初始化
  _EINT();            // 开中断
  
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗  
    P1DIR = 0x00;               //设置P1.0~P.3为输入状态
   
    P2DIR =0xff;              //
    P2OUT=0XFF;              //

    while(1)
    {
        if(keyin != 0x0F)       //如果有入侵
        {
              sent_byte(0);  
              P2OUT =0XFE;
              delay();     
        }
        else
        sent_byte(1);
        P2OUT =0XFF;
        delay();
      
    }
}

相关帖子

沙发
陌上言语·小白|  楼主 | 2015-4-18 15:17 | 只看该作者
改成这样了,接收的数据是FF
#include<msp430x14x.h>
#define uint unsigned int
#define uchar unsigned char
void stop();
unsigned char TBuff[2]={1,2}; // 发送缓冲区

#define keyin    (P1IN & 0x0F)
void delay(void);


/*******************************************
函数名称:delay
功    能:用于延时消抖
参    数:无
返回值  :无
********************************************/
void delay(void)
{
    int tmp1;
    int tmp2;
   
    for(tmp1 =2000;tmp1 > 0;tmp1--)
    {
        for(tmp2=200;tmp2>0;tmp2--);
    }
}




/****************************************************************************
* 名称:Sys_Ini()
* 功能:系统初始化
* 入口参数:无  
* 出口参数:无
****************************************************************************/
void Sys_Ini(void)
{
  unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 &= ~XT2OFF;                       // XT2on
  do
  {
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_2 + SELS;
}





void ini_uart(void)
{
    P3SEL |= 0xC0;                            // 选择P3.4和P3.5做UART通信端口
    ME2 |= UTXE1 + URXE1;                     // 使能USART0的发送和接受
    UCTL1 |= CHAR;                            // 选择8位字符
    UTCTL1 |= SSEL1;                          // UCLK = ACLK
    UBR01 = 0x45;                             // 波特率9600
    UBR11 = 0x00;                             //
    UMCTL1 = 0x049;                            // Modulation
    UCTL1 &= ~SWRST;                          // 初始化UART状态机
    IE2 |= URXIE1;                            // 使能USART0的接收中断
    _EINT();                                  //打开全局中断
    }

void sent_byte(uchar data)
{
  while((IFG2&UTXIFG1)==0);
  U1TXBUF=data;
}

#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX(void)
{
  uchar data=0;
  data=U1RXBUF;
  sent_byte(data);
}

void PutString(char *ptr)
{
      while(*ptr != '\0')
      {
            while (!(IFG2 & UTXIFG1));                // TX缓存空闲?
            TXBUF1 = *ptr++;                       // 发送数据
      }
      while (!(IFG2 & UTXIFG1));
      TXBUF1 = '\n';
}

/********************主函数********************/
void main( void )
{

  Sys_Ini();
  ini_uart();
  _EINT();
  
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗  
    P1DIR = 0x00;               //设置P1.0~P.3为输入状态
    P2DIR =0xff;              //
    P2OUT=0XFF;              //

    while(1)
    {
        if(keyin != 0x0F)       //如果有入侵
        {
              sent_byte(1);  
              P2OUT =0XFE;
              delay();     
        }
        else
        sent_byte(0);
        P2OUT =0XFF;
        delay();
      
    }
}

使用特权

评论回复
板凳
dirtwillfly| | 2015-4-18 23:05 | 只看该作者
没明白硬件是怎么链接的。
建议把tx和rx连一起,先调试下自己给自己数据能否正确收到

使用特权

评论回复
地板
ccw1986| | 2015-4-19 21:16 | 只看该作者
dirtwillfly 发表于 2015-4-18 23:05
没明白硬件是怎么链接的。
建议把tx和rx连一起,先调试下自己给自己数据能否正确收到 ...

有没有电路图,上传一下吧,看看电路设计有没有问题

使用特权

评论回复
5
zhen416472721| | 2015-4-20 08:22 | 只看该作者
我也是想用它发送数据,不知道怎么弄了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝