技术文档

单片机有多少口 详解单片机中的串行口

小编 2025-08-20 技术文档 23 0

详解单片机中的串行口

(此处已添加圈子卡片,请到今日头条客户端查看)

单片机内部有一个功能强大的全双工串行口,该串行口有四种工作方式,以供不同场合使用。波特率可由软件设置,由片内的定时器/计数器产生。串行口接收、发送均可工作在查询方式或中断方式,使用十分灵活。

单片机的串行口除了用于数据通信之外,还可以用来驱动单片机应用系统中的键盘和显示器,这是其他微机系统所不能比拟的。

串行口的结构与控制

为了进行串行数据通信,单片机同样也需要相应的串行接口电路。不过这个接口电路不是单独的芯片,而是集成在单片机芯片的内部,成为单片机芯片的一个组成部分。

80C51单片机内部的串行口,由发送缓冲寄存器 SBUF、接收缓冲寄存器 SBUF、发送控制寄存器、接收控制寄存器、输入移位寄存器和输出控制门组成。控制单片机串行口的控制寄存器共有两个:特殊功能寄存器 SCON 和 PCON,可以用软件改变两者的内容来控制串行口的工作方式和波特率。

缓冲寄存器SBUF

80C51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器SBUF,这两个在物理上是独立的接收发送器,既可以接收数据,也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,两个缓冲器共用同一个地址(99H)。

这个通信口既可用于网络通信,也可实现串行异步通信,还可以当成同步移位寄存器使用。如果在通信口的输入输出引脚上加上电平转换器,还可方便地构成标准的RS-232和RS-485接口。

在逻辑上,SBUF只有一个,既表示发送寄存器,又表示接收寄存器,具有同一个地址(99H)。在物理上,SBUF有两个,一个是发送寄存器,另一个是接收寄存器。

串行口控制寄存器SCON

该寄存器的字节地址为98H,有位寻址功能。

SCON格式如下:

SM0(SCON.7)、SM1(SCON.6):控制串行口的工作方式。

SM2(SCON.5):允许方式2和方式3进行多机通信控制位。在方式2或方式3中,如SM2=1,则接收到的第9位数据(RB8)为0时不激活RI。在方式1时,如SM2=1,则只有收到有效停止位时才会激活RI。若没有接收到有效停止位,则RI清0。在方式0中,SM2必须置为0。

REN(SCON.4):允许串行接收控制位。REN=1允许串行接收,REN=0则禁止串行接收。该标志由软件来置1或清0。

TB8(SCON.3):是工作在方式2和方式3时,该位是要发送的第9位数据。在一些通信协议中该第9位用于奇偶校验(补奇或补偶);而在MCS-51多处理机通信中,这一位是区别地址帧还是数据帧的标志,需要时由软件置位或复位。

RB8(SCON.2):是工作在方式2和方式3时,该位是已接收到的第9位数据,它是奇偶校验位。在MCS-51多处理机通信中是区别地址帧/数据帧的标志。在模式1中,若SM2=0,RB8存放的是已接收数据的停止位。在模式0中,RB8未用,需要时由软件来置1或清0。

TI(SCON.1):发送中断标志位。在模式0中,发送完第8位数据时由硬件置位;在其他模式中发送停止位开始时刻由硬件置位。置位时TI=1,申请中断,CPU响应中断后,由软件来清除TI再发送下一帧数据。

RI(SCON.0):接收中断标志位。在模式0中,接收完第8位数据时由硬件自动置位;在模式 1 中,SM2=1,只有接收到有效的停止位,才能对 RI 置位。在其他模式中,在接收停止位的半中间由硬件对RI置位。置位时申请中断,CPU响应中断后取走数据,清除RI标志,必须由软件清零。

SCON的所有位复位时被清零。

特殊功能寄存器PCON

其字节地址为87H,没有位寻址功能。PCON的格式如下:

其中与串行接口有关的只有D7位。

SMOD:波特率选择位。

串行口的工作方式

串行口有四种工作方式,它们是由串行口控制寄存器 SCON 的 SM0、SM1的状态来定义的,编码及功能如表2-3所示。在这四种工作方式中,串行通信只使用方式1、2、3。方式0主要用于扩展并行输入/输出口。

表2-3 串行口工作方式

表中:fosc为晶振频率,UART为通用异步接收和发生器。

方式0

在方式 0 状态下,串行口为同步移位寄存器输入/输出方式,其波特率是固定不变的,数据由RxD(P3.0)端输入,同步移位脉冲由TxD(P3.1)端输出。方式0主要用于扩展并行输入输出口(如串行LED数码管显示系统等)。

(1)方式0发送

当一个数据写入串行口发送缓冲器SBUF时,串行口即将8位数据以fosc/12的波特率从RxD引脚输出(从低位到高位),发送完8位数据时,将发送中断标志TI置1。TxD引脚输出同步脉冲,波形如图2-22所示。

(2)方式0接收

在满足REN=1和RI=0的条件下,就会启动一次接收过程,此时RxD为串行输入端,TxD为同步脉冲输出端。串行接收的波特率为fosc/12,其时序如图2-23所示。当接收完一帧数据(8位)后,控制信号复位,中断标志 RI 被置 1,呈中断申请状态。当再次接收时,必须通过软件将RI清零。

▲图2-22 串行口“方式0”发送时序

▲图2-23 串行口“方式0”接收时序

在方式0中,SCON中的TB8、RB8位没用,多机通信控制位SM2位必须为0。在方式0下发送或接收完8位数据时,由硬件置1并发送中断标志TI或RI,向CPU申请中断,CPU响应TI或RI中断后,标志TI或RI必须由用户程序清0。

方式1

串行口以方式1工作时,SCON中的SM0、SM1两位分别为0、1,则串行口被控制为波特率可变的8位异步通信接口。发送的每帧信息为10位:1位起始位,8位数据位(先低位后高位)和1位停止位。

(1)方式1发送

串行口以方式1发送时,数据由TxD端输出,CPU执行一条数据写入发送数据缓冲器SBUF的指令,数据字节写入SBUF后,就启动串行口发送器发送。发送完一帧信息的数据位后,发送中断标志置1,其时序如图2-24所示。

▲图2-24 串行口“方式1”发送时序

(2)方式1接收

当REN=1时,允许接收器接收,数据从RxD端输入。接收器以所选波特率的16倍速率采样RxD端的电平,当检测到RxD端从1到0的跳变时,启动接收器接收,并复位内部的16分频计数器,以便实现同步。

在起始位,如果接收到的值不为0,则起始位无效,复位接收电路,当再次接收到一个由1到0的跳变时,重新启动接收器。如果接收值为0,则起始位有效,接收器开始接收本帧的其余信息(一帧信息为10位)。在方式1接收中,若同时满足以下两个条件:RI=0、SM2=0和接收到的停止位=1时,则接收数据有效,实现装载SBUF、停止位进入PB8、接收中断标志RI置1。接收控制器再次采样RxD的负跳变,以便接收下一帧数据。

若这两个条件不能同时满足,信息将丢失。中断标志RI必须由用户的软件清零,通常情况下,串行口以方式1工作时,SM2置为0。方式1的接收时序如图2-25所示。

▲图2-25 串行口“方式1”接收时序

方式2

当SM0、SMl两位分别为1、0时,串行口工作在方式2,此时串行口被定义为9位异步通信接口。发送时可编程位(TB8)根据需要设置为0或1,接收时,可编程位被送入SCON中的RB8。

(1)方式2发送

在方式2发送时,数据由TxD端输出,发送一帧信息由11位组成:1位起始位、8位数据位(低位在先、高位在后)、1位可编程位(第9位数据位)和1位停止位,附加的第9位数据为 SCON中的 TB8。TB8由软件置 1 或清 0,可作为多机通信中的数据标志位,也可作为数据的奇偶校验位。

CPU在执行一条写SBUF的指令后,便立即启动发送器发送,送完一帧信息后,TI被置1,其时序如图2-26所示。在发送下一帧信息之前,TI必须由中断服务程序(或查询程序)清0。

▲图2-26 串行口“方式2”发送时序

(2)方式2接收

当 SM0、SMl两位分别为1、0,且 REN=1 时,允许串行口以方式 2 接收数据。数据由 RxD端输入,接收11位信息:1位起始位、8位数据位、1位可编程位(第9位数据)和1位停止位。当接收器采样到RxD端从1到0的跳变,并判断起始位有效后,便开始接收一帧信息。当接收器接收到第9位数据后,如果RI=0且SM2=0或接收到的第9位数据为1时,接收到的数据送入SBUF,第9位数据送入RB8,并置RI=1,其时序如图2-27所示。若不能同时满足这两个条件,接收的信息将丢失。

▲图2-27 串行口“方式2”接收时序

方式3

当SM0、SM1两位为11时,串行口工作在方式3,方式3为波特率可变的9位异步通信方式,除了波特率外,方式3和方式2的发送时序和接收时序相同。

波特率的计算与串行口初始化

波特率的计算

在串行通信中,收发双方的波特率必须保持一致。通过软件可设定串行口的4种工作方式,并确定每种方式的波特率。

(1)方式0的波特率是固定的,为单片机晶振频率fosc的1/12,即BR=fosc/12。

如fosc=6MHz,则波特率500kbit/s;如fosc=12MHz,则波特率为1Mbit/s。

(2)方式 2 的波特率也是固定的,且有两种。一种是晶振频率的 1/32,另一种是晶振频率的1/64,即fosc/32和fosc/64。如用公式表示为:

式中,SMOD为特殊功能寄存器PCON串行口波特率系数的控制位,SMOD=1表示波特率加倍。注意,PCON不能使用位寻址,只能对其进行字节操作。

如12M晶振系统中,若SMOD=0,则波特率=187.5kbit/s;SMOD=1,则波特率375kbit/s。

(3)方式1和方式3的波特率是可变的,其波特率由定时器1的计数溢出(对80C52来说,也可使用定时器2的计数溢出)决定,公式为:

式中定时器1溢出率计算公式为:

各种方式波特率的计算如表2-4所示。

表2-4 波特率的计算公式

表中,若SMOD=0,则K=1;若SMOD=1,则K=2。

通常使用单片机的串行口时,选用的晶振频率 fosc比较固定(一般为 6MHz , 12MHz 或11.0592MHz)。单片机和微机通信时,选用的波特率也相对固定。

实际使用中,经常根据已知波特率和时钟频率来计算定时器T1的初值。为方便使用,将常用的波特率和初值X间的关系列成表2-5。

表2-5 常用通信方式及其波特率

其中有以下三点需要注意。

(1)表2-5中仅为一些特定系统串口通信时的典型数据,对于其他一些未列出的波特率,应通过前述公式进行计算获取。并可进行相关参数调整,以获得需求的波特率。

(2)在使用的时钟振荡频率为12MHz或6MHz时,表中初值X和相应的波特率之间有一定误差。例如,FDH的对应的理论值是10416波特(时钟振荡频率为6MHz时),与9600波特相差816波特,消除误差可以通过调整时钟振荡频率 fosc来实现。例如,如果采用的时钟振荡频率为11.0592MHz,在要求串行通信的系统中,为保证串行通信准确,一般使用11.0592Hz的晶振。

(3)如果串行通信选用很低的波特率,可将定时器T1设置为方式1定时。但T1溢出时,需要在中断服务程序中重新装入初值。中断响应时间和执行指令时间也会使波特率产生一定的误差,可用改变初值的方法进行适当调整。

串行通信的校验

异步通信时可能会出现帧格式错、超时错等传输错误。在具有串行口的单片机的开发中,应考虑在通信过程中对数据差错进行校验,因为差错校验是保证准确无误通信的关键。常用差错校验方法有奇偶校验(80C51系列单片机编程采用此法)、和校验及循环冗余码校验等。

(1)奇偶校验

在发送数据时,数据位尾随的一位数据为奇偶校验位(1或0)。当设置为奇校验时,数据中1的个数与校验位1的个数之和应为奇数;当设置为偶校验时,数据中1的个数与校验位中1的个数之和应为偶数。接收时,接收方应具有与发送方一致的差错检验设置,当接收一个字符时,对 1的个数进行校验,若二者不一致,则说明数据传送出现了差错。

奇偶校验是按字符校验,数据传输速度将受到影响。这种特点使得它一般只用于异步串行通信中。

(2)和校验

所谓和校验,是指发送方将所发送的数据块求和(字节数求和),并产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时也是先对数据块求和,将所得结果与发送方的校验和进行比较,相符则无差错,否则即出现了差错。这种和校验的缺点是无法检验出字节位序的错误。

(3)循环冗余码校验

这种校验是对一个数据块校验一次。例如对磁盘信息的访问、ROM或RAM存储区的完整性等的检验。这种方法广泛应用于串行通信方式。

串行口初始化

在使用单片机串行口之前,应对其进行编程初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制,具体步骤如下。

(1)确定定时器l的工作方式——编程TMOD寄存器。

(2)计算定时器l的初值——装载THl、TLl。

(3)启动定时器1——编程TCON中的TRl位。

(4)确定串行口的控制——编程SCON。

(此处已添加圈子卡片,请到今日头条客户端查看)

详解51单片机基本硬件结构

硬件结构

单片机的内部结构是由CPU、ROM、RAM等组成,现在介绍外部引脚。如图1-3所示为单片机的引脚图,这就是实验中要用的89C51单片机的外部引脚图。如表1-3所示为89C51单片机引脚分配表。

图1-3 89C51单片机的引脚图

表1-3 89C51单片机引脚分配表

端口结构分析

从1.3.1节的硬件结构中可以看出,89C51单片机总共有4组端口,P0、P1、P2和P3,了解这4组端口的结构原理对于日后的编程会有很大的帮助,由于这4组端口结构不尽相同,下面分别介绍单片机总的4组端口。由于每组端口都是由8位组成,故在下面的讲解中,只以每组端口的其中一位来解释。

1. P0口的结构及工作原理

P0口字节地址为80H,位地址80H~87H。P0端口8位中的一位结构图如图1-4所示。

图1-4 P0端口位结构图

由图1-4可见,P0端口由锁存器、输入缓冲器、多路开关、一个非门、一个与门及场效应管驱动电路构成。图1-4中标号为P0.X引脚的图标,表示引脚可以是P0.0~P0.7的任何一位,即在P0口有8个与图1-4所示相同的电路组成。下面先介绍组成P0口的每个单元部分。

(1)输入缓冲器

在P0口中,有两个三态的缓冲器,学过数字电路的读者都知道三态门有3个状态,即在其输出端可以是高电平、低电平,同时还有一种高阻状态(或称为禁止状态),图1-4中,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,需要使读锁存器中这个缓冲器的三态控制端(图1-4中标号为“读锁存器”端)有效,下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为“读引脚”的三态缓冲器的控制端有效,引脚上的数据才会传输到单片机的内部数据总线上。

(2)D锁存器

构成一个锁存器,通常要用一个时序电路(时序的单元电路内容请参考数字电路相关知识),一个触发器可以保存一位二进制数(即具有保持功能),在51单片机的32根I/O口线中,都是用一个D触发器来构成锁存器的。图1-4中的D锁存器,D端是数据输入端,CP是控制端(即时序控制信号输入端),Q是输出端,

是反向输出端。

对于D锁存器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(即时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端

的。如果时序控制端CP的时序脉冲到达,这时D端输入的数据就会传输到Q及

端。数据传送过来后,当CP时序控制端的时序信号消失时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来)。如果下一个时序控制脉冲信号到来,这时D端的数据才再次传送到Q端,从而改变Q端的状态。

(3)多路开关

在51单片机中,当内部的存储器够用时(即不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器),P0口可以作为通用的输入/输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机,或者编写的程序超过了单片机内部的存储器容量需要外扩存储器时,P0口就作为地址/数据总线使用。那么这个多路选择开关就是用于选择是作为普通I/O口使用还是作为地址/数据总线使用的选择开关了。从图1-4可知,当多路开关与下端接通时,P0口作为普通的I/O口使用;当多路开关是与上端接通时,P0口作为地址/数据总线使用。

(4)输出驱动

从图1-4中可看出,P0口的输出是由两个MOS管组成的推拉式结构,也就是说,这两个MOS管一次只能导通一个,当Vl导通时,V2截止,当V2导通时,Vl截止。

上面已对P0口的各单元部件进行了详细的讲解,下面研究一下P0口作为I/O口及地址/数据总线使用时的具体工作过程。

(1)作为I/O端口使用时的工作原理

P0口作为I/O端口使用时,多路开关的控制信号为0(低电平),如图1-4所示,多路开关的控制信号同时和与门的一个输入端相接,与门的逻辑特点是“全l出1,有0出0”,那么控制信号如果是0,这时与门输出的也是一个0(低电平),此时Vl管就截止,在多路控制开关的控制信号是0(低电平)时,多路开关是与锁存器的端相接的(即P0口作为I/O口线使用)。

P0口用作I/O口线,其由数据总线向引脚输出(即输出状态Output)的工作过程:写锁存器信号CP有效,数据总线的信号的输出流程为锁存器的输入端D→锁存器的反向输出

端→多路开关→V2管的栅极→V2管的漏极→输出端P0.X。前面已经介绍过,当多路开关的控制信号为低电平0时,与门输出为低电平,Vl管是截止的,所以作为输出口时,P0是漏极开路输出状态,类似于OC门,当驱动上接电流负载时,需要外接上拉电阻。如图1-5所示就是由内部数据总线向P0口输出数据的流程图。

图1-5 P0口内部数据总线向引脚输出时的流程图

P0口用作I/O口线,其由一引脚向内部数据总线输入(即输入状态Input)的工作过程,数据输入时(读P0口)有以下两种情况:

第一种情况是读引脚,即读芯片引脚上的数据。读引脚数时,读引脚缓冲器打开(即三态缓冲器的控制端要有效),通过内部数据总线输入。如图1-6所示为P0口读引脚时的流程图。

图1-6 P0口读引脚时的流程图

第二种情况是读锁存器,通过打开读锁存器三态缓冲器读取锁存器输出端Q的状态。如图1-7所示为P0口读锁存器时的流程图。

图1-7 P0口读锁存器时的流程图

在输入状态下,从锁存器和从引脚上读取的信号一般是一致的,但也有例外。例如,当从内部总线输出低电平后,锁存器Q=0,

=l,场效应管V2开通,端口线呈低电平状态,此时无论端口线上外接的信号是低电平还是高电平,从引脚读入单片机的信号都是低电平,因而不能正确地读入端口引脚上的信号。又如,当从内部总线输出高电平后,锁存器Q=1,

=0,场效应管V2截止,如果外接引脚信号为低电平,从引脚上读入的信号就与从锁存器读入的信号不同。为此,8031单片机在对端口P0~P3的输入操作有如下约定:凡属于读—改—写方式的指令,从锁存器读入信号,其他指令则从端口引脚线上读入信号。读—改—写指令的特点是,从端口输入(读)信号,在单片机内加以运算(修改)后,再输出(写)到该端口上。下面是几条读—改—写指令的示例。

ORL P0, A P0→AP0

INC P1 P1+1→P1

DEC P3 P3-1→P3

CPL P2 P2→P2

这样安排的原因在于读—改—写指令需要得到端口原输出的状态,修改后再输出,读锁存器而不是读引脚,可以避免因外部电路的原因使原端口的状态被读错。

注意: P0端口是8031单片机的总线口,分时出现数据D7~D0、低8位地址A7~A0以及三态,用来连接存储器、外部电路与外部设备。P0端口是使用最广泛的I/O端口。

(2)作为地址/数据复用口使用时的工作原理

在访问外部存储器时,P0口作为地址/数据复用口使用,这时多路开关控制信号为l,与门解锁,与门输出信号电平由地址/数据线信号决定;多路开关与反相器的输出端相连,地址信号经地址/数据线→反相器→V2场效应管栅极→V2漏极输出。例如,控制信号为l,地址信号为0时,与门输出低电平,Vl管截止;反相器输出高电平,V2管导通,输出引脚的地址信号为低电平。如图1-8所示为P0口作为地址线,控制信号为1,地址信号为0时的工作流程图。

图1-8 P0口作为地址线,控制信号为1,地址信号为0时的工作流程图

反之,控制信号为l、地址信号为l,与门输出为高电平,Vl管导通;反相器输出低电平,V2管截止,输出引脚的地址信号为高电平。如图1-9所示为P0口作为地址线,控制信号为1,地址信号为1时的工作流程图。

图1-9 P0口作为地址线,控制信号为1,地址信号为1时的工作流程图

可见,在输出地址/数据信息时,Vl、V2管是交替导通的,负载能力很强,可以直接与外设存储器相连,无须增加总线驱动器。P0口又作为数据总线使用,在访问外部程序存储器时,P0口输出低8位地址信息后,将变为数据总线,以便读指令码(输入)。在存取指令期间,控制信号为0,Vl管截止,多路开关也跟着转向锁存器反相输出端

;CPU自动将0FFH(11111111,即向D锁存器写入一个高电平1)写入P0口锁存器,使V2管截止,在读引脚信号控制下,通过读引脚三态门电路将指令码读到内部总线。如图1-10所示为P0口作为数据总线,取指期间工作流程图。

图1-10 P0口作为数据总线时取指期间工作流程图

如果该指令是输出数据,如“MOVX@DPTR,A”,该指令将累加器的内容通过P0口数据总线传送到外部RAM中,则多路开关控制信号为1,与门解锁,与输出地址信号的工作流程类似,数据由地址/数据线→反相器→V2场效应管栅极→V2漏极输出。

如果该指令是输入数据(读外部数据存储器或程序存储器),如“MOVX A,@DPTR”,该指令将外部RAM某一存储单元内容通过P0口数据总线输入到累加器A中,则输入的数据仍通过读引脚三态缓冲器到内部总线,其过程类似于读取指令码流程图。

通过以上分析可以看出,当P0作为地址/数据总线使用时,在读指令码或输入数据前,CPU自动向P0口锁存器写入0FFH,破坏了P0口原来的状态。因此,不能再作为通用的I/O端口。

注意: 系统设计中务必注意,程序中不能再含有以P0口作为操作数(包含源操作数和目的操作数)的指令。

当由P0口输入数据时,由于外部输入信号既加在缓冲输入端上,又加在驱动电路的漏极上。如果这时T2是导通的,则引脚上的电位始终被钳位在0电平上,输入数据不可能被正确地读入。因此,在输入数据时,应先把P0口置1,使两个输出FET均关断,使引脚“浮置”,成为高阻状态,这样才能正确地插入数据,这就是准双向口。

I/O口作为输入口时有两种工作方式,即读端口与读引脚,读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器,只有读端口时才真正地把外部的数据读入到内部总线,图1-10中的两个三角形表示的就是输入缓冲器,CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作,这是由硬件自动完成的。读引脚时,就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置1,然后再进行读引脚操作,否则就可能读入出错,为什么?看图1-10中,如果不对端口置1,端口锁存器原来的状态有可能为0,Q端为0,

端为1,加到场效应管栅极的信号为1,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低,使得外加的1信号读入后不一定是1,若先执行置1操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口,89C51的P0、P1、P2、P3口作为输入时都是准双向口。接下来再看另一个问题,从图1-10中可以看出,这4个端口还有一个差别,除了P1口外,P0、P2、P3口都还有其他功能,这些功能又作什么用的呢?下面就来详细讲解这个问题。

每个I/O端口都有一个8位数据锁存器和两个8位数据缓冲器。P0~P3(8位锁存器)是SFR,有各自的端口地址,可直接用指令寻址,用于存放需要输出的数据。数据输入时只有缓冲没有锁存,各引脚上输入的数据必须一直保持到CPU将其读走为止,如图1-11所示为P0位结构图。

图1-11 P0位结构图

从图1-11中可以看出,P0口的内部有一个二选一的选择器,受内部信号的控制,如果在图1-11中的位置,则处在I/O口工作方式,此时相当于一个准双向口输入,须先将P0口置1,每根口线可以独立定义为输入或输出,但是必须在口线上加上拉电阻,如果将开关拨向另一个方向,则作为地址/数据复用总线用,此时不能逐位定义为输入/输出,有两种用法,当作数据总线用时输入8位数据,当作地址总线用时则输出低8位地址,注意,当P0口作为地址/数据复用总线用之后就不能再作I/O口使用了。那么什么叫做地址/数据复用?这其实是当单片机的并行口不够用时需要扩展输入/输出口时的一种用法,具体使用方法会在后续的章节中逐步讲解。

利用P0口进行扩展外部存储器和I/O时,P0口将作为地址和数据分时复用,CPU发控制信号,打开与门,使MUX打向上边,形成推拉式结构,数据信号可直接读入或输出到内部总线。利用P0作为通用I/O时,此时P0口是一个准双向口,CPU发控制信号,封锁与门,使上拉管截止,MUX打向下边,与D触发器Q连接。

输入程序举例:

MOV P0, #FFH

输出程序举例:

MOV A, P0

2. P1口的结构及工作原理

P1口字节地址为90H,位地址为90H~97H,如图1-12所示为P1位结构图。

图1-12 P1位结构图

与P0不同,P1口只能作为I/O口使用,无MUX,但其内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1、P2、P3都一样。

输入程序举例:

MOV P1, #FFH

MOV A, P1

输出程序举例:

MOV A, P1

3. P2口的结构及工作原理

P2口字节地址为A0H,位地址为A0H~A7H,如图1-13所示为P2位结构图。

图1-13 P2位结构图

P2口作为I/O口线时用法与P0口一样,当内部开关拨向另一个方向,即作地址输出时,可以输出程序存储器或外部数据存储器的高8位地址,并与P0口输出的低地址一起构成16位的地址线。

注意: 和数据总线的区别,数据总线是8位的,很多书上都会提到51单片机是8位数据总线,16位地址总线,但都不会解释有什么不同,看到这里读者应该明白二者的区别。

16位的地址总线可以寻址64KB的程序存储器或外部数据存储器,后续章节会讲解,此处要注意的是当P2口作为地址总线时,高8位地址线是8位一起输出的,不能像I/O口线那样逐位定义,这与P0口是一样的。

当P2口用来扩展外存储器和I/O时,作为高8位地址输出,当进行外部存储器或I/O设备读写操作时,CPU自动发出控制信号,打开与门,使MUX拨向上边。当P2口当作通用I/O时,CPU自动发出控制信号,MUX拨向下边,与D触发器Q连接。

输入程序举例:

MOV P2, #FFH

MOV A, P2

输出程序举例:

MOV A, P2

4. P3口的结构及工作原理

P3口字节地址为B0H,位地址为B0H~B7H。如图1-14所示为P3位结构图。

图1-14 P3位结构图

P3口作为I/O口线用时同其他的端口相同,也是准双向口,不同的是,P3口的每一位都有另一种功能,也叫第二功能,具体作用在用到时将详细解释。当P3口作为通用I/O口时,准双向口第二功能端保持高电平。

输入程序举例:

MOV P3, #FFH

MOV A, P3

输出程序举例:

MOV A, P3

当P3口作为第二功能时,锁存器输出Q=1,如表1-4所示为P3口第二功能列表。

表1-4 P3口第二功能列表

既然单片机的引脚有第二功能,那么CPU是如何识别的呢?这是一个令许多初学者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU执行到相应的指令,就自动转成了第二功能。

思考: 输入和输出口简称I/O口,是单片机与外部电路接口的唯一途径,4个并行口的结构是有一定区别的,如何根据系统的设计要求和产品用途来正确灵活地使用是初学者必须掌握的基本功,还需要清楚其功能和用途。

5. 应用注意事项

(1)在无片外扩展存储器的系统中,这4个端口的每一位都可以作为准双向通用I/O端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口作为双向总线,分时作为低8位地址和数据的输入/输出线。

(2)P0口作为通用双向I/O口使用时,必须外接上拉电阻。

(3)P3口除了作通用I/O口使用外,各位还具有第二功能。当P3口某一位用于第二功能作输出时,则不能再作通用I/O口使用。

(4)当P0~P4端口用作输入时,为了避免误读,都必须先向对应的输出锁存器写入1,使FET截止,然后再读端口引脚,例如以下程序:

MOV P1, #0FFH

MOV A, P1

相关问答

一个c51 单片机 怎么有人说有4个io ,有人说32个io口,到底 多少 ...

[最佳回答].一共有32个IO口,分四个组!所以一组是8个!(这里指的是AT89S51等)AT892051的IO口是少点!

MSC-51 单片机 一共有几个P ?

MSC-51单片机一共有4个并行口,分别为P0,P1,P2,P3。每个并口有8个IO脚,各并行口可以8个引脚同时使用,输入/输出8位数据。也可以每个IO脚单独使用,做外部检...M...

什么是PO 口单片机 的一个部件,麻烦介绍下它都有哪些规格,参...

[最佳回答]P0口是单片机的一个IO口用于与外界进行信息的交换,可以作为普通的IO口,此时为漏极开路,要输出高电平必须加上拉电阻,PO口还可以作为地址的低8位的输...

我可以问个问题么。就是 单片机 的IO ( P0,P1,P2,P3),在进行十六进制编码的时候,高四位,低四位是怎么看的。比如说P0 ,八个引脚,P0.0 -P0.3,P0.4-P0.7对应一个十六进制的数比如0x31,“3”是高四位么,对应P0哪 几个 引脚呢,这里面 什么对应规则原理?

单片机 A口B 口有 什么区别?

说AB口的,一般不太像是51单片机,可能是51的外围组件也可能是其他类型的单片机,不同的单片机在这些口的设计上面差别很大,你最好给出单片机或者器件的具体型号...

at89c51 单片机 p0 一次可以输出几字节?

我不懂你在问什么,对于逻辑信号来说,接口只能输出0或1,或输入0或1,即低电平或高电平,我不懂你在问什么,对于逻辑信号来说,接口只能输出0或1,或输入0或1,即低...

单片机 的IO 是不是既可以串行使用也可以并行使用?

是的。所有的I/O都可以并行使用也可以串行使用,但串行使用要看情况,如果单片机内部具有诸如UART、I2C、SPI硬件模块的,可以通过对模块进行配置而直接使用。如...

51 单片机 串行 每次传送 多少 字节?

51单片机串行口每一次传送多少字符?--最基本的,当然是一个字符。也就是一个字节。也称为一帧。--这一个字符,通常是:一个起始位、8个数据...

51 单片机有 哪几个IO 可以位寻址?

在51单片机中,有三个IO口可以进行位寻址,分别是P0、P1和P2。其中,P0口可以通过特殊功能寄存器TCON中的P0M1和P0M0位来设置为准双向或纯输出模式,作为8位的输...

单片机 中的双向 的主要特征有?

单片机中的双向口是一种具有输入和输出功能的通用口线。它的主要特征包括:1.可以通过编程设置为输入或输出模式;2.可以读取外部信号或向外部设备发送信号;3...

猜你喜欢