单片机串口通信设计报告
- 格式:doc
- 大小:54.00 KB
- 文档页数:5
单片机串口通信设计报告
一、实验目的
将单片机IO口状态通过串口发送至PC机,PC上位机程序使用串口调试助手或自行编程。
二、串口通信方式
串口通信分为两种:串行同步通信、串行异步通信
本实验采用串行异步通信,即RS232通信。在异步通行中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
数据传输特点:从低位开始发送到高位(起始位一般是1位的低电平开始的,接着的是数据位5-10位,一般是8位,接下来是奇偶校验位1位,停止位1-2位,空闲位)
帧格式图
0D0D1D2D3D4D5D6D7P1110D0…起始位数据位奇偶校验位停止位空闲位起始位数据位
硬件原理图
三、相关寄存器
1、串行接口控制寄存器SCON
用于选择串行通信的工作方式和某些控制功能。
(1)、SM0 SM1:串行口工作方式控制位
SM0、SM1工作方式 :00方式0 ;01方式1;10方式2;11方式3。
(2)、SM2:多机通信控制位
多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。工作于方式0时,SM2必须为0。
(3)、REN:允许接收位 SBUF(99H)SBUF(99H)门发送控制器TI接收控制器RI移位寄存器波特率发生器T1串行控制寄存器(98H)串行口中断内部CPU总线发送缓冲器接收缓冲器P3.1(TXD)P3.2(RXD)SM0SM1SM2RENTB8RB8TIRID0D1D2D3D4D5D6D7SCON: 可位寻址字节地址:98HREN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4)、TB8:发送接收数据位8
在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5)、RB8:接收数据位8
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6)、TI:发送中断标志位
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
(7)、RI:接收中断标志位
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。在串口中断处理时,TI,RI都需要软件清"0",硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
2、波特率选择寄存器PCON
用于波特率的倍增控制,可位寻址。
SMOD:串行口波特率倍增位
当SMOD=1时,串行口波特率加倍,系统复位默认SMOD=0。该位与串口通信有关。SMOD=0:串口方式1,2,3时,波特率正常。SMOD=1:串口方式1,2,3时,波特率加倍。
GF1、GF0:两个通用工作标志位,用户可以自由使用。
PD:掉电模式设定位 SMOD---GF1GF0PDIDLD0D1D2D3D4D5D6D7PCON: 不可位寻址字节地址:87HPD=0单片机处于正常工作状态。
PD=1单片机进入掉电(Power Down)模式 ,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。
IDL:空闲模式设定位
IDL=0 单片机处于正常工作状态。
IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
四、波特率计算
1、串行工作模式0的波特率:模式0波特率=fosc/12
2、串行工作模式1的波特率:模式1波特率=T1溢出率·2SMOD/32
3、串行工作模式2的波特率:模式2波特率= fosc·2SMOD/64
4、串行工作模式3的波特率:模式3波特率=T1溢出率·2SMOD/32
五、程序设计
1、串口初始化
在11.0952晶振下,选择串口工作模式1,设定9600bps波特率。
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
2、中断接收处理
…… Unsigned char ReceiveData;
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
ReceiveData = SBUF;
}
else
TI = 0;
}
3、发送一个字节
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}