捌:串行口的原理与应用

基本概念

通信分为两种:串行通信并行通信
串行通信方式中,可以分为两类:异步通信同步通信
异步通信中,单片机与外设之间必须有两项规定。
第一项规定:双方通信时采用怎样的数据格式。数据格式指的是串行通信中怎样标志一组数据的开头和结束,这组数据有多少个有效数据位,以及是否带有校验码等等。
例如UART串行通信双方规定:形成的数据格式如图:
这里写图片描述
1个起始位低电平0(通信总线在空闲时是高电平),7个数据位,1个奇偶校验位,1个停止位,这是完整的一帧数据。称之为数据格式。

异步通信还必须有一项规定:即双方通信过程中每发送一个数位需要多长的时间。在有些场合也称为波特率,即每秒钟传送的二进制位数。这项规定对于微处理器与外界通信是很重要的。

51内部的串行口

89C51内部有一个全双工串行通信接口,具有UART功能。
这里写图片描述
解释:51单片机内核,如果要发送一个数据出去,首先把数据放到发送SBUF中(缓冲区),然后SBUF会自主自发的将数据送到输出移位寄存器(8位),然后一个位一个位的送到TXD,首先发送右侧的那一位,发送完前面的自动往后移动位,发送的速度由波特率控制;当有数据来的时候,首先通过RXD送入输入移位寄存器(8位),当装满之后(一个字节),一次性送入接收SBUF(发送SBUF与接收SBUF名字一样,但物理地址不一样),然后再由单片机从接收SBUF中读取数据。PCON寄存器控制波特率,串行口控制寄存器SCON,TI与RI是标志位,TXD连接P3.1引脚,RXD连接P3.0引脚。这两个引脚又称为功能复用引脚(既做普通I/O口,又做串行口的输出/输入)。
#寄存器描述
串行口资源的有3个寄存器:SCON、SBUF、PCON
1、串行口控制寄存器SCON

D7
D6
D5
D4
D3
D2
D1
D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:串行口工作方式控制位
SM0 SM1
工作方式
功能说明
波特率
0  0
方式0
移位寄存器输入输出
fosc/12(fosc是振荡器的频率)
0  1
方式1
8位UART
T1溢出率(16×2^SMOD)
1  0
方式2
9位UART
fosc/(32×2^SMOD)
1  1
方式3
9位UART
T1溢出率(16×2^SMOD)

SM2:在方式2和方式3下,多机通信的控制位。在方式2和方式3下,如果SM2=0,只要接收到停止位信息后就会置位RI标志位,表示接收到数据;如果SM2=1,只有串行口接收到第9位数据(RB8)为1时,则会置位RI标志位。
REN:允许接收控制位。REN=0,则禁止串行口接收;REN=1,允许串行口接收。
TB8:在工作方式2和方式3中要发送的第9位数据,可以是奇偶校验位或者是地址/数据标识位。
RB8:接收到的第9位数据。
TI:发送中断标志位。数据发送完毕之后,TI由硬件自动置位。单片机响应中断后,不会自动清除该位,必须用软件对TI清零。
RI:接收中断标志位。一帧数据接收完毕之后,RI由硬件自动置位。单片机此时可以从SBUF中读取数据,读完数据后必须用软件对RI清零。

串行口的使用

第一项规定:双方通信时采用怎样的 数据格式。(四种工作方式)
串行口有四种工作方式,方式0主要用于扩展并行输入输出口;方式1、方式2和方式3用于串行通信中。
(1)方式0
在方式0下,串行口的SBUF作为同步移位寄存器使用,发送SBUF相当于一个并入串出的移位寄存器。接收SBUF相当于一个串入并出的移位寄存器。
(2)方式1
串行口在方式1下工作于异步通信方式,一帧数据有10包,包括1位起始位、8位数据位和1位停止位。
发送过程:单片机执行一条写入SBUF的指令就启动发送,数据从TXD引脚输出,发送完一帧数据后,硬件置位TI标志。
接收过程:当REN=1时,接收器对RXD引脚进行采样,采样脉冲频率是所选波特率的16倍。当采样到RXD引脚上出现从高电平“1”到低电平“0”的负跳变时,就启动接收器接收数据。接收完数据后,将有效的8位数据送入接收SBUF中,停止位送入RB8中,并置位RI。
(3)方式2和方式3
方式2或方式3异步通讯的数据帧都是由11位组成,包括1位起始位、8位数据位、1位可编程位(第9位)、1位停止位。发送数据时,第9位送入SCON中的TB8;接收数据时,第9位送入SCON中的RB8。(可用于多机通信)
发送过程:先把第9位数据装入SCON中的TB8中,再把要送的数据送入发送的SBUF。发送器便立即启动发送数据,发送完一帧数据后,硬件置位TI。
接收过程:当REN=1时,串行口可以接收数据。接收到的有效8位数据送入接收SBUF,第9位数据装入RB8,然后根据SM2的设置判定是否置位RI。
第二项规定:双方通信速度的确定。(计算波特率)
串行口都是选用T1作为波特率发生器(T1工作在方式2(n=8)下),所以需要计算T1的计算初值和SMOD值。公式如下:
方式1、方式3的波特率=[定时器T1溢出率×2^SMOD]/32     (公式1)

定时器T1溢出率 = 1/溢出周期 = 晶振频率/[(2^8-计数初值)×12]  (公式2)

由公式1和公式2推导出计算初值的计算公式,见公式3。

计数初值 = 256-[晶振频率×2^SMOD]/[波特率×32×12]      (公式3)

如需精确的通信波特率4800bps,设晶振频率fosc=12MHz,定时器T1工作在方式2下,有两种方法实现:

由上可知,SMOD的选择对计数初值和波特率有直接影响,一般波特率误差不大于2.5%,所以选择SMOD的值时先计算一下,选择使波特率误差小的SMOD值。

#串行口的使用步骤
1、通信双方数据通信格式的约定。
2、通信双方波特率的约定。(速度)
3、串行口的工作方式的选择,一般选择方式1和方式3。
4、计数初值和SMOD值的确定。
5、清除发送中断标志位TI和接收终端标志位RI。
6、往SBUF寄存器写入数据或等待从SBUF寄存器中接收数据。

实验

汇编代码

******************************************************************/	
*   【课程9】 ****UART的应用***********
*   【说 明】 ****使用单片机UART进行数据的发送		
*   【描 述】 ****使用UART向PC机发送字符串
******************************************************************/	

		ORG    0000H
MIAN:	MOV    SCON,#50H   ;SM0:SM1=01,选择方式1;TI=0
		MOV    PCON,#00H        ;设置SMOD位=0
		MOV    TMOD,#20H       ;定时器T1工作在方式2下
		MOV    TH1,#0E6H       ;设置计数重装值
		MOV    TL1,#0E6H       ;设置计数初值
		SETB   TR1             ;启动T1计数工作
		MOV    A,#41H          ;给A送字符‘A’的ASCII码,各字符的ASCII码见附录
L1:		MOV    SBUF,A          ;把数据送给SBUF,开始串口发送
		JNB    TI,$            ;如果TI=0,则一直等待,直到TI=1(即发送完成)才往下执行
		CLR    TI              ;清除TI标志
		JMP    L1              ;跳转到L1,继续发送字符‘A’
END

C代码

******************************************************************/	
*   【课程9】 ****UART的应用***********
*   【说 明】 ****使用单片机UART进行数据的发送	
*   【描 述】 ****使用UART向PC机发送一个 'A'字符
******************************************************************/
#include<reg52.h>

char arr[8]={'H','e','l','l','o','b','o','y'};

void main()
{	
	int i;
	SCON=0x50;	//设置串口工作于方式1,TI位清0
	PCON=0x00;	//PCON.7是SMOD位,SMOD=0
	TMOD=0x20;	//选择定时器T1工作于方式2
	TH1=0xe6;	//设置波特率为1200
	TL1=0xe6;
	TR1=1;		//开启定时器T1

	while(1)
	{
		for(i=0;i<8;i++)
		{
			SBUF=arr[i];	    //发送字符‘A’
			while(!TI) ;	//等待TI置位,即数据发送完成
			TI=0;	    	//对TI软件清零
		}  	  	
	}
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值