51单片机串行口的工作方式解析

2021-01-13来源: eefocus关键字:51单片机  串行口  工作方式

方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。


实际应用在串行I/O口与并行I/O口之间的转换。


2)方式1

方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。


在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。



(1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。

(2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后:

A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

B、 若RI=0、SM2=1,则只有停止位为1时,才有上述结果。

C、若RI=0、SM2=1,且停止位为0,则所接数据丢失。

D、若RI=1,则所接收数据丢失。

无论出现那种情况,检测器都重新检测RXD的负跳变,以便接收下一帧。

3)方式2、方式3

方式2和方式3是9位异步串行通信,一般用在多机通信系统中或奇偶校验的通信过程。在通讯中,TB8和RB8位作为数据的第9位,位SM2也起作用。方式2与方式3的区别只是波特率的设置方式不同。

(1)发送

向SBUF写入一个数据就启动串口发送,同时将TB8写入输出移位寄存器第9位。开始时,SEND和DATA都是低电平,把起始位输出到TXD。DATA为高,第一次移位时,将‘1’移入输出移位寄存器的第9位,以后每次移位,左边移入‘0’,当TB8移到输出位时,其左边是一个‘1’和全‘0’。检测到此条件,再进行最后一次移位,/SEND=1,DATA=0,输出停止位,置TI=1。

(2)接收

置REN=1,与方式1类似,接收器以波特率的16倍速率采样RXD端。

起始位0移到输入寄存器的最左边时,进行最后一次移位。在RI=0,SM2=0或接收到的第9位=1时,收到的一字节数据装入SBUF,第9位进入RB8,置RI=1;然后又开始检测RXD端负跳变。

3、 多机通信

在这里,多机系统是指‘一主多从’。51系列单片机中,利用第9位TB8/RB8来区分地址与数据信息,用位SM2确定接收方是否对地址或数据帧敏感。其原则是:

1)发送方用第9位TB8=1标志地址帧,TB8=0标志数据帧。

2)接收方若设置SM2=1,则只能接收到地址信息,若设SM2=0,则不管是地址还是数据帧,都能接收到。

利用方式2、3的特点,在点对点的通讯中,在发送方可以用第9位TB8作为奇偶校验位。在接收方,SM2位必须清0。

4、波特率

1)方式0的波特率=fosc/12

2)方式2的波特率=2^smod*fosc/64

3)方式1、3的波特率由T1或T2的溢出率和SMOD位确定:

(1)用T1:波特率=2^smod*T1定时器的溢出率/32,T1为方式2T1定时器溢出率=1/((12/fosc)*(256-X))例:已知fosc=6MHz,SMOD=0,设置波特率为2400,求T1的计数初值X。

波特率=1/((12/fosc)*(256-X))/32=fosc/12*32(256-X)(256-X)=fosc/2400/384=6M/2400/384;256-X~=6.5104X~=250=FAH 只能近似计算。

若fosc=11.0592MHz, 则256-X=11.0592M/2400/384=4068/384=12 X=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。

如果SMOD=1,则同样的X初值得出的波特率加倍。

(3)用T2:

在52型单片机中,串口方式1、3的波特率发生器选择由TCLK、RCLK位确定是T1还是T2。若TCLK=1,则发送器波特率来自T2,否则来自T1。若RCLK=1,则接收器波特率来自T2,否则来自T1。

由T2产生的波特率与SMOD无关。T2定时的最小单元=2/fosc。T2的溢出脉冲16分频后作为串口的发送或接收脉冲。

波特率=(1/((2/fosc)(65536-X)))/16=fosc/(32(65536-X))例:已知fosc=11.0592MHz,求波特率=2400时的X2400=11059200/(32(65536-X)) 65536-X=144 X=65392=FF70H计数器初值寄存器:RCAP2H=0FFH,RCAP2L=70H。

关键字:51单片机  串行口  工作方式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic522887.html

上一篇:51单片机串行通信的原理解析
下一篇:51单片机实例讲解,由按钮控制灯亮程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机学习实践:用NTC电阻测温并显示在TM1637数码管
STC15单片机实验名称:使用NTC电阻测量温度实验内容:        使用NTC电阻测量温度并显示在数码管上        读取DS18B20模块测量温度作为参考实验器材:        STC15W408AS_DIP16 x1        DS18B20  x1        TM1637数码管 x1
发表于 2020-12-17
<font color='red'>51单片机</font>学习实践:用NTC电阻测温并显示在TM1637数码管
一款51单片机电子钟制作(C语言)
/*一款电子钟程序,此电子钟是四位电子钟数码管组成的,功能分别有走时、响闹、走时间调整、闹钟时间调整等功能!调整部分分别由三个按键实现,一个功能键,一个+(加)键,另一个为-(减)键,其它功能键是复用功能!*/硬键介绍:数码管个位.十位.百位.千位.小数点分别接P0.0 P0.1 P0.2 P0.3 P0.4。蜂鸣器接P3.5脚,功能按键接P3.2 加按键接P3.3 减按键接P3.4以下是两张图片!!!#include <reg52.h>//头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义uchar shi,fen,nshi,nfen,ma
发表于 2020-12-17
一款<font color='red'>51单片机</font>电子钟制作(C语言)
51单片机+1602+DS18B20的温度报警程序
51单片机做的温度显示,温度显示在LCD1602液晶屏上。然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:/***************************************************************************************                              基于单片机的实时温度报警系统设计         
发表于 2020-12-17
<font color='red'>51单片机</font>+1602+DS18B20的温度报警程序
基于51单片机超声波测距防近视台灯程序
程序代码 仿真图单片机源程序如下:#include<reg52.h>#include<intrins.h>/*********************宏定义************************/#define uchar unsigned char#define uint unsigned int/************位定义*****************************/sbit Trig=P3^7; //超声波模块触发位sbit LEDRED=P1^0;sbit LEDGREEN=P1^2;sbit speaker=P1^7;sbit person=P1^6;sbit
发表于 2020-12-09
基于<font color='red'>51单片机</font>超声波测距防近视台灯程序
STC89C51单片机+HX711称重模块电子秤程序
电子秤是基于STC89C51单片机,以及HX711称重模块,利用单片机控制A/D转换,屏幕数据显示,键盘实时输入,设计方案能够易于各种场合使用。单片机源程序如下:#include <reg52.h>#include <intrins.h>#include <string.h>#include "main.h"#include "HX711.h"#include "eeprom52.h"#define uchar unsigned char#define uint  unsigned intunsigned long HX711
发表于 2020-12-09
STC89C<font color='red'>51单片机</font>+HX711称重模块电子秤程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved