串行通信技术实验报告.docx
《串行通信技术实验报告.docx》由会员分享,可在线阅读,更多相关《串行通信技术实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
串行通信技术实验报告
串行通信技术实验报告
一、实验目的
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];
}
};
}