第5章MCS-51单片机I/O接口的简单应用设计5.1I/O接口概述5.2I/O接口的功能和内部结构5.3I/O接口的编程5.4单片机与LED数码管的接口5.5单片机与键盘的接口5.1I/O接口概述1、什么是I/O接口?输入输出设备与主机的连接部分称为输入输出接口,简称I/O接口2、I/O接口的作用?输入/输出(I/O)接口是CPU与外设间交换信息的桥梁,单片机对外设进行数据操作时,必须经过I/O接口。分析输出输入指令(MOVX类)时序图:I/O接口的基本作用:输出锁存、输入缓冲一个简单应用实验+5VXTAL218XTAL119ALEEAPSEN29RST9P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.010P3.111P3.212P3.313P3.414P3.717P3.616P3.515P2.728P2.021P2.122P2.223P2.324P2.425P2.526P2.627U1AT89C51C130PFC230PFX1CRYSTALGNDC310uFR210kD1LED-GREENR2100图5-1单片机控制单灯闪烁电路图源程序:ORG0000HSJMPMAINORG0030HLOOP:SETBP1.0LCALLDELAYCLRP1.0LCALLDELAYAJMPLOOPDELAY:MOVR7,#250D1:MOVR6,#250D2:DJNZR6,D2JNZR7,D1RETEND5.2MCS-51单片机I/O接口的功能和内部结构5.2.1P0口的内部结构及功能11读锁存器内部总线写锁存器读引脚地址/数据控制&T1T2VccP0.x引脚MUX2DQCLP0.x锁存器11读锁存器内部总线写锁存器读引脚地址/数据控制&T1T2VccP0.x引脚MUX2DQCLP0.x锁存器QBUF1BUF2图5-2P0口的位结构图P0口的字节地址为80H。P0口既可以作为通用的I/O口使用,也可作为单片机系统的地址/数据线使用,所以在P0口的电路中有一个多路转换开关MUX。在内部控制信号的作用下,多路开关MUX可以分别接通锁存器输出和地址线/数据线。5.2.2P1口的内部结构及功能P1口的位结构的电路原理图P1口作通用I/O口使用的。其输出驱动部分与P0口不同,内部有上拉负载电阻与电源相连(没有高阻态)。在端口由输出口转为输入口时,必须先向对应的锁存器写入“1”(所以称为准双向口)。5.2.3P2口的内部结构及功能P2口的位结构的电路原理图P2口的字节地址为A0H。在实际应用中,因为P2口用于为系统提供高位地址,因此同P0口一样,在口电路中有一个MUX。但MUX的1个输入端不再是“地址/数据”,而是单一的“地址”,这是因为P2口只作为地址线使用。5.2.4P3口的内部结构及功能P3口的位结构的电路原理图P3口的字节地址为B0H。它也是一个双功能口,第一功能与P1口一样可用做通用I/O口,也是一个准双向I/O口。另外,由于MCS-51的引脚数目有限,因此在P3口电路中增加了引脚的第二功能。P3口的第二功能如下:5.3I/O接口的编程5.3.1I/O接口的编程操作方式MCS-51四个I/O端口共有三种操作方式:输出数据方式、读端口数据方式和读端口引脚方式。1、输出数据方式在数据输出方式下,CPU通过一条数据传送指令就可以把输出数据写入P0~P3的端口锁存器,然后通过输出驱动器送到端口引脚线。因此,凡是端口操作指令都能达到从端口引脚线上输出数据的目的,写入数据可直接输出到P0~P3端口引脚上。例如,下面的指令均可在P0口输出数据:MOVP0,AANLP0,#dataORLP0,A2、读端口数据方式读端口数据方式是一种仅对端口锁存器中的数据进行读入的操作方式,CPU读入的这个数据并非端口引脚上的数据。这类操作都是由对端口的“读-修改-写”指令来实现的,例如:ANLP1,#0FH3、读端口引脚方式利用读端口引脚方式可以从端口引脚上读入信息。在这种方式下,CPU首先必须使欲读端口引脚所对应的锁存器置1,以便使输出场效应管截止,然后打开输入三态缓冲器,使相应端口引脚上的信号输入MCS-51内部数据线。因此,用户在读引脚时,必须先置位锁存器后读,连续使用两个指令。例如,下面的程序可以读P1引脚上的低4位信号。MOVP1,#0FH;置位P1引脚的低4位锁存器MOVA,P1;读P1引脚上的低4位信号读累加器A应当指出,MCS-51内部4个I/O端口既可以字节寻址,也可以位寻址,每位既可以用做输入,也可以用做输出。下面举例说明它们的使用方法。硬件电路如图5-6所示,单片机的P1口接8个LED发光二极管,试编写程序实现8个发光二极管循环点亮,即实现发光二极管组成的流水灯控制。XTAL218XTAL119ALE30EA31PSEN29RST9P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.010P3.111P3.212P3.313P3.414P3.717P3.616P3.515P2.728P2.021P2.122P2.223P2.324P2.425P2.526P2.627U1AT89C51C130PFC230PFX1CRYSTALD1VCCGNDC310uFR210kD2D3D4D5D6D7D812345678161514131211109RN11005.3.2I/O接口编程实例:发光二极管的应用图5-6流水控制LED的硬件电路图完整的程序如下:ORG0000HJMPMAINORG0030HMAIN:MOVA,#0FFH;设置左移初值CLRC;C=0MOVR2,#08H;设置左移次数LOOP:RLCA;左移1位MOVP1,A;输出到P2CALLDELAY;延时DJNZR2,LOOP;左移7次MOVR2,#07H;LOOP1:RRCA;右移1位MOVP1,A;输出到P2CALLDELAY;DJNZR2,LOOP1;右移7次JMPMAINDELAY:MOVR3,#20;延时0.2sD1:MOVR4,#20D2:MOVR5,#248DJNZR5,$DJNZR4,D2DJNZR3,D1RETEND5.4单片机与LED数码管的接口5.4.1数码管的结构abcdefgdp(a)(b)(c)cdedp12345678910abfgcomcomabcefabcdefgdpcomcomabcdefgdp(a)(b)(c)cdedp12345678910abfgcomcomabcefabcdefgdpcomcoma(b)(c)表5-28段LED的字形码(段码)表显示字符共阴极段码共阳极段码显示字符共阴极段码共阳极段码03FHC0Hc39HC6H106HF9Hd5EHA1H25BHA4HE79H86H34FHB0HF71H8EH466H99HP73H8CH56DH92HU3EHC1H67DH82HT31HCEH707HF8Hy6EH91H87FH80HH76H89H96FH90HL38HC7HA77FH88H“灭”00HFFHb7CH83H………表5-28段LED的字形码(段码)表5.4.2LED数码管的工作原理1、LED静态显示方式图5-104位静态LED显示器电路2、LED动态显示方式图5-114位8段LED动态显示电路图5-12为8位LED动态显示2008.10.10的过程。图(a)是显示过程,某一时刻,只有一位LED被选通显示,其余位则是熄灭的;图(b)是实际显示结果,人眼看到的是8位稳定的同时显示的字符。为了减少硬件开销,提高系统可靠性并降低成本,单片机控制系统通常采用动态扫描显示,另外,数码管内部发光二极管点亮时大约需要5mA电流,而且电流不可过大,否则会烧毁发光二极管。由于单片机的I/O送不出如此大的电流,所以,数码管与单片机连接时需要加驱动电路,可以加三极管驱动或使用专门的的数码管驱动芯片,如74HC245、74HC573等。5.4.3数码管显示器的应用举例图5-13是接有六个共阴极数码管的动态显示接口电路,用74LS245接成直通的方式作驱动电路,阴极用非门74LS04反相门驱动,字形选择由P1口提供,位选择由P2口控制。当P2.0~P2.4轮流输出1时,六个数码管动态显示“123456”字样。图5-136个共阴极数码管的动态显示接口完整源程序如下:ORG0000HMOVP2,#0MAIN:MOVDPTR,#TAB1;指向段码表表头地址MOVR0,#0;R0MOVR1,#01;R1NEXT:MOVA,R0MOVCA,@A+DPTR;查字形码表1MOVP1,A;送P1口输出MOVA,R1MOVP2,AACALLDAYINCR0RLAMOVR1,ACJNER1,#40H,NEXT;六个数码管显示完?SJMPMAINDAY:MOVR6,#40;12M晶振,延时20ms子程序DL2:MOVR7,#7DHDL1:NOPNOPDJNZR7,DL1DJNZR6,DL2RETTAB1:DB06H,5BH,4FH,66H,6DH,7DH;“1~6”的字形码END5.5单片机与键盘的接口5.5.1键盘的分类微机系统中常用的键盘有编码键盘和非编码键盘两种。在单片机系统中,基于成本控制的目的,常用的是非编码键盘。非编码键盘按键盘的连接形式可分为:独立连接式键盘和矩阵式(又称行列式)键盘。1、独立连接式键盘独立连接式键盘连接图如图5-15(a)所示。这种键盘的优点是硬件、软件结构简单,使用方便,但随着个数的增加,被占用的I/O口线也将增加。因此,这种形式的键盘不是和在键数要求较多的系统中使用,但在键数要求不多的单片机系统中,独立式键盘使用得相当普遍。2、矩阵式键盘单片机系统需要安排较多的按键时,为节约微处理器的I/O接口资源,通常把键排列成矩阵式,这样可以更合理地利用硬件资源。矩阵式键盘是指由若干个按键组成的开关矩阵。4行4列矩阵式键盘的链接图如图5-15(b)所示。5.5.2键盘的防抖对于如图5-16(a)所示的键盘来说,按下和释放按键的过程中,I/O上的电压波形如图5-16(b)所示。图中的t1和t3分别为键的闭合和断开过程中的抖动期(分别称为前沿抖动和后沿抖动),抖动时间的长短与开关的机械特性有关,一般为5~10ms,t2为稳定的闭合期,其时间的长短由按键的动作决定,一般为几百毫秒至几秒。t0,t4为断开期。图5-16键按下和释放时的I/O口电压波形图为了保证CPU对按键闭合的正确判定,必须去除抖动,在键的稳定闭合和断开期间读取键的状态。去除抖动可以采用硬件和软件两种方法。硬件方法就是在按键输入通道上添加去抖动电路,从根本上避免电压抖动的产生。软件方法则采用延迟5~10ms的时间,待电压稳定之后,再进行状态输入。由于人的按键速度与单片机的运行速度相比要慢的多,所以,软件延时的方法从技术上完全可行,而且经济上更加实惠,因此被越来越多地采用。按键去抖流程如图5-17所示。图5-17按键去抖流程图5.5.3键盘接口1、矩阵式键盘接口键盘接口的主要功能是对键盘上所按下的键进行识别,矩阵式非编码键盘而言,常用的两种按键识别方法是:扫描法和线反转法。1)、扫描法对按键的识别,可分两步进行:第一步,识别键盘有无键按下;第二步,如有键被按下,识别出具体的键位。2)、线反转法扫描法要逐列扫描查询,当被按下的键处于最后一列时,则要经过多次扫描才能最后获得此按键所处的行列值。而线反转法则很简练,无论被按键时处于第1列或最后一列,均只需经过两步便能获得此按键所在的行列值,线反转法的原理如图5-19所示。两个具体操作步骤:①让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。②再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低