实验6.串行通信技术一、实验目的1.了解异步串行通信原理;2. 2.掌握MSP430异步串行通信模块及其编程方法。
二、实验任务1.PC机上的串行通信接口及其控制程序的使用参看讲义,了解PC机的标准异步串行接口协议,用孔孔交叉线连接两台PC机的串口,利用“串口调试助手程序”控制PC机串口,实现两台PC机之间字符串的传送。
2.掌握单片机与PC机串行通信的硬件连接参看附录A实验板原理图,了解MSP430F1XX串口模块相关引脚和实验板串口接线(插座S3:P3.4-UTXD0,P3.5-URXD0,P3.6-UTXD1,P3.7-URXD1),及其经RS-232电平转换后的信号(插针P7:TXD0,RXD0)。
思考:设计单片与PC机进行串行通信时,硬件设计有哪些需要注意的事项?(1)注意进行电平转换(2)注意USART0与电脑进行串行通信时要将2、3与电脑串口的2、3进行交叉连接3.查询方式控制串行通信的收发,在实验板上设计接线,编程实现接收PC机的串口发送来的字符串,字符串以字符@结尾,MCU将接收到的字符串保存在RAM中,接收到字符@后,MCU开始将接收到的字符串发给PC机,PC机侧用串口助手程序接收并显示收到的字符串。
(建议单片机串口时钟选择ACLK=32.768KHz,波特率9600bps).用USART0与电脑串口进行通信时的程序如下:#include "io430.h"char string[]; //声明一个没有长度的数组变量int i,j; //声明两个全局整型变量void USART0_int(){U0CTL_bit.SWRST=1; //设置SWRST=1P3SEL_bit.P4=1; //设置P3.4为UTXD0P3SEL_bit.P5=1; //设置P3.5为URXD0U0CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶校验、2位停止位U0TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为ACLKU0TCTL_bit.SSEL1=0;U0RCTL_bit.URXEIE=1; //接收到数据无论对错,都存入U0RXBUF,并置位URXIFGxU0BR0=0X03; //波特率设置U0BR1=0;U0MCTL=0X91;ME1_bit.UTXE0=1; //使能发送模块ME1_bit.URXE0=1; //使能接收模块U0CTL_bit.SWRST=0; //设置SERST=0}void delaytimes(unsigned int i) //声明并定义一个延时函数{unsigned char j;while(i--){for(j=0;j<125;j++){;}}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;while(1){USART0_int(); //串口初始化for(i=0;;i++) //一个没有上限的循环{while(IFG1_bit.URXIFG0==0); //检测接收缓冲器是否为空string[i]=U0RXBUF; //接收一个字符并保存if(U0RXBUF=='@') break; //当接收完@的时候,跳出循环}for(j=0;;j++) //定义一个没有上限的循环{while(IFG1_bit.UTXIFG0==0); //检测发送缓冲寄存器是否为空U0TXBUF=string[j]; //取一个字符发送delaytimes(1); //延时,保证空闲为有足够长度if(U0TXBUF=='@') break; //当发送完@的时候,跳出循环}}}思考:1)如果采用单片机的串口1完成,如何设计实验连线,程序该如何修改?接线如下:用串口1进行通信的程序如下:#include "io430.h"#include "io430.h"char string[];int i,j;void USART1_int(){U1CTL_bit.SWRST=1; //设置SWRST=1P3SEL_bit.P6=1; //设置P3.6为UTXD1P3SEL_bit.P7=1; //设置P3.7为URXD1U1CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶校验、2位停止位U1TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为ACLKU1TCTL_bit.SSEL1=0;U1RCTL_bit.URXEIE=1; //收到数据无论对错,都存入U1RXBUF,并置位U1BR0=0X03; //波特率设置U1BR1=0X00;U1MCTL=0X54;ME2_bit.UTXE1=1; //使能发送模块ME2_bit.URXE1=1; //使能接收模块U1CTL_bit.SWRST=0; //设置SERST=0}void delaytimes(unsigned int i) //声明并定义一个延时函数{unsigned char j;while(i--){for(j=0;j<125;j++){;}}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;while(1){USART1_int(); //串口初始化for(i=0;;i++) //一个没有上限的循环{while(IFG2_bit.URXIFG1==0); //检测接收缓冲器是否为空string[i]=U1RXBUF; //接收一个字符并保存if(U1RXBUF=='@') break; //当接收完@的时候,跳出循环}for(j=0;;j++) //定义一个没有上限的循环{while(IFG2_bit.UTXIFG1==0); //检测发送缓冲寄存器是否为空U1TXBUF=string[j]; //取一个字符发送delaytimes(1); //延时,保证空闲为有足够长度if(U1TXBUF=='@') break; //当发送完@的时候,跳出循环}}}2)如果两个单片机进行串行通信,如何设计连线和编程?如果改为两个单片机进行串行通信,程序与单片机与电脑之间的串行通信一致,但在连线上有所差别。
以串口0通信为例。
单片机1的P3.4接单片机2的P3.5,而单片机1的P3.5接单片机2的P3.4脚接线如下:3)如果波特率改为2400bps,如何编程完成?波特率改为38400bps呢?以下程序中,涂黄颜色部分,表示修改部分○1波特率改为2400bps#include "io430.h"char string[];int i,j;void USART0_int(){U0CTL_bit.SWRST=1; //设置SWRST=1P3SEL_bit.P4=1; //设置P3.4为UTXD0P3SEL_bit.P5=1; //设置P3.5为URXD0U0CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶校验、2位停止位U0TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为ACLKU0TCTL_bit.SSEL1=0;U0RCTL_bit.URXEIE=1; //接收到数据无论对错,都存入U0RXBUF,并置位位URXIFGxU0BR0=0X0d; //波特率设置U0BR1=0;U0MCTL=0Xaa;ME1_bit.UTXE0=1; //使能发送模块ME1_bit.URXE0=1; //使能接收模块U0CTL_bit.SWRST=0; //设置SERST=0}void delaytimes(unsigned int i) //声明并定义一个延时函数{unsigned char j;while(i--){for(j=0;j<125;j++){;}}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;while(1){USART0_int(); //串口初始化for(i=0;;i++) //一个没有上限的循环{while(IFG1_bit.URXIFG0==0); //检测接收缓冲器是否为空string[i]=U0RXBUF; //接收一个字符并保存if(U0RXBUF=='@') break; //当接收完@的时候,跳出循环}for(j=0;;j++) //定义一个没有上限的循环{while(IFG1_bit.UTXIFG0==0); //检测发送缓冲寄存器是否为空U0TXBUF=string[j]; //取一个字符发送delaytimes(10); //延时,保证空闲为有足够长度if(U0TXBUF=='@') break; //当发送完@的时候,跳出循环}}}○2波特率改为38400bps#include "io430.h"char string[];int i,j;void USART0_int(){U0CTL_bit.SWRST=1; //设置SWRST=1P3SEL_bit.P4=1; //设置P3.4为UTXD0P3SEL_bit.P5=1; //设置P3.5为URXD0U0CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶校验、2位停止位U0TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为SMCLKU0TCTL_bit.SSEL1=1;U0RCTL_bit.URXEIE=1; //接收到数据无论对错,都存入U0RXBUF,并置位位URXIFGxU0BR0=0X13; //波特率设置U0BR1=0;U0MCTL=0X04;ME1_bit.UTXE0=1; //使能发送模块ME1_bit.URXE0=1; //使能接收模块U0CTL_bit.SWRST=0; //设置SERST=0}void delaytimes(unsigned int i) //声明并定义一个延时函数{unsigned char j;while(i--){for(j=0;j<125;j++){;}}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;while(1){USART0_int(); //串口初始化for(i=0;;i++) //一个没有上限的循环{while(IFG1_bit.URXIFG0==0); //检测接收缓冲器是否为空string[i]=U0RXBUF; //接收一个字符并保存if(U0RXBUF=='@') break; //当接收完@的时候,跳出循环}for(j=0;;j++) //定义一个没有上限的循环{while(IFG1_bit.UTXIFG0==0); //检测发送缓冲寄存器是否为空U0TXBUF=string[j]; //取一个字符发送delaytimes(1); //延时,保证空闲为有足够长度if(U0TXBUF=='@') break; //当发送完@的时候,跳出循环}}}三、已完成的选作实验任务4.中断方式控制串行通信的收发编程:采用中断方式接受和发送完成任务3的内容。