串行通信技术-模拟信号转换接口.docx
- 文档编号:2488743
- 上传时间:2022-10-30
- 格式:DOCX
- 页数:15
- 大小:400.86KB
串行通信技术-模拟信号转换接口.docx
《串行通信技术-模拟信号转换接口.docx》由会员分享,可在线阅读,更多相关《串行通信技术-模拟信号转换接口.docx(15页珍藏版)》请在冰豆网上搜索。
微机原理与应用实验报告6
实验9 串行通信技术
实验10A 模拟信号转换接口
实验报告
实验九串行通信技术
一、实验目的
1.了解异步串行通信原理;
2.掌握MSP430异步串行通信模块及其编程方法;
二、实验任务
1.了解MSP430G2553实验板USB转串口的通信功能,掌握串口助手的使用
(1)利用PC机的串口助手程序控制串口,实现串口的自发自收功能
为实现PC串口的自发自收功能,须现将实验板上的扩展板去下,并将单片机板上的BRXD和BTXD用杜邦线进行短接,连接图如下所示:
由此可以实现PC串口的自收自发功能。
(2)思考题:
异步串行通信接口的收/发双方是怎么建立起通信的
首先在异步通信中,要求接收方和发送方具有相同的通信参数,即起始位、停止位、波特率等等。
在满足上面条件的情况下,发送方对于每一帧数据按照起始位数据位停止位的顺序进行发送,而接收方则一直处于接受状态,当检测到起始位低电平时,看是采集接下来发送方发送过来的数据,这样一帧数据(即一个字符)传送完毕,然后进行下一帧数据的接受。
这样两者之间就建立起了通信。
2.查询方式控制单片机通过板载USB转串口与PC机实现串行通信
(1)硬件连接图
(2)C语言程序
采用SMCLK=1.0MHz时,程序如下:
#include"io430.h"
#include"in430.h"
unsignedinti,j,done,count;
charstring[32];
voidUSCIA0_int();
voidCLOCK_int();
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
USCIA0_int();//通信设置
CLOCK_int();//时钟设置
while
(1)
{
done=0;
count=0;
for(i=0;i<32;i++)
{
while((IFG2&UCA0RXIFG)==0);//循环等待接受缓冲器满
string[i]=UCA0RXBUF;//读接受缓冲器并保存
if(string[i]=='@')//检测发送完毕信号@
{
done=1;//接受完毕信号
break;
}
}
count=i;
if(done==1)//检测接受完毕信号
{
for(j=0;j<=count;j++)
{
while((IFG2&UCA0TXIFG)==0);
UCA0TXBUF=string[j];
}
done=0;
}
}
}
voidUSCIA0_int()
{
UCA0CTL1|=UCSWRST;
P1SEL|=BIT1+BIT2;
P1SEL2|=BIT1+BIT2;//端口设置
UCA0CTL1|=UCSSEL_2+UCRXEIE;//时钟选择设置(SMCLK)
UCA0BR1=0;UCA0BR0=104;
UCA0MCTL=UCBRS_1;//波特率设置
UCA0CTL1&=~UCSWRST;
}
voidCLOCK_int()
{
if(CALBC1_1MHZ!
=0xff)//设置时钟为1MHz
{
BCSCTL1=CALBC1_1MHZ;//采用smclk1MHZ
DCOCTL=CALDCO_1MHZ;
}
}
其中SMCLK=1MHz,波特率采用的是9600,采用低频波特方式,则N=1000000/9600=104.1666…,故UCA0BR1=0,UCA0BR0=104,UCBRS=1;
当采用外部晶振时,时钟采用默认设置即可,程序如下:
#include"io430.h"
#include"in430.h"
unsignedinti,j,done,count;
charstring[32];
voidUSCIA0_int();
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
USCIA0_int();//通信设置
while
(1)
{
done=0;
count=0;
for(i=0;i<32;i++)
{
while((IFG2&UCA0RXIFG)==0);//循环等待接受缓冲器满
string[i]=UCA0RXBUF;//读接受缓冲器并保存
if(string[i]=='@')//检测发送完毕信号@
{
done=1;//接受完毕信号
break;
}
}
count=i;
if(done==1)//检测接受完毕信号
{
for(j=0;j<=count;j++)
{
while((IFG2&UCA0TXIFG)==0);
UCA0TXBUF=string[j];
}
done=0;
}
}
}
voidUSCIA0_int()
{
UCA0CTL1|=UCSWRST;
P1SEL|=BIT1+BIT2;
P1SEL2|=BIT1+BIT2;//端口设置
UCA0CTL1|=UCSSEL_1+UCRXEIE;//时钟选择设置(SMCLK)
UCA0BR1=0;UCA0BR0=3;
UCA0MCTL=UCBRS_3;//波特率设置
UCA0CTL1&=~UCSWRST;
}
也是采用了低频波特率方式,所以关于波特率设置的相关计算和上面是一样的。
(3)思考:
如果在两个单片机之间进行串行通信,应该如何设计连线和编程?
由于在上面的连线中将单片机上的P1.2和BRXD相连,P1.1和BTXD相连,所以若要在两个单片机之间进行通信,首先应该将两个单片机的P1.2和P1.1交叉相连,并根据上面的程序进行相同的关于端口和波特率相关的设置即可实现两个单片机之间的通信。
3.(提高)利用PC机RS232通信接口与单片机之间完成串行通信
(1)硬件连接图
在实验时,采用了将PC机的串口com1直接连接至MSP430F149的孔型D9连接器上,G2553单片机的输出引脚P1.1和P1.2分别与F149单片机上的URXD1和UTXD1相连接,连接图如下所示:
(2)C语言程序
当采用波特率9600bps、无校验、8位数据位、先低后高、一个停止位时,所采用的程序和任务2中相同,这里不再赘述。
当采用波特率38400bps、无校验、8位数据位、先低后高、一个停止位时,由于采用外部晶振已经不能够产生这样高的波特率,所以采用SMCK=1MHz的时钟,所采用的程序只需将任务二中关于时钟选择和时钟设置的相关部分进行修改即可,具体程序见下面所示:
#include"io430.h"
#include"in430.h"
unsignedinti,j,done,count;
charstring[32];
voidUSCIA0_int();
voidCLOCK_int();
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
USCIA0_int();
CLOCK_int();
while
(1)
{
done=0;
count=0;
for(i=0;i<32;i++)
{
while((IFG2&UCA0RXIFG)==0);//循环等待接受缓冲器满
string[i]=UCA0RXBUF;//读接受缓冲器并保存
if(string[i]=='@')//检测发送完毕信号@
{
done=1;//接受完毕信号
break;
}
}
count=i;
if(done==1)//检测接受完毕信号
{
for(j=0;j { while((IFG2&UCA0TXIFG)==0); UCA0TXBUF=string[j]; } done=0; } } } voidUSCIA0_int() { UCA0CTL1|=UCSWRST; P1SEL|=BIT1+BIT2; P1SEL2|=BIT1+BIT2;//端口设置 UCA0CTL1|=UCSSEL_2+UCRXEIE;//时钟选择设置 UCA0BR1=0;UCA0BR0=1;//波特率设置 UCA0MCTL=UCBRF_10+UCBRS_0+UCOS16; UCA0CTL1&=~UCSWRST; } voidCLOCK_int() { if(CALBC1_1MHZ! =0xff) { BCSCTL1=CALBC1_1MHZ;//采用smclk1MHZ DCOCTL=CALDCO_1MHZ; } } (3)思考题: 设计单片机与PC机进行串行通信时,硬件设计有哪些需要注意的事项? 首先最基本的是,单片机和PC机上所选择的通信协议应该是一致的,然后可以选择多种路径,其中包括USB,串口等。 另外需要注意的是要统一两者
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串行 通信 技术 模拟 信号 转换 接口
![提示](https://static.bdocx.com/images/bang_tan.gif)