串行通信技术实验报告.docx

上传人:b****6 文档编号:6094672 上传时间:2023-01-03 格式:DOCX 页数:17 大小:553.82KB
下载 相关 举报
串行通信技术实验报告.docx_第1页
第1页 / 共17页
串行通信技术实验报告.docx_第2页
第2页 / 共17页
串行通信技术实验报告.docx_第3页
第3页 / 共17页
串行通信技术实验报告.docx_第4页
第4页 / 共17页
串行通信技术实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

串行通信技术实验报告.docx

《串行通信技术实验报告.docx》由会员分享,可在线阅读,更多相关《串行通信技术实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

串行通信技术实验报告.docx

串行通信技术实验报告

串行通信技术实验报告

一、实验目的

1.了解异步串行通信原理

2.掌握MSP430异步串行通信模块及其编程方法

 

二、必做实验任务

1.了解MSP430G2553实验板USB转串口的通信功能,掌握串口助手的使用

拆下单片机的功能拓展板,将主板上的eZ430-FET板载仿真器的BRXD,BTXD收发信号端口连接,通过串口调试助手即可实现串口的自发自收功能。

接线如下图:

思考:

异步串行通信接口的收/发双方是怎样建立起通信的?

答:

异步串行通信的收发双方进行通信,在硬件与软件方面都有要求。

1 在硬件方面需要两条线,分别从一方的发送端口到另一方的接收端口,从而实现“异步”;

2 需要一个通信协议,确保通信正确;

3 在这个实验中由于是自发自收,因此收发两方均为PC机,所以两条线其实是同一条线,而且由于是自发自收所以信号格式也是统一的,因此可以实现自发自收功能。

2.查询方式控制单片机通过板载USB转串口与PC机实现串行通信

本实验通过编程实现单片机和PC机之间的通信,信号格式为波特率9600bps,无校验,8位数据,先低后高,1个停止位,字符串以@结尾,单片机将接收到的字符保存在RAM中,收到@字符之后再将所储存的字符发给PC机。

连线方式如下图:

实验程序如下:

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

voidUSCIA0_int()

{

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为1.0MHz

if(CALBC1_1MHz!

=0xff)

{BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;}

//设置控制寄存器

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=104;

UCA0MCTL=UCBRS_1;

UCA0CTL1&=~UCSWRST;//swrst=0

}

While

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

}

}

思考:

如果在两个单片机之间进行串行通信,如何设计连线和编程?

答:

a.编程:

其中一个单片机可以继续采用本实验中所用的程序,另一个单片机则编程输出一串以@结尾的字符,之后进入接收状态,初始化及寄存器的设置部分的程序不变;

b.连线:

将一个单片机的P1.1、P1.2接口分别与另一个的P1.2、P1.1接口连接,控制两个单片机同时运行程序即可完成两个单片机之间的通信。

3.利用PC机RS232通信接口与单片机完成串行通信

编程采用下面数据格式,完成单片机与PC机之间的字符串传送。

1)波特率9600bps,奇校验,8位数据,先低后高,1个停止位;

本实验需要用到MSP430F149,进行PC机与单片机之间的电平信号转换。

连线如下图:

实验程序如下:

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

voidUSCIA0_int()

{

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为1.0MHz

if(CALBC1_1MHz!

=0xff)

{BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;}

//设置时钟源采用SMCLK,1MHz,波特率设置为9600,奇校验

UCA0CTL0|=UCPEN;

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=104;

UCA0MCTL=UCBRS_1;

UCA0CTL1&=~UCSWRST;//swrst=0

}

While

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

}

}

思考:

设计单片机与PC机进行串行通信时,硬件设计有哪些需要注意的事项?

答:

1 正确的连线;

2 统一的通信协议;

3 统一的逻辑电平;

4 选取合适的信号输出方式,如USB、串口、并口等

3、已完成的选做实验任务

2.查询方式控制单片机通过板载USB转串口与PC机实现串行通信

2)(选做)串口时钟选用外部晶振32.768KHz

本实验与1)的实验的差别有两点:

1 波特率发生器的时钟源选择外部晶振,接线上应注意接入外部晶振

2 波特率的设置应随着时钟源的改变而改变,

计算过程为:

时钟频率和需要的波特率的比值是32768/9600=3.413,采用低频波特率方式,置UCOS16=0,所以设UCA0BR1=0,UCA0BR0=3,0.41*8≈3,所以设UCBRS=3。

程序如下:

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

voidUSCIA0_int()

{

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//设置时钟源采用外部晶振,32768Hz,波特率设置为9600,无校验

UCA0CTL1|=UCSSEL_1+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=3;

UCA0MCTL=UCBRS_3;

UCA0CTL1&=~UCSWRST;//swrst=0

}

While

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

}

}

3.利用PC机RS232通信接口与单片机完成串行通信

2)(选做)波特率115200bps,偶校验,8位数据,先低后高,2个停止位。

本实验与1)中实验的差别主要在时钟源以及寄存器设置上:

1 选用时钟SMCLK;

2 相应的波特率设置随之改变,

计算过程:

时钟频率和需要的波特率的比值是12000000/115200=104.17,采用过采样波特率方式,置UCOS16=1,因为104.17/16=6.51所以设UCA0BR1=0,UCA0BR0=6,0.51*16≈8,所以设UCBRF=8。

3 USCI_A0串口寄存器中,设置偶校验,2个停止位

程序如下:

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

voidUSCIA0_int()

{

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为12.0MHz

if(CALBC1_12MHz!

=0xff)

{BCSCTL1=CALBC1_12MHZ;

DCOCTL=CALDCO_12MHZ;}

//设置时钟源采用SMCLK,12MHz,波特率设置为115200,偶校验,2个停止位

UCA0CTL0|=UCPEN+UCPAR+UCSPB;

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用过采样波特率方式

UCA0BR1=0;

UCA0BR0=6;

UCA0MCTL=UCBRF_8+UCBRS_0+UCOS16;

UCA0CTL1&=~UCSWRST;//swrst=0

}

While

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

}

}

4.(选做)中断方式控制串行通信的收发

编程:

采用中断方式接收和发送完成任务2的内容。

1)串口时钟选用SMCLK=1.0MHz

2)(选做)串口时钟选用外部晶振32.768KHz

答:

与实验2相比,本实验的不同在于:

1 采用中断方式;

2 寄存器相关设置不同;

1)程序如下:

#include"io430.h"

#include"in430.h"

voidUSCIA0_init();

voidClock_int();

unsignedcharstring[];

unsignedintj,i;

intmain(void)

{WDTCTL=WDTPW+WDTHOLD;

Clock_int();//时钟初始化

USCIA0_init();//串口初始化

IE2|=UCA0RXIE;//开串口接收中断允许

_EINT();//开总中断

while

(1);

}

#pragmavector=USCIAB0RX_VECTOR

__interruptvoidUCA0RX_isr()

{string[j]=UCA0RXBUF;//将接收到的数据存至存储器

j++;

if(string[j]=='@')

{IE2&=~UCA0RXIE;//关闭串口0接收中断允许

IE2|=UCA0TXIE;

i=j;}

}

#pragmavector=USCIAB0TX_VECTOR

__interruptvoidUCA0TX_isr()

{UCA0TXBUF=string[j];//将接收到的数据存至存储器

j++;

if(j==i)IE2&=~UCA0TXIE;//关闭串口发送中断允许

}

voidUSCIA0_init(){

UCA0CTL1|=UCSWRST;//swrst=1

//置P1.1P1.2为USCI_A0的收/发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟选择SMCLK,不论数据对均收

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器

UCA0BR1=0;

UCA0BR0=104;

UCA0MCTL=UCBRS_1;

UCA0CTL1&=~UCSWRST;//swrst=0

}

voidClock_int()

{

BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;

}

2)程序如下:

#include"io430.h"

#include"in430.h"

voidUSCIA0_init();

unsignedcharstring[];

unsignedintj,i;

intmain(void)

{WDTCTL=WDTPW+WDTHOLD;

USCIA0_init();//串口初始化

IE2|=UCA0RXIE;//开串口接收中断允许

_EINT();//开总中断

while

(1);

}

#pragmavector=USCIAB0RX_VECTOR

__interruptvoidUCA0RX_isr()

{string[j]=UCA0RXBUF;//将接收到的数据存至存储器

j++;

if(string[j]=='@')

{IE2&=~UCA0RXIE;//关闭串口0接收中断允许

IE2|=UCA0TXIE;

i=j;}

}

#pragmavector=USCIAB0TX_VECTOR

__interruptvoidUCA0TX_isr()

{UCA0TXBUF=string[j];//将接收到的数据存至存储器

j++;

if(j==i)IE2&=~UCA0TXIE;//关闭串口发送中断允许

}

voidUSCIA0_init(){

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//设置时钟源采用外部晶振,32768Hz,波特率设置为9600,无校验

UCA0CTL1|=UCSSEL_1+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=3;

UCA0MCTL=UCBRS_3;

UCA0CTL1&=~UCSWRST;//swrst=0

}

2-1

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为1.0MHz

BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;

//设置控制寄存器

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=104;

UCA0MCTL=UCBRS_1;

UCA0CTL1&=~UCSWRST;//swrst=0

while

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

}

}

2-2

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

//USCI_A0初始化

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//设置时钟源采用外部晶振,32768Hz,波特率设置为9600,无校验

UCA0CTL1|=UCSSEL_1+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=3;

UCA0MCTL=UCBRS_3;

UCA0CTL1&=~UCSWRST;//swrst=0

//初始化结束

while

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

};

}

3-1

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为1.0MHz

BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;

//设置时钟源采用SMCLK,1MHz,波特率设置为9600,奇校验

UCA0CTL0|=UCPEN;

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用低频波特率方式

UCA0BR1=0;

UCA0BR0=104;

UCA0MCTL=UCBRS_1;

UCA0CTL1&=~UCSWRST;//swrst=0

while

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

};

}

3-2

#include"io430.h"

unsignedcharstring[];

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

UCA0CTL1|=UCSWRST;//swrst=1;

//置P1.1、P1.2为USCI_A0的收发引脚

P1SEL|=BIT1+BIT2;

P1SEL2|=BIT1+BIT2;

//时钟SMCLK选择为12.0MHz

BCSCTL1=CALBC1_12MHZ;

DCOCTL=CALDCO_12MHZ;

//设置时钟源采用SMCLK,12MHz,波特率设置为115200,偶校验,2个停止位

UCA0CTL0|=UCPEN+UCPAR+UCSPB;

UCA0CTL1|=UCSSEL_2+UCRXEIE;

//设置波特率寄存器,采用过采样波特率方式

UCA0BR1=0;

UCA0BR0=6;

UCA0MCTL=UCBRF_8+UCBRS_0+UCOS16;

UCA0CTL1&=~UCSWRST;//swrst=0

while

(1)

{

unsignedintj;

for(j=0;string[j]!

='@';j++)

{

while((IFG2&UCA0RXIFG)==0);

string[j]=UCA0RXBUF;

}

unsignedi=j;

for(j=0;j!

=i+1;j++)

{

while((IFG2&UCA0TXIFG)==0);

UCA0TXBUF=string[j];

}

};

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1