串行通信技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验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=1
P3SEL_bit.P4=1; //设置P3.4为UTXD0
P3SEL_bit.P5=1; //设置P3.5为URXD0
U0CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶
校验、2位停止位
U0TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为ACLK
U0TCTL_bit.SSEL1=0;
U0RCTL_bit.URXEIE=1; //接收到数据无论对错,都存入U0RXBUF,并置位URXIFGx
U0BR0=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 reset
WDTCTL = 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=1
P3SEL_bit.P6=1; //设置P3.6为UTXD1
P3SEL_bit.P7=1; //设置P3.7为URXD1
U1CTL|=PENA+PEV+SPB+CHAR; //设置异步串行通信方式的协议为数据8位、偶校验、2位停止位
U1TCTL_bit.SSEL0=1; //波特率发生器时钟来源选择为ACLK
U1TCTL_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 reset
WDTCTL = WDTPW + WDTHOLD;
while(1)
{
USART1_int(); //串口初始化
for(i=0;;i++) //一个没有上限的循环
{
while(IFG2_bit.URXIFG1==0); //检测接收缓冲器是否为空
string[i]=U1RXBUF; //接收一个字符并保存
if(U1RXBUF=='@') break; //当接收完@的时候,跳出循环
}