单片机串口通信设计报告

  • 格式: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;

}