第七章 单片机的串行口

总体内容

7.1 串行通信概述

7.2 MCS-51的串口控制器

7.3 串行工作方式0及其应用

7.4 串行工作方式1及其应用

7.5 串行工作方式2及其应用

7.6 串行工作方式3及其应用

7.1 串行通信概述

1、并行通信和串行通信(数据通信的两种常用形式)

(1)并行方式-------数据的各位同事发送或同时接收

并行传送特点:传送速度快,但因需要多跟传输线,故一般只在近距离通信中使用。

(2)串行通信方式-----数据的各位依次逐位发送和接收。

串行传送特点:传输速度慢,但因需要较少传输线,故适合远距离通信。

按照数据流向,串行通信具有三种传输形式:

实际应用中,尽管多数串行通信接口电路具有全双工功能,但仍以半双工为主(简单实用)

2、波特率

在串行通信的数据是按位进行传送的 ,数据传输速率用波特率指标衡量。

波特率:每秒发送二进制数码的位数,即bps (/)

国际推荐波特率:11030060012002400480096001920038400波特等。

串行通信的收发双方必须采用相同的波特率。

3、异步通信和同步通信(串行通信基本通信方式)

1)异步通信
    ——以字符为单位组成字符帧进行的数据传送。

一帧数据由起始位数据位[可编程位]停止位构成

起始位:位于数据帧开头,占1位,始终为低电平,用于向接收设备表示发送端开始发送1帧数据。

数据位:要传输的数据信息,可以是字符或数据,一般为58位,由低位到高位依次传送。

可编程位:位于数据位之后,占1位,用于发送数据的校验,或传送多机串行通信的联络信息。

停止位:位于数据位末尾,占1位,始终为高电平,用于向接收端表示1帧数据已发送完毕。

异步通信特点

对收发双方的时钟精度要求较低(收发双方不同步时,能依靠在每帧开始时的不断对齐,自行纠正偏差);

传送速度较低(每个字节都要建立一次同步)。

2)同步通信

          ——数据以块为单位进行的数据传送

在发一组数据时,只在开始用若干个同步字符作为双方的号令,然后连续发送整组数据。

同步通信特点

传输效率高(以数据块为单位连续传送,数据结构紧凑);

对通信硬件要求高(要求双方有准确的时钟)。

7.2 MCS-51的串口控制器

7.2.1串行口内部结构

51内部有1可编程的全双工串行通信接口,可作为通用异步接收/发送器UART),也可作为同步移位寄存器

结构组成SBUF+SBUF+发送控制器 +接收控制器 +波特率发生器 +SCON +RXDP3.0+TXDP3.1

数据缓冲器SBUF

Ø 在物理上是相互独立的,一个用于发送数据( SBUF )、一个用于接收数据( SBUF )。
Ø 共用一个地址( 99H ),通过读写指令区别是对哪个 SUBF 的操作。

发送控制器

Ø 在门电路和定时器 T1 的配合下,将 SBUF 中的并行数据转为串行数据,并自动添加起始位、可编程位、停止位。
Ø 这一过程结束后自动使发送中断请求标志位 TI 1 ,表明已将 SBUF 中的数据输出到 TXD 引脚,即 SBUF 为空

接收控制器

Ø 在输入移位寄存器和定时器 T1 的配合下,使来自 RXD 引脚的串行数据转为并行数据,并自动过滤掉起始位、可编程位、停止位。
Ø 这一过程结束后自动使接收中断请求标志位 RI 1 ,表明接收的数据已存入 SBUF ,即 SBUF 为满

定时器T1

Ø 产生节拍控制用的通信时钟信号(波特率时钟);
Ø 发送数据时,时钟的 下降沿 对应于数据移位输出;
Ø 接收数据时,通信时钟的 上升沿 对应于数据位采样。

P3.0/RXDP3.1/TXD引脚:

用于串行信号或时钟信号的传入或传出。

7.2.2串行口控制寄存器

通信时钟波特率原理

T1溢出脉冲有两种分频路径:16分频或32分频;

SMOD是决定分频路径的逻辑开关。

波特率取决于T1的定时参数(a,n,fosc)和SMOD参数。

7.3 串行工作方式0及其应用

串行通信的4种工作方式

方式0——8位同步移位寄存器方式

Ø 8 位数据为一帧,不设起始位和停止位,先发送或接收最低位。
Ø 数据传输波特率固定为 fosc /12
Ø RXD 引脚输入或输出 数据
Ø TXD 引脚输出 fosc /12 时钟信号
方式 0 主要用于 串并转换

——I/O口数量不足时,可通过串口方式0进行扩展,但需要相应的扩展芯片配合。

实例1 方式0应用
利用74LS164扩展并行输出口,并实现LED由上向下循环

74LS164——8位串入并出移位寄存器

电路接线:

数据输入端1(2)→RXD

时钟端8→ TXD

输出端Q0Q7 →D1D8

清零端9——VccI/O

74LS164倒序校正

     欲使164输出1111 1110BSBUF应为0111 1111B (0x7f )

     欲使D1D8由上向下点亮,SBUF应右移1位且最高位置1

     → (SBUF >> 1) | 1000 0000B   ; 0x80逻辑或

实例1源程序

7.4 串行工作方式1及其应用

方式1—— 10位数据异步通讯方式

Ø 一帧信息 = 1 个起始位 (0)+8 位数据位 +1 个停止位 (1)
Ø 指定 T1 为波特率时钟发生器 , 一般选择定时方式 2
Ø 发送数据由 TXD P3.1 )输出,接收数据由 RXD P3.0 )输入,初始化( RI TI REN SM0 SM1
Ø 方式 1 主要用于点对点(两机)通信

实例方式1应用

Ø 采用双机串行通信,其中甲机

   发送数据,乙机接收数据,两机

   fosc11.0592MHz,波特率

   为2.4k,串口方式1

Ø 甲机循环发送数字 0 F ,乙机接收后返回接收值。若发送值与返回值相等,继续发送下一数字,否则重复发送当前数字。采用查询法检查收发是否完成。
Ø 发送值和接收值分别显示在双方 LED 数码管上 ;

② 程序流程图

对通信的实时性要求不高,故双机都可采用软件查询TIRI的做法

实例2源程序(发送)

实例2源程序(接收)

7.5 串行工作方式2及其应用

Ø SUBF 为空时 TI 自动置 1 SUBF 为满时 RI 的状态要由 SM2 RB8 共同决定。
Ø SM2=1 ,当 RB8 1 时, SUBF 为满可使 RI 1 ;若 RB8 0 ,则 SUBF 为满也无法使 RI 1
Ø SM2=0 ,则无论 RB8 为何值, SUBF 为满都能使 RI 1
方式 2 用于固定波特率的奇偶校验 ( 单机通讯 ) 或多机通讯

奇偶校验原理:

例如,发送数据为0x450100 0101B),其奇偶校验值P=1(奇数个1),将PTB8,发送时可连同数据0x45一起发出。接收端可自动将其可编程位放入RB8中。

只要将待测数据送入Acc即可由硬件求出奇偶校验值(使P赋值),再与RB8进行比较便可判断收发过程是否有误。

实例3 方式2应用

采用实例2的双机通信电路,晶振11.0592MHz,串口方式2 ,通

信时钟为0.3456Mb/s,两机分别显示收发数值,且进行奇偶校验

Ø 甲机在循环发送数据( 0 F )的同时发送相应奇偶校验码;
Ø 乙机接收后先进行奇偶校验。若结果无误,则使返回的接收值中 P=0 ,若结果有误,则使 P=1
Ø 甲机根据返回接收值中的可编程位做出发送新数据( RB8=0 )或重发当前数据( RB8=1 )的抉择。

程序分析:

① 对于晶振11.0592MHz0.3456Mb/s的通信时钟相当于1/32晶振频率→PCON= 0x80(波特率加倍);串口方式2,允许接收,不是多机通信→SCON = 0x90

② 将数据存入累加器Acc,可获得奇偶标志位P值。发送时校验位写入TB8输出,接收时校验位从RB8读取。

实例3源程序(发送)

实例3源程序(接收)

7.6 串行工作方式3及其应用

方式3——11位数据异步通信方式

Ø 方式 3 的波特率为可变的(其余方面皆与方式 2 相同)

多机通信做法

l 主机向所有从机发送包含 n# 从机信息 地址帧;
l 所有从机都核查该地址帧 , 只有 n# 从机修改本机 SM2
l 主机发送数据帧 , 但只有 n# 从机能够接收到数据信息。   

关键

主机第1次发出的信息要能被所有的从机响应,而第2次的信息只能被n#从机所响应——多机通信控制位SM2对串行中断请求的管理功能。

实例4 方式3应用

下图电路中,K1K2为发送激发键,每按1次,主机向相应从机顺序发送10F间的字符,发送字符可用虚拟终端TERMINAL观察。命中从机收到地址帧后使发光二极管状态反转1次,收到数据帧后在其共阳型数码管上显示出来。系统晶振频率为11.0592MHz。要求通信采用串口方式3,波特率9600bps,发送编程采用查询法,接收编程采用中断法。

实例4源程序(主机)

实例4源程序(子机1#

实例4源程序(子机2#

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:14:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:14:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:14:03       57 阅读
  4. Python语言-面向对象

    2024-07-19 08:14:03       68 阅读

热门阅读

  1. ArcGIS Pro SDK (九)几何 5 多边形

    2024-07-19 08:14:03       20 阅读
  2. SpringBoot集成EasyExcel实现模板写入多个sheet导出

    2024-07-19 08:14:03       21 阅读
  3. python中excel的读取和写入

    2024-07-19 08:14:03       20 阅读
  4. Python 3 CGI编程

    2024-07-19 08:14:03       18 阅读
  5. 为什么 HashMap 的容量是 2 的整次幂?

    2024-07-19 08:14:03       15 阅读
  6. C++编程逻辑讲解step by step:利用文档类处理数据

    2024-07-19 08:14:03       20 阅读
  7. 【Oracle】Oracle中的LISTAGG函数

    2024-07-19 08:14:03       18 阅读
  8. new和malloc

    2024-07-19 08:14:03       21 阅读
  9. Redis 地理位置 GEO 模块

    2024-07-19 08:14:03       21 阅读
  10. 一文理解ThreadPoolExecutor线程池以及运行时间

    2024-07-19 08:14:03       20 阅读
  11. AccessibilityEvent常用事件

    2024-07-19 08:14:03       19 阅读