基本概念
通信分为两种:串行通信和并行通信。
串行通信方式中,可以分为两类:异步通信和同步通信。
异步通信中,单片机与外设之间必须有两项规定。
第一项规定:双方通信时采用怎样的数据格式。数据格式指的是串行通信中怎样标志一组数据的开头和结束,这组数据有多少个有效数据位,以及是否带有校验码等等。
例如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
SM0、SM1:串行口工作方式控制位
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 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软件清零 } } }
上一篇:柒:定时/计数器的原理与应用
下一篇:玖:中断系统的原理与应用
推荐阅读最新更新时间:2024-11-10 20:32
设计资源 培训 开发板 精华推荐
- LT3692AHFE FMEA 容错 3.3V/2A 和 5V/2A 双路降压转换器的典型应用电路
- LV8729VGEVB,使用 LV8729V 的电流控制微步进电机驱动器评估板
- LT1121ACS8-5 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源
- 高清电视交流转直流多路输出电源
- 五路模块化桌面充电器
- LT4276CIUFD 70W LTPoE++ 电源在正向模式下的典型应用电路,具有 5V、13A 输出
- LM2931AD33R 超低压降稳压器的典型(可调输出)应用
- 使用 ON Semiconductor 的 LV57331TT 的参考设计
- LT3663EMS8E-5、5V 降压转换器的典型应用
- 带电荷泵的STP4CMP低压4通道恒流LED驱动器典型应用电路