80C51单片机有4个8位的并行I/O接口,分别是P0、P1、P2和P3。各口都是由口锁存器、输出驱动器和输入缓冲器组成。各口编址于特殊功能寄存器中,既有字节地址又有位地址。对各口锁存器的读写,就可以实现口的输入/输出操作。

当不需要外部程序存储器和数据存储器扩展时,P0口、P2口可用作通用的输入/输出口;

当需要外部程序存储器和数据存储器扩展时,P0口作为分时复用的低8位地址/数据总线,P2口作为高8位地址总线。

P1口是80C51唯一的单功能口,仅能用作通用的数据输入/输出口。

虽然每口的功能不同,结构也存在一些差异,但每个口的位结构是相同的。所以,口结构就以其位结构进行说明。

P0口的结构

P0口由一个输出锁存器、一个转换开关MUX、两个三态输入缓冲器、输出驱动电路、一个与门和一个反相器组成。当C=0时,开关处于图中所示位置;当C=1时,开关拨向反相器输出端位置。

P0用作通用I/O口(C=0)

当系统不进行片外ROM扩展(即EA=1),也不进行片外RAM扩展时,P0用作通用I/O接口。在这种情况下,单片机硬件自动使控制C=0,MUX开关接向锁存器的反相输出端。另外,与门输出的“0”使输出驱动器的上拉场效应管T1处于截止状态。因此,输出驱动级工作在需要外接上拉电阻的漏极开路方式。

作输出口时,CPU执行口的输出指令,内部数据总线上的数据在“写锁存器”信号的作用下由D端进行锁存器,经锁存器的反相端送至场效应管T2,再经T2反相,在P0.X引脚出现的数据与内部总线的数据正好一致。

作输入口时,数据可以读自口的锁存器,也可以读自口的引脚。这时要根据输入操作采用的是“读锁存器”指令还是“读引脚”指令来决定。

CPU在执行“读—修改—写”类输入指令时(如:ORL P0,A),内部产生的“读锁存器”操作信号,使得锁存器Q端数据进入内部数据总线,在与累加器A进行逻辑运算之后,结果又送回P0的口锁存器并出现在引脚上。读口锁存器可以避免因外部电路原因使原口引脚的状态发生变化造成的误读(例如,用一根口线驱动一个晶体管的基级,在晶体管的射极接地的情况下,当向口线写“1”时,晶体管导通,并把引脚的电平拉低到0.7V。这时若从引脚读数据,会把状态为1的数据误读为“0”。若从锁存器读,则不会读错)。

CPU在执行“MOV”类输入命令时(如,MOV A,P0),内部产生的操作信号是“读引脚”。这时一定要注意,在执行该类输入指令前要先给锁存器写入“1”,目的是使场效应管T2截止,使引脚处于悬浮状态,可以作为高阻抗输入;否则,在作为输入方式之前曾向锁存器输出过“0”,T2导通会使引脚钳位在“0”电平上,使输入高电平“1”无法接入。所以,P0口在作为通用I/O口时,属于准双向口。

P0用作地址/数据总线(C=1)

当系统进行片外ROM扩展(即EA=0)或进行片外RAM扩展(外部RAM传送使用“MOVX@DPTR”或“MOVX@Ri”类指令)时,P0口不再做I/O口使用,而是先传送地址,后传送数据。

CPU在执行输出指令时,低8位地址信息和数据信息分别地出现在地址/数据总线上。若地址/数据总线的状态为“1”,则场效应管T1导通,T2截止,引脚状态为“1”;若地址/数据总线的状态为“0”,则场效应管T1截止,T2导通,引脚状态为“0”。因此,P0.X引脚的状态正好与地址/数据线的信息相同。

CPU在执行输入指令时,首先低8位地址信息出现在地址/数据总线上,P0.X引脚的状态与地址/数据总线的地址信息相同。然后,CPU自动地使转换开关MUX拨向锁存器,并向P0口写入FFH,同时“读引脚”信号有效,数据经缓冲器进入内部数据总线。

由此可见,P0口作为地址/数据总线时是一个真正的双向口。

小结:P0口作为通用I/O口时,属于准双向口;作为地址/数据复用总线使用时是一个真正的双向口。

P1口结构

P1口由一个输出锁存器、两个三态输入缓冲器和输出驱动电路组成。

P1口是一个“单一的准双向通用I/O口”,驱动能力为4个LS型TTL负载。其输出驱动电路接有上拉电阻,故可以直接输出而无需外接上拉电阻。当口用作输入时,须向口锁存器先写入“1”。

P2口结构

P2口由一个输出锁存器、一个转换开关MUX、两个三态输入缓冲器、输出驱动电路和一个反相器组成。图中控制信号C的状态决定转换开关的位置。当C=0时,开关拨向锁存器输出端位置;当C=1时,开关拨向地址线位置。

P2口的输出驱动电路内部设有上拉电阻(由两个场效应管并联构成,图中用等效电阻表示)。

P2口是“通用数据I/O端口”和“高八位地址总线”端口,驱动能力为4个LS型TTL负载。

P3口结构

P3口由一个输出锁存器、三个输入缓冲器(其中两个为三态)、输出驱动电路和一个与非门组成。其输出驱动电路与P2口、P1口相同,内部设有上拉电阻。

P3用作第一功能的通用I/O口(进行字节或位寻址时)

当CPU对P3口进行字节或位寻址时(多数应用场合是把几条口线设为第二功能,另外几条口线设为第一功能,这时采用位寻址方式),单片机内部的硬件自动将第二功能输出线的W置1。这时,对应的口线为通用的I/O口方式。

作为输出时,锁存器的状态(Q端)与输出引脚的状态相同;作为输入时,也要先向口锁存器写入“1”,这时引脚处于高阻输入状态。输入的数据在“读引脚”信号的作用下,进入内部数据总线。所以,P3口在作为通用I/O口时,也属于准双向口。

P3用作第二功能使用(不进行字节或位寻址时)

当CPU不对P3口进行字节或位寻址时,单片机内部硬件自动将口锁存器的Q端置“1”。这时,P3口可以作为第二功能使用。各引脚的功能定义如下:

P3.0:RXD(串行口输入)

P3.1:TXD(串行口输出)

P3.2:INT0(外部中断0输入)

P3.3:INT1(外部中断1输入)

P3.4:T0(定时/计数器0的外部输入)

P3.5:T1(定时/计数器1的外部输入)

P3.6:WR(片外数据存储器“写”选通控制输出)

P3.7:RD(片外数据存储器“读”选通控制输出)

P3口相应的口线处于第二功能,应满足的条件是:

1)串行I/O口处于运行状态(RXD,TXD)

2)外部中断已经打开(INT0,INT1)

3)定时器/计数器处于外部计数状态(T0、T1)

4)执行读/写外部RAM的指令(RD、WR)

端口的驱动能力和接口要求

P0口:

P0口的输出级无上拉电阻,当把它用作通用I/O口时,输出级是开漏电路,故用其输出去驱动NMOS输入时须外接上拉电阻。

用作输入时,应先向口锁存器(80H)写“1”。

把它当做地址/数据总线时(片外扩展ROM或RAM的情况),则无须外接上拉电阻。

P0口的每一位输出可驱动8个LS型TTL负载。

P1~P3口:

P1~P3口的输出级接有内部上拉负载电阻,作为输出口时,无须外接上拉电阻;它们的每一位输出可驱动4个LS型TTL负载。

作为输入时,必须先对相应端口锁存器写1。

并口的负载能力

对于典型的单片机器件AT89S52,每根口线最大可吸收10mA(灌)电路;但P0口所有引脚吸收电流的总和不能超过26mA,P1、P2和P3口每个口吸收电流的总和限制在15mA,全部4个并口所有口线的吸收电流总和限制在71mA。

驱动输出设备

1)驱动发光二极管LED

考虑到单片机并口的结构,对于LED的驱动采用灌电流的方式。P1、P2和P3口由于内部有上拉电阻,在它们的引脚上可以不接外部上拉电阻,但P0口内部没有上拉电阻,其引脚必须加外部上拉电阻。

对于单个LED,限流电阻RL的值为270Ω时,LED可以得到较好的亮度,但单根口线的负载能力达到了极限,接几个LED时将超过并口的负载能力。解决方法之一就是加大限流电阻的阻值,这样亮度会变暗,但可以减小并口的负阻;第二种方法是增加驱动器件。

驱动多个LED时,通常将LED接成共阴极或共阳极形式。对于要求不高的场合可以采用直接驱动方法,由于并口的驱动能力,LED的亮度不够理想。若有较高的亮度要求,可以在LED与单片机并口之间加入74HC245缓冲驱动器。

2)驱动数码管

在七段LED数码管中,通常将各段发光二极管的阴极或阳极连在一起作为公共端,这样可以使驱动电路简单。

数码管的两种驱动方式为公共电阻限流和各路分别限流。公共电阻限流方法接线比较简单,不同字符时各导通二极管电流不均衡,但发光差别并不明显;各路分别限流时,导通二极管电流相近、亮度相近,但接线麻烦、占印刷电路板空间大。

3)驱动蜂鸣器

蜂鸣器是常用语单片机应用系统的电声转换器件,分为压电式和电磁式两种类型。单片机应用系统中常用的是电磁式蜂鸣器。电磁式蜂鸣器采用直流电压供电,接通电流后,流过电磁线圈的电流使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性振动并发出声音。

电磁式蜂鸣器又可分为两种类型,一是有源蜂鸣器,内部含有音频振荡电路,直接接上额定电压就可以连续发声;二是无源蜂鸣器,工作时需接入音频方波,改变方波频率可以得到不同音调声音。两种蜂鸣器驱动电路相同,只是驱动程序不同。

驱动输入设备

简单的输入设备有按键和拨动开关。对于按键开关,按键在闭合和断开时,触电会存在抖动现象。按键较少时可以采用硬件去抖电路,按键较多时采用软件延时消抖。

按键消抖:

通常的按键所用开关为机械弹性开关,当机械触电断开、闭合时,电压信号如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。

按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

硬件消抖:

下图所示的RS触发器为常用的硬件去抖。

图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0.此时即使用按键的机械性能,使按键因弹性抖动而产生瞬间断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。

利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:

抖动时间与键的机械特性有关,一般为5~10ms。当按键未闭合时,电容通过RC回路充电,使得电容充满电荷。当按键闭合后,利用电容两端电压无法突变的特性实现延时去抖,电容通过RC回路放电。电容短路是为了形成RC放电回路,这是一个动态过程。

典型硬件去抖电路(NE555)

其中,NE555的工作原理如下图所示:

软件消抖:

如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

80C51并行口结构与驱动 [附:按键消抖分析]相关推荐

  1. Linux驱动中按键消抖原理

    为什么要用定时器来做按键消抖? 用到按键就要处理因为机械结构带来的按键抖动问题,也就是按键消抖.前面的实验中都是直接使用了延时函数来实现消抖,因为简单,但是直接用延时函数来实现消抖会浪费 CPU 性能 ...

  2. ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

    参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...

  3. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...

  4. 28335学习笔记4——F28335之3*3按键控制(包含按键消抖和按键检测方法介绍)

    1.按键消抖 通常的按键所用开关为机械弹性开关,当机械触点断开. 闭合时, 电压信号如下图所示 由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开.在闭合和断开的瞬间均 ...

  5. verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)

    独立按键消抖设计与验证 本实验主要是为了锻炼状态机的思维模式以及熟练掌握TB的写法 本节主要收获了:define的用法,另外就是,顶层的input在TB中是reg的真正含义,其实就是把激励当做寄存器来 ...

  6. 基于verilog按键消抖设计

    关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...

  7. FPGA---多按键消抖检测

    在学习了单按键消抖方法后,按键消抖的关键点就是20ms的延时,这一点和单片机按键消抖的思路是一样的.但是FPGA的延时需要通过寄存器计数,这个是比较消耗内部资源的.如果要检测4个按键时,最简单的方法就 ...

  8. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

  9. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全

    写在前面: 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...

最新文章

  1. windows dos命令窗口的环境变量
  2. linux语法错误 未预期的文件结尾,centos shell运行报语法错误: 未预期的文件结尾...
  3. 如何成为一名有效的软件工程师
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 17丨文章浏览 I【难度简单】​
  5. Tomcat8 安装后点击startup出现闪退的解决方法(转)
  6. REVerb三元抽取工具
  7. linux中通用GPIO接口的操作
  8. 极客大学架构师训练营-架构师技术图谱-大作业二
  9. 【MTK 驱动开发---camera 基础知识1】
  10. 思科PC远程控制交换机和路由器
  11. rrpp协议如何修改_RRPP单环
  12. 苹果7系统更新后信号无服务器,最全iPhone7手机无服务故障解决办法分享,成功拯救苹果7无信号...
  13. 应用层HTTP数据包的截获与还原技术的实现
  14. 最小二乘法曲线拟合 C语言实现
  15. 求满足条件的数(数字和)
  16. 第一课:树莓派 刷机
  17. TrafficMonitor——简洁实用的网速/cpu/内存监控器
  18. 热门API接口它来啦 新鲜出炉
  19. 〖编程初学者的自我修养 - 优质简历篇⑦〗- 优质简历的撰写技巧之工作经历撰写技巧
  20. 记:关于输出任意占空比与频率的一种方式——基于STM32单片机

热门文章

  1. 技术分享 | 四旋翼丝滑“绕⼋”⾃主轨迹运动
  2. Laravel框架快速入门教程
  3. 西施、杨玉环两大美女穿越时空,同台竞技,争夺“乘风破浪的姐姐“称号。(java)
  4. 计算机专业演讲ppt,2015计算机专业学习建议演讲.ppt
  5. 3.5 图像几何变换——镜像变换
  6. LTH7五脚芯片的完整方案图
  7. 洛谷 P2431 正妹吃月饼
  8. 手机上带闹钟提醒的便签软件如何查看已完成的提醒事项?
  9. 赵小楼《天道》《遥远的救世主》深度解析(59)现实中到底存不存在芮小丹这样的女子?
  10. 星辰天合获得鲲鹏应用创新大赛 2022 北京区域赛决赛一等奖