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 }
配置如图:

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

浙公网安备 33010602011771号