首页 理论教育8051系列单片机与PC通信教程

8051系列单片机与PC通信教程

【摘要】:由于单片机的显示和存储功能有限,因而与PC通信是非常必要的。对一些复杂的控制系统,需要以局部单片机组成一套控制网。通信波特率8051串行接口组成的通信系统是一种异步通信系统,即通信双方在发送与接收时,只靠通信双方的软件控制同步。RI接收结束标志。一般对单片机的数据通信要求不很高,用串行接口即可达到,一般为2400~9600bit/s。

1.8051系列机串行接口介绍

(1)串行接口的特色

8051系列单片机具有一个全双工串行接口,即P3.0(RxD)串行接收和P3.1(TxD)串行发送。所谓全双工是指发送和接收可以同时进行,半双工是指可以发送和接收,但不能同时进行,“单工”即只能发送或接收一种功能。利用串行接口可以在单片机之间进行通信,也可以与PC上位机进行通信。由于单片机的显示和存储功能有限,因而与PC通信是非常必要的。对一些复杂的控制系统,需要以局部单片机组成一套控制网。例如,汽车控制系统就是一种网络化的综合控制系统。利用串行接口将主MCU与各分MCU组成一套复杂的系统。串行接口的最重要功能就是通信能力,当然P3.0/P3.1也可以作为通用端口进行输入和输出。

(2)通信波特率

8051串行接口组成的通信系统是一种异步通信系统,即通信双方在发送与接收时,只靠通信双方的软件控制同步。有两个条件必须保证:

1)通信双方传送的数据格式必须一致。

2)通信双方传送的数据传输速率,也就是波特率必须一致。

所谓波特率,用Baud表示,也就是每秒传送的二进制位数,单位是bit/s(bit per second)。

例如:波特率Baud=2400bit/s,就是每秒传送2400个二进制位。波特率在串行接口异步通信中是一个由用户决定的保证通信可靠的重要参数。

(3)串行接口控制寄存器SCON设置

串行接口控制寄存器SCON如下:

978-7-111-47138-7-Chapter04-158.jpg

SM0和SM1是串行接口工作模式选择位,共有4种模式,见表4-8。

表4-8 串行接口工作模式选择

978-7-111-47138-7-Chapter04-159.jpg

SM2是多机通信使能位,通常设为0。

REN允许接收位。由软件设置,REN=1,允许接收;REN=0,禁止接收。

TB8发送数据的第9位,可以由软件置“1”或置“0”,也可以作为奇偶校验位。

RB8接收数据的第9位。

TI发送结束标志。当TI由0变为1时,表示SBUF缓冲区一帧数据发送结束,可以作为查询标志,也可以作为中断申请标志,但TI必须由软件清“0”,准备下一次发送。

RI接收结束标志。当RI由0变为1时,表示SBUF缓冲区一帧数据接收结束,可以作为查询标志,也可以作为中断申请标志,RI由软件清“0”。

(4)通信格式

PC与单片机通信均采用异步通信方式,即非同步接收发送(Universal Asyn-chronous Receiver Transmitter,UART)。其通信格式如图4-16所示。

8位UART中,起始位(1)+数据位(8)+停止位(1)共10位作为一帧进行传送。一般异步通信按方式1(即8位UART)进行。传送过程中的数据校验按传送字节的校验和进行检验。

978-7-111-47138-7-Chapter04-160.jpg

图4-16 异步通信格式

SCON的设置如下:

作为发送端:SCON=0100 0000B=0x40,方式1,8位UART,无奇偶位。SM0=0,SM1=1,SM2=0,REN=0,TB8=0,RB8=0,TI=0,RI=0。

作为接收端:SCON=0101 0000B=0x50,方式1,8位UART,无奇偶位。SM0=0,SM1=1,SM2=0,REN=1,TB8=0,RB8=0,TI=0,RI=0。

(5)定时器设置

在异步通信方式中,用定时器作为波特率发生器。因而必须设置定时器T1。选用工作方式2,TL1作为工作8位计数器,TH1作为预置8位计数器。当TL1计数满溢出后,TH1预置的内容自动装入TL1内,保证连续工作。要用T1作为波特率发生器,定时器模式寄存器TMOD=0010 0000B=0x20。

(6)波特率计算

确定T1作为波特率发生器,接下来要根据波特率要求值计算出TH1/TL1的数值,再根据实际TH1/TL1值计算出实际波特率,与标准波特率的误差要≤2.5%。异步通信的波特率按PC串行接口的标准有一系列标准数值:300bit/s、600bit/s、1200bit/s、2400bit/s、4800bit/s、9600bit/s、19200bit/s、38400bit/s等。波特率越高,通信速度越快,效率就越高。但稳定性及正确性的保证就越困难。一般对单片机的数据通信要求不很高,用串行接口即可达到,一般为2400~9600bit/s。下面按步骤进行波特率计算:

波特率计算公式:

Buad=(2smod/32)(fosc/12(256-n)) (4-1)

式中,smod是SFR中的PCON寄存器的PCON.7位,复位后PCON.7=0。若计算需要,也可设为1;fsoc是MCU的晶体振荡频率,取fsoc=6MHz=6×106Hz;n是TH1(TL1)定时常数。

1)若设Baud=2400,则n=256-(2smodfsoc)/(12×32×Baud)

n=256-(20×6×106)/(12×32×2400)(www.chuimin.cn)

n=256-6.5=249.5

因定时常数必须为整数,所以取n=249,将n代入式(4-1),反算B

B=(20×6×106)/12×32×(256-249)=2232

与标准波特率2400的误差为

α=(2400-2232)/2400=7% 负误差

此误差超出要求的范围。

2)设smod=1,PCON=10000000B=80H,重新计算n

n=256-(2smodfosc)/(12×32×Baud)

n=256-(21×6×106)/(12×32×2400)

n=256-13=243

n代入式(4-1),反算Baud:

Baud=(21×6×106)/12×32×(256-243)=2403

与标准波特率2400的误差:

α=(2403-2400)/2400=0.125% 正误差

此误差在要求的范围。因而,取smod=1,PCON=1000 0000B=0x80是合适的。TL1=TH1=0xF3。

3)在单片机的晶体振荡器中,常看到fosc=11.0592MHz,为何取这个数值呢?因为这个晶体振荡器数值精确地对应波特率Baud=9600bit/s。

n=256-3=253 smod=0

Baud=(20×11.0592×106)/12×32×(256-253)=9600TL1=TH1=253=0xFD即可满足要求。

4)串行接口数据发送与接收过程。对工作方式1、2、3只是数据传输的帧格式不同,过程机制是相同的。

(7)通信设置

确定SCON。若用工作方式1,发送和接收有效。SCON=0101 0000B,REN=1。

确定TCON。用工作方式2作为波特率发生器。TCON=0010 0000B。

按确定的波特率计算TL1/TH1(TL1=TH1)。

令TR1=1,启动波特率发生器。

数据送ACC。

ACC送SBUF,MCU立即开始从串行接口发送数据,直到TI=1表示一帧数据发送结束TI清0。

查询RI是否为1,若为1,表示一帧数据接收完成。RI清0,SBUF送ACC,转数据处理。注意,串行口的SBUF作为发送和接收共用的缓冲区,波特率发生器只能用定时器T1。

2.【例4-47】 串行接口自发自收编程

U1的串行接口TXD(P3.1)与RXD(P3.0)连接,进行自发自收。接收的数据在P1口以二进制灯显示结果。

(1)编程

978-7-111-47138-7-Chapter04-161.jpg

(2)编译

(3)执行

在实验机STC89C51RC芯片的10及引脚11用杜邦线进行连接,如图4-17所示。机器上电执行程序,应在P1口显示1000 1001B=0x89。

(4)程序点评

本例验证了8051本身的串行收发程序。8051串行接口设有一个SBUF寄存器(Series Buffer),只要将要发送的数据传送到SBUF内,即自动启动发送过程。可以立即检测RI的状态。若RI=0,则继续等待接收。若RI=1,则表示已收到PC发来的数据,可以将SBUF内容进行处理。