⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 430uart1通信测试.txt

📁 430系列单片机的UART1通信测试
💻 TXT
字号:
430UART1通信测试

  微控技术论坛原创  作者:FancyBoy 
//通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。  
//测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。  
//这是一个430串口接收(中断)和发送例程,可以用来测试430单片机的中断接收  
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#include <MSP430x14x.h>
void Init_UART1(void);      //声明UART初始化函数
void Init_Timer_A(void);        //初始化定时器模块
#define INBUF_LEN 4 //数据长度  
unsigned char UART1_RXBUF1[INBUF_LEN];  
char checksum,count3;  
char TX_Flag;
void send_string_com( unsigned char *str, unsigned int strlen);
void main(void)
{
 WDTCTL = WDTPW + WDTHOLD ; //关闭看门狗
  
 Init_UART1();          //UART初始化函数
  _EINT();              //通用中断允许
  while(1)            //主循环
{  
  if( TX_Flag ==1) //如果取数标志已置位,就将读到的数从串口发出  
  {  
    TX_Flag = 0 ; //取数标志清0  
    send_string_com(UART1_RXBUF1,INBUF_LEN);
  }
}
}
void Init_UART1(void)
{
  UCTL1 &=~ SWRST;              // SWRST复位,USART允许
  UCTL1 = 0x10;                // 8位数据位,1位停止位,无校验
  UBR01 = 0x0D;                 
  UBR11 = 0x00;                // 使用32KHz晶振时波特率为2400bps
  UMCTL1 = 0x6B;               // 位调整
  UTCTL1 = 0x10;                // 选定ACLK(32KHz晶振)为时钟源
  ME2 |= 0x30;                //UART发送及接收模块允许
  P3SEL = 0xC0;                // P3.6 P3.7被USART1发送模块占用
  P3DIR = 0X40;                // P3.6 输出,P3.7 输入
  IE2 |= URXIE1;               //接收中断允许
 

 }

//向串口发送一个字符  
void send_char_com( unsigned char ch)  
{  
TXBUF1=ch;  
while ((UTCTL1&0x01)==0 );  
     
}  

//向串口发送一个字符串,strlen为该字符串长度 

void send_string_com( unsigned char *str, unsigned int strlen)  
{  
unsigned int k= 0 ;  
do  
{  
send_char_com(*(str + k));  
k++;
} while (k < strlen);  
} 
/*****************************************************************************
USART1接收中断函数
******************************************************************************/
#pragma vector=UART1RX_VECTOR
__interrupt void UART1(void)
{
 if (URXIFG1)  
 {  
    unsigned char ch;  
    IFG2 &=~ URXIFG1 ;  
    ch=RXBUF1;  
      if (ch> 127 )  
        {  
          count3= 0 ;  
         UART1_RXBUF1[count3]=ch;  
          checksum= ch- 128 ;
          }  
       else  
        {  
       count3++;  
       UART1_RXBUF1[count3]=ch;  
        checksum ^= ch;  
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )  
  {
    TX_Flag = 1 ; 
   //如果串口接收的数据达到INBUF_LEN个,且校验没错,  
   //就置位取数标志  
  }
 }  
}
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -