串行通信技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; //当接收完@的时候,跳出循环

}

相关文档
最新文档