串口通信实验分析.docx
《串口通信实验分析.docx》由会员分享,可在线阅读,更多相关《串口通信实验分析.docx(14页珍藏版)》请在冰点文库上搜索。
串口通信实验分析
课程名称:
Zigbee技术及应用实验项目:
串口通信实验指导教师:
专业班级:
姓名:
学号:
成绩:
一、实验目的:
(1)认识串口通信的概念;
(2)学习单片机串口通信的开发过程;
(3)编写程序,使单片机与PC通过串口进行通信。
二、实验过程:
(1)根据实验目的分析实验原理;
(2)根据实验原理编写C程序;
(3)编译下载C程序,并在实验箱上观察实验结果。
三、实验原理:
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干条控制信号线。
因为一次只能传送一位,所以对于一个字节的数据,至少要分8位才能传送完毕,如图3-1所示。
图2-1串行通信过程
串行通信制式:
(1)单工制式
这种制式是指甲乙双方通信时只能单向传送数据,发送方和接收方固定。
(2)半双工制式
这种制式是指通信双方都具有发送器和接收器,即可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送。
(3)全双工制式
这种制式是指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,因此全双工制式可实现甲乙双方同时发送和接收数据,发送时能接收,接收时能发送。
三种制式分别如图3-2所示
图3-2串行通信制式
3.1硬件设计原理
CC2530有两个串行通信接口USART0和USART1,两个USART具有同样的功能,可已分别运行于UART模式和同步SPI模式。
CC2530的两个串行通信接口引脚图分布如表3-1所示
表3-1CC2530串行通信口引脚图分布
本实验CC2530模块使用的是USART1的位置2,P1_6和P1_7。
3.2程序设计原理
串口通信程序流程图如图3-3所示
图3-3程序设计流程图
(1)寄存器的配置
P1SEL寄存器,P1_0-P1_7功能选择,0:
通用I/O1:
外设
本实验需配置P1_6和P1_7为外设,P1SEL|=0xC0。
位
名称
复位
R/W
描述
7:
0
SELP1_[7:
0]
0x00
R/W
P1.7到P1.0功能选择
0:
通用I/O
1:
外围函数
U1CSR寄存器,USART1控制和状态
本实验使用UART模式,U1CSR|=0x80。
位
名称
复位
R/W
描述
7
MODE
0
R/W
USART模式选择
0:
SPI模式
1:
UART模式
6
RE
0
R/W
UART接收器使能。
注意在UART完全配置之前不使能接收。
0:
禁用接收器
1:
接收器使能
5
SLAVE
0
R/W
SPI主或者从模式选择
0:
SPI主模式
1:
SPI从模式
4
FE
0
R/W0
UART帧错误状态
0:
无帧错误检测
1:
字节收到不正确停止位级别
3
ERR
0
R/W0
UART奇偶错误状态
0:
无奇偶错误检测
1:
字节收到奇偶错误
2
RX_BYTE
0
R/W0
接收字节状态。
URAT模式和SPI从模式。
当读U0DBUF该位 自动清除,通过写0清除它,这样有效丢弃U0DBUF中的数据。
0:
没有收到字节
1:
准备好接收字节
1
TX_BYTE
0
R/W0
传送字节状态。
URAT模式和SPI主模式
0:
字节没有被传送
1:
写到数据缓存寄存器的最后字节被传送
0
ACTIVE
0
R
USART传送/接收主动状态、在SPI从模式下该位等于从模式选择。
0:
USART空闲
1:
在传送或者接收模式USART忙碌
U1UCR寄存器,USART1控制
(2)本实验配置UART:
无硬件流控制,无奇偶校验,8位数据位,1位停止位,所以,U1UCR应配置为0x00
因单片机复位,U1UCR全部为0,所以U1UCR寄存器应保持默认,无需配置。
位
名称
复位
R/W
描述
7
FLUSH
0
R0/W1
清除单元。
当设置时,该事件将会立即停止当前操作并且返回单元的空闲状态。
6
FLOW
0
R/W
UART硬件流使能。
用RTS和CTS引脚选择硬件流控制的使用。
0:
流控制禁止
1:
流控制使能
5
D9
0
R/W
UART奇偶校验位。
当使能奇偶校验,写入D9的值决定发送的第9位的值,如果收
到的第9位不匹配收到字节的奇偶校验,接收时报告ERR。
如果奇偶校验使能,那么该位设置以下奇偶校验级别。
0:
奇校验
1:
偶校验
4
BIT9
0
R/W
UART9位数据使能。
当该位是1时,使能奇偶校验位传输(即第9位)。
如果通过
PARITY使能奇偶校验,第9位的内容是通过D9给出的。
0:
8位传送
1:
9位传送
3
PARITY
0
R/W
UART奇偶校验使能。
除了为奇偶校验设置该位用于计算,必须使能9位模式。
0:
禁用奇偶校验
1:
奇偶校验使能
2
SPB
0
R/W
UART停止位的位数。
选择要传送的停止位的位数
0:
1位停止位
1:
2位停止位
1
STOP
1
R/W
UART停止位的电平必须不同于开始位的电平
0:
停止位低电平
1:
停止位高电平
0
START
0
R/W
UART起始位电平。
闲置线的极性采用选择的起始位级别的电平的相反的电平。
0:
起始位低电平
1:
起始位高电平
(3)波特率设置
当运行在UART模式时,内部的波特率发生器设置UART波特率。
当运行在SPI模式时,内部的波特率发
生器设置SPI主时钟频率。
由寄存器UxBAUD.BAUD_M[7:
0]和UxGCR.BAUD_E[4:
0]定义波特率。
该波特率用于UART传送,也用于SPI传送的串行时钟速率。
波特率由下式给出:
(3-1)
(式3-1中:
F是系统时钟频率,等于16MHzRCOSC或者32MHzXOSC。
)
表3-232MHz系统时钟常见的波特率设置
波特率(bps)
UxBAUD.BAUD_M
UxGCR.BAUD_E
误差(%)
2400
59
6
0.14
4800
59
7
0.14
9600
59
8
0.14
14400
216
8
0.03
19200
59
9
0.14
28800
216
9
0.03
38400
59
10
0.14
57600
216
10
0.03
76800
59
11
0.14
115200
216
11
0.03
230400
216
12
0.03
本实验设置的波特率为57600,U1GCR|=10,U1BAUD|=216
四、实验步骤和实验结果
1.硬件配置:
(1)实验设备:
CC2530核心板一块;传感器底板一个;仿真器一个;方口USB线一根;USB转TTL模块一个;杜邦线三根。
2.实验步骤:
步骤一:
编写串口收发程序,编译无误。
步骤二:
将CC2530模块(CC2530核心板与传感器底板,简称CC2530模块)与仿真器连接,仿真器用USB连接线与电脑进行连接。
步骤三:
点击IAR软件中的DownloadandDebug按钮进行编译下载。
步骤四:
然后单击调试工具栏中的GO按钮。
步骤五:
CC2530模块与USB转TTL模块连接,将USB转TTL模块插入PC的USB口。
3.程序及现象:
1)实验程序:
#include
charstr[]="MICROSECUSARTTEST!
\n";
/***********************************
*@fnClock_Init
*@brief初始化系统时钟.
*@paramNone
*@returnNone
**********************************/
voidClock_Init(void)
{
CLKCONCMD&=~0x40;//选择32MHz晶振
while(!
(SLEEPSTA&0x40));//等待晶振稳定
CLKCONCMD&=~0x47;//TICHSPD128分频,CLKSPD不分频
SLEEPCMD|=0x04;//关闭不用的RC振荡器
}
/***********************************
*@fnUART1_Init
*@briefUART1初始化.
*@paramNone
*@returnNone
**********************************/
voidUART1_Init(void)
{
PERCFG=0x73;//使用串口备用位置2P1口
P1SEL|=0xC0;//P1_6P1_7用作串口
P2DIR=0x40;//选择串口1优先作为串口
U1CSR|=0x80;//UART方式
U1BAUD|=216;//波特率57600
U1GCR=10;
UTX1IF=1;//串口1TX中断标志位置1
U1CSR|=0x40;//允许接收
URX1IE=1;//开串口接收中断'URX1IE=1'
IEN0|=0x84;//开总中断
}
/***********************************
*@fnUART1_Send_String
*@briefUART1初始化.
*@param*Data,len
*@returnNone
**********************************/
voidUART1_Send_String(char*Data,intlen)
{
intj;
for(j=0;j{
U1DBUF=*Data++;
while(UTX1IF==0);
UTX1IF=0;
}
}
/***********************************
*@fnmain
*@brief主函数.
*@paramNone
*@returnNone
**********************************/
voidmain(void)
{
Clock_Init();//系统时钟初始化
UART1_Init();//串口1初始化
UART1_Send_String(str,21);//发送一个字符串
while
(1)//等待中断的到来
{
}
}
/***********************************
*@fnUART1_IRQ
*@brief串口接收中断服务函数.
*@paramNone
*@returnNone
**********************************/
#pragmavector=URX1_VECTOR
__interruptvoidUART1_IRQ(void)
{
chardata;
IEN0&=~0x40;//关串口接收中断'URX1IE=0'
data=U1DBUF;//将接收的字节从U1DBUF取出来
U1DBUF=data;//将取出来的字节放入U1DBUF发送出去
while(UTX1IF==0)//等待发送完成
UTX1IF=0;
IEN0|=0x08;//开串口接收中断'URX1IE=1'
}
2)实验现象:
将程序编译完成,烧入CC2530模块。
PC端发送hello,单片机将hello返回给PC,并显示在串口调试助手的接收窗中如图3-4所示。
图3-4串口功能调试
五、实验总结
在本次实验中,我认真了解了串口通信的概念,学了单片机串口通信的开发过程编写程序,使单片机与PC通过串口进行通信。
在本次实验过程中,因连接问题导致实验失败,最终在老师和同学的帮助下完成了此次实验,感觉本次实验收获极多。