首页 > 其他分享 >第6章 串行通信接口

第6章 串行通信接口

时间:2024-04-07 14:55:06浏览次数:21  
标签:MOV 串行口 寄存器 串行 波特率 接收 通信接口

第6章 串行通信接口

一、串行数据通信基本原理

计算机的数据传送有并行和串行两种方式。并行传送的特点是:各数据位同时传送,传送速度快、效率高。但需要的数据线多,因此传送成本高。并行数据传送的距离通常小于30米。串行传送的特点是:数据传送按位顺序进行,最少只需一根传输线即可完成,成本低,但速度慢。串行数据传送的距离可以从几米到几千公里。

1. 异步串行通信的字符格式

异步串行数据通信以字符为单位,即一次传送一个字符。异步通信的数据格式为:

一帧信息 = 1位起始位(为低电平)+ 5-8位数据位(紧跟着起始位),表示要传送的有效数据(低位在前)+ 1位奇偶校验位(可有可无)+ 1、1.5或2位停止位(为高电平)。

从起始位开始到停止位结束的时间间隔称为一帧。就是一个字符的完整通信格式。因此也把串行通信的字符格式称为帧格式。

2. 串行通信的数据通路形式

串行数据通信有以下几种数据通路形式:

  • 单工形式: A发,B接。
  • 半双工形式: A发或接, B接或发。
  • 全双工形式: A发、接,B接、发。

3. 串行通信的传送速率

传送速率用于说明数据传送的快慢。在串行通讯中,数据是按位进行传送的。因此,传送速度用每秒传送数据位数目来表示,称之为波特率(Baud),每秒传送一个数据位就是一波特。即:

1波特 = 1bps(位/秒)

常用的波特率有:75,110,300,600,1200,2400,4800,9600,19200。

4. 串行通信接口电路

串行数据通信中主要有两个技术问题:

  • 数据传送:数据传送主要解决传送中的标准、格式及工作方式等问题
  • 数据转换:数据转换是指数据的串并转换

串行接口电路基本组成逻辑框图如下:

串行输入 -> 并行输出
并行输入 -> 串行输出 
时钟、复位、控制信号 <-> 状态、控制信息

通用异步接收发送器(UART)是实现异步串行通信的常用接口,其他常见的异步串行通信接口还有:

  • TTL电平直接连接
  • RS-232C
  • RS-422、RS-485
  • 20mA电流环

二、MCS-51单片机串行口

MCS-51单片机片内有一个全双工串行口,既可以实现异步串行通信,还可以作为同步移位寄存器来使用。定时器T1可作为串行通信波特率发生器。

1. 串行口寄存器结构

MCS-51单片机串行口的基本结构如下:

TXD串行输出 <- 移位 <- SBUF发送寄存器
RXD串行输入 -> 移位 -> SBUF接收寄存器 -> RI接收中断  
时钟 -> 移位

SBUF是串行口的缓冲寄存器。它是一个可字节寻址的专用寄存器,其中包括发送寄存器(只能写)和接收寄存器(只能读),以便能够以全双工方式进行通信,这两个寄存器共用一个地址(99H)。

例如:
启动发送:MOV SBUF,A ;SBUF←(A)
启动接收:MOV A,SBUF ;A←(SBUF)

2. 与串行通信有关的寄存器

与串行通信控制有关的专用寄存器有:

  • SCON:串行控制,用来设定串行口的工作方式
  • PCON:电源控制,可控制波特率。
  • IE: 设置串行中断允许。

串行控制寄存器SCON(98H)格式如下:

SM0 SM1 SM2 REN TB8 RB8 TI RI

各位功能说明:

  • SM0、SM1:串口工作方式选择位
    • 00 方式0: 同步移位寄存器,波特率固定。
    • 01 方式1:8位异步,波特率可变。
    • 10 方式2:9位异步,波特率固定。
    • 11 方式3:9位异步,波特率可变。
  • SM2:多机通信控制位,主要用于方式2、3中。
  • REN:允许串行接收,用软件置位或清除。
  • TB8/RB8:
    在工作方式2、3中,TB8是发送的第九位数据,由软件置位(SETB TB8)或复位(CLR TB8)。在双机通信中,该位作为奇偶校验位;在多机通信中用来表示D7~D0是地址帧或数据帧。即:D8=0:表示数据帧;D8=1:表示地址帧。
    RB8:在工作方式2和3中,该位是接收到的第9位数据。
  • TI:发送中断标志。在发送停止位之前,该位由硬件置位,申请中断,CPU响应中断后,可以发送下一帧数据。该位必须由软件清零。
  • RI:接收中断标志。在接收到停止位的一半时,该位由硬件置位(还需考虑SM2的设定),申请中断,CPU响应中断后,可以接收下一帧数据。该位也必须由软件清零。

电源控制寄存器PCON(87H)格式如下:

SMOD - - - GF1 GF0 PD IDL

它主要是为CHMOS型单片机的电源控制而设置的。对HMOS型单片机,除了最高位(SMOD)之外,其它位都虚设的,SMOD是串行口波特率的倍增位。

当:SMOD=1时,串行口波特率加倍。系统复位时,SMOD=0。可由下列指令设置:

MOV PCON,#80H ;SMOD←1
MOV PCON,#00H ;SMOD←0  

3. 串行口的工作方式

(1) 方式0

方式0为同步移位寄存器方式。RXD端作为数据移位的入口或出口,TXD端提供移位时钟脉冲,移位数据的发送和接收以8位为一帧,不设起始位和停止位,低位在前高位在后,波特率是固定的,为fOSC/12。即一个机器周期移位一次。

功能:用作I/O口扩展。

(2) 方式1

方式1的帧格式为:1位起始位 + 8位数据位 + 1位停止位。

数据发送是由一条写发送寄存器(MOV SBUF,A)指令开始的。此后在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式。然后在移位脉冲的作用下,由TXD端串行输出。一个字符帧发送完后,使TXD端输出线维持高电平,并将TI置位,通知CPU可以发送下一个字符。

接收数据时,应使REN=1。在此前提下,串行口采样RXD端,当采样到从1到0的跳变时,就认定是接收到了起始位。随后在移位脉冲的控制下,把接收到的数据位移入接收寄存器中。直到停止位到来之后把它送入到RB8中,并置位RI,通知CPU从SBUF取走接收到的一个字符。

方式1的波特率可变,由下式决定:

波特率 = (2^SMOD)/32 * (T1溢出率)
       = (2^SMOD)/32 * fOSC/(12*[256-X])  

其中:smod为PCON寄存器最高位的值,fOSC为晶振频率,X为当T1工作于方式2(8位自动加载)时的计数初值。实际使用时,总是先确定波特率,再计算T1的计数初值。即:

X = 256 - (2^SMOD) * fOSC/(384*波特率)
(3) 方式2和方式3

串行口工作在方式2、3时,为9位异步通信口,发送和接收1帧信息由11位组成,即:

1位起始位(0) + 8位数据位(D0~D7) + 1位可编程位(D8) + 1位停止位(1)

D8位既可作为奇偶校验位,也可作为控制位使用,其功能由用户来确定。发送时,可编程位D8(TB8)可设置为0(CLR TB8)或1(SETB TB8)。接收时,TB8送入SCON寄存器中RB8位。

方式2、3的区别是波特率设置不同:

  • 方式2的波特率是固定的。即:波特率 = fosc/32或fosc/64
  • 方式3的波特率是可变的。计算公式同方式1。

下表列出了一些常用的波特率与对应的时间常数设置:

波特率 fosc smod 定时器1方式 时间常数
1200 1.0592 0 2 E8H
2400 1.0592 0 2 F4H
4800 1.0592 0 2 FAH
9600 1.0592 0 2 FDH
19200 1.0592 1 2 FDH

利用串行口工作方式0可以方便地扩展I/O口。

三、串行口应用举例

例6-1 双机通信

设:甲机发送乙机接收,串行口工作在方式1,波特率为1200,fosc=11.0592MHz。

硬件连接如图:

甲 TXD ---> RXD 乙
   RXD <--- TXD

计算时间常数:T1作为波特率发生器,工作于方式2。由表1查得时间常数为E8H。

甲机发送程序:
甲机将内部RAM单元20H~3FH的32个字节的ASCII码数据,在最高位上加奇校验位后,由串行口TXD发送给乙机。即可采用8位异步通信。

START:  MOV TMOD,#20H       ;T1为方式2
        MOV TL1,#0E8H       ;时间常数低8位
        MOV TH1,#0E8H       ; 
        SETB TR1            ;启动T1工作
        MOV SCON,#01000000B ;串行口方式1   
        MOV R0,#20H         ;数据首地址   
        MOV R7,#32          ;32字节数据   

LOOP:   MOV A, @R0          ;取数据
        MOV C, P            ;置奇校验位
        CPL C   
        MOV ACC.7, C    
        MOV SBUF,A          ;启动发送

DONE:   JNB TI, DONE        ;等待发完一帧
        CLR TI              ;清TI,允许再发送
        INC R0              ;指向下一数据
        DJNZ R7, LOOP       ;未送完,送下一个数
        AJMP START          ;循环发送

乙机接收程序:
与甲机发送相呼应,接收器把接收到的32个字节数据存放在内部RAM的20H~3FH中,波特率与晶振频率同上。若奇校验出错,则置进位位1。
程序如下:

START:  MOV TMOD,#20H       ;T1方式2
        MOV TL1,#0E8H
        MOV TH1,#0E8H
        SETB TR1
        MOV R0,#20H
        MOV R7,#32

LOOP:   MOV SCON,#01010000B ;串行口方式1,能接收

DONE:   JNB RI,DONE         ;等待接收一帧
        CLR RI              ;清RI,再接收
        MOV A,SBUF          ;取数据
        JNB P, ERROR        ;校验错,转出错处理
        ANL A,#7FH          ;去掉奇校验位
        MOV @R0,A           ;奇校验正确,存数据
        INC R0              ;指向下一数据
        DJNZ R7,LOOP        ;数据块未接收完,循环
        AJMP START          ;循环接收

ERROR:  ...                 ;出错处理

多机通信

多机通信是指一个主机与多个从机之间进行通信。通常采用半双工方式,由主机轮流询问从机。主机发送的数据帧以11位传送,其中第9位为1表示是地址帧,为0表示是数据帧。

从机接收到主机发来的地址帧后,将自己的地址与之比较,若相同则做出响应,准备接收数据帧。否则不响应。

多机通信可以大大节省通信线路,适用于分布式数据采集等场合。

标签:MOV,串行口,寄存器,串行,波特率,接收,通信接口
From: https://www.cnblogs.com/jacx93/p/18119045

相关文章

  • dbms_lock控制串行详解
    1    使用dbms_lock包控制串行在pl/sql代码块中,有些操作代码块不能被多个会话同时进行执行,比如生成中间数据表(如先清除,后插入中间数据),并且此表的数据在后续业务处理总需要使用,如果此部分代码块被另个会话调用,则会造成中间数据表的数据在同一个会话中不完整。因此当有类似这......
  • STM32串行通信驱动LCD12864(使用5V电源,驱动信号用5VFT的引脚(3.3V MCU))
    #include"spi.h"voidSPI_GPIO_Init(void){//hardwaremakePSBlowtoenableserialcommunicationGPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mo......
  • STM32 | 通用同步/异步串行接收/发送器USART带蓝牙(第六天原理解析)
    STM32第六天一、 USART1、USART概念USART:(UniversalSynchronous/AsynchronousReceiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备处理器与外部设备通信的两种方式:u并行通信(八车道)......
  • 适合汽车应用的MAX96705AGTJ/V、DS90UB913ATRTVJQ1小尺寸串行器,以及TEF8105EN/N1汽车
    1、MAX96705AGTJ/V为小尺寸串行器,具有特别适合于汽车摄像应用的特性。其功能和引脚与MAX9271兼容。高带宽模式下,对于12位线性或组合HDR数据类型,并行时钟最大为116MHz。应用汽车摄像应用规格功能:串行器数据速率:1.6Gbps输入类型:CML输出类型:CMOS,LVCMOS输入数:1输出数:16电压-供电:1......
  • 【Linux】生产者消费者模型{基于BlockingQueue的PC模型/RAII风格的加锁方式/串行,并行,
    文章目录1.认识PC模型2.基于BlockingQueue的PC模型2.1串行,并行,并发2.2理解linux下的并发2.2RAII风格的加锁方式2.3阻塞队列2.4深入理解pthread_cond_wait2.5整体代码1.Task.hpp2.lockGuard.hpp3.BlockQueue.hpp4.pcModel.cc3.总结PC模型1.认识PC模型知乎好文「......
  • python 多线程运行 串行或并行
    我们知道在python中运行多线程程序很简单,只需要几步,创建线程,start线程即可,下面简单说下多线程的串行或者并行的使用示例:#-*-coding:utf-8-*-#@Time:2024-01-2714:03importthreadingimporttimedefrun(name:str)->None:time.sleep(3)print("Thre......
  • .NET 6 实现一个任务队列,且在不同线程中调用队列,队列始终都是串行执行
    在.NET6中,要实现一个任务队列,确保队列中的任务始终串行执行,即使它们是由不同线程调用的,你可以使用Channel<T>结合Task.Run或者更简单地使用BlockingCollection<T>与Task.Factory.StartNew或async/await模式。不过,为了保持代码的简洁性和现代性,我会推荐使用Channel<T>结合async/aw......
  • js 串行执行期约
    用数组和for循环再包装一下就是:asyncfunctionrandomDelay(id){//延迟0~1000毫秒constdelay=Math.random()*1000;returnnewPromise((resolve)=>setTimeout(()=>{console.log(`${id}finished`);resolve();},delay));}asyncfunctionfoo(){......
  • 在MFC中使用CArchive进行串行化数据
    使用CArchive进行数据串行化非常的方便。CArchive持有一个CFile对象,通过此对象进行读写,那么所有基于CFile的子类,都可以使用CArchive来进行串行化。示例:CFilefile(_T("1.txt"),CFile::modeReadWrite);CArchivear(&file,CArchive::load);此时CArchive对象就是处于读取的......
  • E1协议转换器技术深探:通信接口的高效转换
    E1协议转换器技术深探:通信接口的高效转换在通信技术不断进步的今天,E1协议转换器以其独特的功能和高效的转换能力,在数据通信领域扮演着至关重要的角色。它如同一座沟通不同技术语言的桥梁,将不同的通信协议和接口有效转换,确保信息的准确、高效传输。E1协议转换器的核心作用在于将E1信......