020:MSP430单片机UART0应用

DM430-L型开发板串口接收发送程序,使用单片机的串口0,显示操作通过串口调试助手
通过电脑与串口线连接开发板串口座,使用串口调试助手发送数据到开发板板,并运用LCD1602显示数据
同时开发板板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询
板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替
开发板的BSL区的RXD和TXD0连接,TXD和RXD0连接即可,另外2个跳线帽也要取下
注意使用BSL模块作为USB转串口功能的时候,RTS和TCK跳线帽、DTR和RESET跳线帽要断开

 

  1 #include <msp430f169.h>
  2 //延时函数
  3 #define CPU_F ((double)8000000)   //外部高频晶振8MHZ
  4 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  5 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  6 
  7 //自定义数据结构,方便使用
  8 #define uchar unsigned char
  9 #define uint  unsigned int
 10 #define ulong unsigned long
 11 //串口波特率计算,当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数
 12 #define baud           9600                                //设置波特率的大小
 13 #define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式
 14 #define baud_h         (uchar)(baud_setting>>8)            //提取高位
 15 #define baud_l         (uchar)(baud_setting)               //低位
 16 //LMB162液晶控制管脚配置
 17 #define DataDIR         P4DIR                     //数据口方向
 18 #define DataPort        P4OUT                     //P4口为数据口
 19 
 20 #define RS_0          P5OUT &= ~BIT5           //RS置低
 21 #define RS_1          P5OUT |=  BIT5           //RS置高
 22 
 23 #define RW_0          P5OUT &= ~BIT6           //RW置低
 24 #define RW_1          P5OUT |=  BIT6           //RW置高
 25 
 26 #define EN_0         P5OUT &= ~BIT7           //E置低
 27 #define EN_1         P5OUT |=  BIT7           //E置高
 28 /*
 29  * 端口配置
 30  */
 31 void IO_Init(){
 32     P4SEL = 0x00;
 33     P4DIR = 0xFF;                   //数据口输出模式
 34     P5SEL = 0x00;
 35     P5DIR|= BIT5 + BIT6 + BIT7;     //控制口设置为输出模式
 36     P1DIR &=~BIT0;                   //P1端口设置为输入模式
 37     P1IES |=BIT0;                    //P1.0端口中断为下降沿触发
 38     P1IE |= BIT0;                     //P1.0端口中断打开
 39 }
 40 /**
 41  *  系统时钟初始化,外部8M晶振
 42  */
 43 void CLOCK_Init()
 44 {
 45   uchar i;
 46   BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
 47   BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
 48   do{
 49     IFG1&=~OFIFG;                   //清除振荡器错误标志
 50     for(i=0;i<100;i++)
 51        _NOP();
 52   }
 53   while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
 54   IFG1&=~OFIFG;
 55 }
 56 /**
 57  *显示屏命令写入函数
 58  */
 59 void LCD_write_com(unsigned char com)
 60 {
 61     RS_0;
 62     RW_0;
 63     DataPort = com;             //命令写入端口
 64     EN_1;
 65     delay_ms(5);
 66     EN_0;
 67     delay_ms(5);
 68 }
 69 /**
 70  * 显示屏数据写入函数
 71  */
 72 void LCD_write_data(unsigned char data)
 73 {
 74     RS_1;
 75     RW_0;
 76     DataPort = data;                //数据写入端口
 77     EN_1;
 78     delay_ms(5);
 79     EN_0;
 80     delay_ms(5);
 81 }
 82 
 83 /**
 84  * 显示屏初始化函数
 85  */
 86 void LCD_Init(void)
 87 {
 88     EN_0;
 89         LCD_write_com(0x38);          
 90         delay_ms(5);
 91         LCD_write_com(0x08);          
 92         delay_ms(5);
 93         LCD_write_com(0x01);         
 94         delay_ms(5);
 95         LCD_write_com(0x06);         
 96         delay_ms(5);
 97         LCD_write_com(0x0C);         
 98         delay_ms(5);
 99 
100 }
101 /*
102  * MSP430串口初始化
103  */
104 void UART_Init()
105 {
106   U0CTL|=SWRST;                        //复位SWRST,
107   P3SEL|= BIT4 + BIT5;                //设置IO口为第二功能模式,启用UART功能
108   ME1|=UTXE0;                         //UART0发送使能
109   ME1|=URXE0;                         //UART0接收使能
110   U0CTL|= CHAR;                       //8位数据模式
111   U0TCTL|=SSEL1;                      //SMCLK为串口时钟
112   U0BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
113   U0BR0=baud_l;                       //N=UBR+(UxMCTL)/8
114   U0MCTL=0x00;                        //微调寄存器为0,波特率9600bps
115   U0CTL&=~SWRST;
116   IE1|=URXIE0;                        //接收中断使能位
117 
118   P3DIR|= BIT4;                       //设置TXD0口方向为输出
119 }
120 /*
121  *  串口0发送数据函数
122  */
123 void Send_Byte(uchar data)
124 {
125   while(!(IFG1&UTXIFG0));          //发送寄存器空的时候发送数据
126   U0TXBUF=data;
127 }
128 /*
129  * 串口通信0中断服务程序
130  */
131 #pragma vector = USART0RX_VECTOR
132 __interrupt void UART0_RXISR(void)
133 {
134   uchar data = 0;
135   data = U0RXBUF;                       //接收到的数据存起来
136   LCD_write_com(0x80);
137   LCD_write_data(data);
138   Send_Byte(data);                    //将接收到的数据再发送出去
139 
140 }
141 
142 /**
143  * 主函数
144  */
145 void main(void)
146 {
147 
148     WDTCTL = WDTPW + WDTHOLD;        //关看门狗
149     IO_Init();
150     CLOCK_Init();                   //系统时钟设置
151     LCD_Init();                     //液晶参数初始化设置
152     UART_Init();
153     _EINT();                       //开启总中断
154     delay_ms(20);
155     while(1){
156     }
157 }

 

配置如图:

【人生没有白走的路,每一步都算数!】

posted @ 2018-10-09 20:01  xiaobingzzh  阅读(638)  评论(0)    收藏  举报