资源描述
第5章 微型计算机输入输出接口,5.1 输入输出接口 5.2 输入输出数据传输的控制方式 5.3 开关量输入输出接口,5.1 输入输出接口,5.1.1 外部设备及其信号 5.1.2 I/O接口的功能 5.1.3 I/O端口的编址方法 5.1.4 简单I/O接口的组成,5.1.1 外部设备及其信号 外部设备(Peripheral Device) 按照与CPU数据传输的方向划分: (1)输入设备 键盘、鼠标、光笔 输入图形信息的扫描仪、数码相机 检测现场信息的数字化测试仪表 模拟量采集和模拟量数字量转换装置等,(2)输出设备 显示器、打印机 绘图仪 现场控制的数字量模拟量转换装置和执行元件 (3)复合输入输出设备 外存储设备是典型的复合输入输出设备: 磁带机(Tape Driver) 软磁盘驱动器(Floppy Driver) 硬磁盘驱动器(Hard Disk Driver) 光盘驱动器(Compact Disk Driver) 许多光盘只能读出信息,称为CDROM (Compact DiskRead Only Memory),只读光盘只能用作输入设备。,2. 外部设备的信号 (1)数据信号 按照信号的物理形态,可分为以下几种; 数字量: 以二进制形式表述的数据、图形或文字信息。 模拟量: 现场的物理量通过传感器件,转换为大小与之对应的电压或电流信号。这些量呈连续变化的形态,称为模拟量(Analog)。 开关量: 开关量是只有二种状态(0,1)的量,如开关的接通(ON)与断开(OFF),电机的启停等 脉冲量: 计数脉冲、定时脉冲和控制脉冲 对于输入设备,数据信号从外设送往CPU对于输出设备,数据信号从CPU发往外部设备。,(2)状态信号 状态信号表明外部设备当前的工作状态,用来协调CPU与外部设备之间的操作。 典型的状态信号:READY, BUSY 有的设备有指示出错状态的信号,如打印机的纸尽(Paper Out),故障(Fault)。 不同的外设可以有不同的状态信号。 状态信号总是从外部设备发往CPU。,(3)控制信号 控制信号是CPU向外设发出的命令,它指定设备的工作方式,启动或停止设备 控制信号的格式因设备而异 控制信号从CPU发往外部设备 数据信号、状态信号、控制信号都是以“数据”的形式,通过数据总线在CPU和外部设备之间进行传输的。,5.1.2 I/O接口的功能 接口:计算机一个部件与另一个部件之间的连接界面。 功能: 1. 设备选择功能 CPU通过地址代码来标识和选择不同的外部设备 接口对系统总线上传输的外设地址进行译码,在检测到本设备地址代码时,产生相应的“选中”信号 2. 信息传输功能 设备被“选中”时: 从CPU/数据总线接收数据或控制信息 外部设备的数据或状态信息发往数据总线/CPU,3. 数据格式转换功能 外设使用的数据格式与CPU数据格式不同时,接口要进行二种数据格式之间的相互转换。 联络功能 从系统总线或外设接收一个数据后,发出“数据到”联络信号,通知外设或CPU取走数据 数据传输完成,向对方发出信号,准备进行下次传输 5. 中断管理功能 向CPU申请中断; 向CPU发中断类型号; 中断优先权的管理; 在以8086为CPU的系统中,这些功能大部份可以由专门的中断控制器实现。,复位功能 接口在接收系统的复位信号后,将接口电路及其所连接的外部设备置成初始状态。 7. 可编程功能 有些接口具有可编程特性,可以用指令来设定接口的工作方式、工作参数和信号的极性。,错误检测功能 (1) 物理信道上的传输错误 信号在线路上传输时,如果遇到干扰信号,可能发生传输错误。 检测传输错误的常见方法是奇偶检验。 (2) 数据传输中的覆盖错误 输入设备完成一次输入操作后,把所获得的数据暂存在接口内 如果在该设备完成下一次输入操作之后,CPU还没有从接口取走数据,那么,在新的数据送入接口后,上一次的数据被覆盖,从而导致数据的丢失 输出操作中也可能产生类似的错误 覆盖错误导致数据的丢失,易发生在高速数据传输的场合,5.1.3 I/O端口的编址方法 有两种不同的I/O端口编址方式: 1. I/O端口与内存统一编址 把内存的一部分地址分配给I/O端口,一个8位端口占用一个内存单元地址,也称为存储器映射编址方式 优点: 访问内存单元和I/O端口使用相同的指令,使用方便 降低CPU电路的复杂性 缺点: 减少了内存可用范围 难以区分访问内存和I/O的指令,降低了程序的可读性和可维护性,I/O端口与内存独立编址 内存储器和I/O端口各自有自己独立的地址空间 访问I/O端口需要专门的I/O指令 8086/8088 CPU采用这种方式 访问内存储器 使用20根地址线A0A19 使M/IO#=1 内存地址范围为000000FFFFFH共1MB 访问I/O端口 使用低16根地址线A0A15 使M/IO#= 0 I/O端口地址范围为00000FFFFH共64K,3 IBM PC 微型计算机I/O端口地址分配 在PC系列微机中,仅使用A0A9共10条地址线定义I/O端口(设A11A15= 0),寻址范围为03FFH 前256个端口地址供主板上寻址I/O接口芯片使用,后768个供扩展槽接口卡使用 用户设计I/O接口电路的时候,应使用系统未占用的端口地址区域 为避免所选择的地址与其他扩展卡冲突,最好将其设计成地址可选的型式 IBM-PC微机系统板各I/O接口器件端口地址见表5-1。,5.1.4 简单I/O接口的组成 端口 端口:接口内的寄存器,用来暂存CPU和外设之间传输的数据、状态和命令。 端口地址:每一个端口有一个独立的地址。 外部设备地址:设备接口内各端口的地址,一台外部设备可以拥有几个通常是相邻的端口地址。 端口种类:数据端口、命令端口(控制端口)和状态端口。 如果外部设备的信息(数据/状态)已经锁存,端口也可以由三态缓冲电路组成。,地址译码电路 地址译码是接口的基本功能之一。 一个接口上的几个端口地址通常是连续排列的,可以把16位地址码分解为二个部分: 高位地址码用作对接口的选择; 低位地址码用来选择接口内不同的端口。 例如:某接口占有地址330H333H: 高8位地址为11001100B时,本接口被选中; 低2位地址为00,01,10,11时,选择接口内的不同端口。,图5-1 端口的地址译码电路和跳线器,为了避免地址冲突,许多接口电路允许用“跳线器(JUMPER)”改变端口地址。上页图3-1(b) 将异或门的输出代替图3-1(a)中的A8,A9引脚: 二个跳线引脚均接地时,上面译码电路仍然产生330H333H的端口译码信号; 当二个跳线引脚均接“1”时,上面译码电路会产生030H033H的端口译码信号 同理还可以产生130H133H,230H233H的译码信号。 8086工作于最大模式时,上面的M/IO#、WR#、RD#信号由8288总线控制器发出的IORC#、IOWC#代替。,由于读、写操作不会同时进行,一个输入端口和另一个输出端口可以使用同一个地址编码。 例如,可安排数据输入端口、数据输出端口使用同一个地址330H,命令端口和状态端口共同使用地址331H。 需要注意的是,数据输入端口和数据输出端口虽然使用相同的地址,但却是二个各自独立的不同的端口。,数据锁存器与缓冲器 数据(状态)输入端口: 必须通过三态缓冲器与系统总线相连,保证数据总线能够正常地进行数据传送。 输入设备在完成一次输入操作后,在输出数据的同时,产生数据选通信号,把数据打入八位锁存器74LS273 锁存器的输出信号通过三态八位缓冲器74LS244连接到系统数据总线。 数据端口读信号由地址译码电路产生。 高电平(无效):缓冲器输出端呈高阻态。 低电平(有效,端口被选中 ):已锁存的数据通过74LS244送往系统数据总线,被CPU所接收。,图5-3 输入设备接口的数据锁存和缓冲电路,数据(命令)输出端口: CPU送往外设的数据或命令,应由接口进行锁存,以便使外设有充分的时间接收和处理。 八位输出锁存电路例(图5-4)。,图5-4 输出锁存电路,简单的输入输出接口(图5-5) 把地址译码、数据锁存与缓冲、状态寄存器、命令寄存器各个电路组合起来,构成简单输入输出接口 接口连接的信号: 与系统总线连接: 地址总线A0A15 数据总线D0D7 控制总线M/IO#、RD# 、WR# (最小模式时)或IOWC#、IORC#(最大模式时)相连接 与外部设备相连:数据、状态、命令。,图5-5 简单接口的组成,5.2 输入输出数据传输的控制方式,5.2.1 程序方式 5.2.2 中断方式 5.2.3 直接存储器存取(DMA)方式,5.2.1 程序方式 在程序控制下进行信息传送 分为无条件传送和条件传送二种 1 无条件传送方式 对于简单的外部设备的IO操作可以随时进行; 例如,开关、发光二极管 这些简单设备的输入信号一般不需要锁存,可以通过三态缓冲器与系统数据总线直接相连。 简单输出设备的信号一般需要由锁存器锁存,图5-6 无条件输入输出传送接口,条件传送方式 条件传送也称为查询式传送、异步传送; 接口电路除了有传送数据的端口以外,还应有储存和传送状态的端口。 对于输入过程: 外设将数据准备好, “准备好(READY)”标志位置1; CPU将数据取走,READY=0 对于输出过程: 外设接收到数据,将“忙(BUSY)”标志位置1 数据输出完成,将 “BUSY”清零。,一个数据的“条件传送”过程: CPU从接口中读取状态字; CPU检测状态字的对应位是否满足“就绪”条件,如果不满足,则回到前一步重新读取状态字; 如状态字表明外设已处于“就绪”状态,则传送数据。,图5-9 查询式输入流程,查询方式输入接口电路(图5-7) 接口内有两个端口: 数据端口(8位,输入) 状态端口(1位,输入,连接在D7上,=1表示有数据) 选通信号有二个作用: 将外设的数据送到接口的锁存器中; 使接口中的D触发器置“l”(READY=1) 数据信息和状态信息从不同端口经过数据总线送到CPU。,图5-7 查询式输入接口电路,汇编语言程序: AGAIN: IN AL, STAT_PORT; 读状态端口,D7=1表示“数据就绪” TEST AL,80H; 测试“数据就绪”位 JZ AGAIN; 未就绪,继续读状态端口 IN AL, DATA_PORT; 已就绪,从数据端口读取数据 C语言程序: do stat = inportb( stat_port ); while (stat /* 数据已准备好则读取数据 */,查询方式输出接口电路(图5-8) 接口内有两个端口: 数据端口(8位,输出) 状态端口(1位,输入,连接在D7上,=1表示正在输出,“BUSY”) CPU读取接口中的状态: 外设忙( BUSY =1),CPU等待 外设空闲( BUSY =0),向外设输出数据,图5-8 查询式输出接口电路,“数据端口写”信号作用: 把数据打入“锁存器”; 将“状态触发器”置1 D触发器的作用: 为外设提供一个联络信号STB,告诉外设现在接口中已有数据可供提取; 用作该设备的状态标志( “忙”,BUSY)。,汇编语言程序: ONE: IN AL, STATUS_PORT ; 读状态端口 TESTAL, 80H ; 测试“忙”位 JNZ ONE ; 忙,再读状态端口 MOV AL, DATA ; 不忙,取来数据 OUT DATA_PORT, AL ; 送入数据端口 C语言程序: do stat = inportb( status_port ); while ( stat /*设备空闲:输出数据 */,查询式输入输出的程序设计例 某字符输入设备以查询方式工作: 数据输入端口: 0054H, 状态端口: 0056H。 状态寄存器:D0=1,数据准备好,可以输入; 状态寄存器:D1=1,输入设备发生故障 要求: 从该设备上输入80个字符,配上水平和垂直校验码(偶校验),向串行口输出。 如果设备出错,显示错误信息后停止。,汇编语言程序: .data Buffer DB 81 dup( ? ) Message DB Device Fault !,0DH,0AH,$ .code Start:MOV AX,data ;对DS初始化 MOV DS,AX LEA SI, Buffer ;设置SI为缓冲区指针 MOV CX, 80;设置CX为计数器 MOVDL, 0 ;DL置垂直校验码初值,Next:IN AL, 56H ;读入状态 TEST AL,02H ;测状态寄存器D1 JNZ ERROR ;设备故障,转ERROR TEST AL, 01H ;测状态寄存器D0 JZ Next;未准备好,则等待,再测 IN AL,54H ;准备好, 输入字符 AND AL, 7FH ;清最高位,进行校验 JPE Store ;已经是偶数个1,则转Store ORAL,80H ;奇数个1,将最高位置为1 Store: XOR DL,AL ;产生垂直校验码 MOV SI, AL ;将字符送缓冲区 INC SI ;修改地址指针 LOOP Next ;80个字符未输入完成,继续,MOVSI, DL ; 输入完成, 保存垂直校验码 Tranfer:LEA SI,Buffer;准备发送,SI中置字符串首址 MOV CX,81 ;发送字符数 One:MOV AH,04H ;设置串口输出功能号 MOV DL, SI ;取出一个字符 INT 21H;从串口输出 INC SI;修改指针 LOOP One ;输出下一个字符 JMP Done Error:MOV AH, 09H;设备故障,输出出错信息 LEA DX, Message INT 21H Done: MOV AH, 4CH INT 21H;返回DOS END Start,说明: 程序由二段循环程序组成: 第一段程序从设备输入80个字符,同时产生它的水平/垂直校验码存入缓冲区; 第二段程序将缓冲区内容通过串口输出。 测试状态位要注意先后次序:由于设备故障将导致该设备不能正常输入,使完成标志(D0)恒为零。所以,在设备发生故障时先判是否完成可能导致程序死循环。 产生水平校验码:从设备读入数据,清除最高位,根据剩余七位的奇偶特性决定最高位置1或不变(保持为0)。 产生垂直校验码:将80个字节半加(异或)得到。,多个设备循环查询方法举例: 三个设备,它们状态端口地址分别为STATl、STAT2、STAT3,三个状态端口均使用第5位作为准备好标志。 TREE: MOV FLAG,0 INPUT: IN AL,STAT l TEST AL,20H JZ DEV2 CALL PROC l,DEV2: IN AL,STAT2 TEST AL,20H JZ DEV3 CALL PROC2 DEV3; IN AL,STAT3 TEST AL,20H JZ NOINPUT CALL PROC3 NOINPUT:CMP FLAG,07H JNE INPUT ,说明: PROCl、PROC2、PROC3是三个设备输入数据并进行处理的子程序。 FLAG存放三个设备输入完成的标志,D0, D1, D2分别代表一个设备的输入完成情况(=0表示未完成,=1表示完成)。 上例仅适用于三个设备工作速度都比较慢的情况; 如果其中一个设备工作速度很快,而其他设备的输入输出处理程序运行时间又较长,可能发生“覆盖错误”。 在这种情况下,应优先执行工作速度较快的外设的IO过程,然后再执行其他设备的IO过程。,5.2.2 中断方式 程序查询方式的特点: 程序查询方式解决了CPU与外设工作的协调问题,但是却大大降低了CPU的使用效率; 在程序查询方式中,CPU处于主动地位,外设处于消极等待查询的被动地位; 设备较多时,查询方式的数据传送很难使每一个外设都能工作在最佳状态。,程序中断方式特点: 赋予系统中的外设某种主动申请、配合CPU工作的“权利”。 外设把数据准备好时,主动向CPU发出一个请求信号。 CPU接收到请求信号后,暂停当前的工作,进行该设备的数据传送操作。 赋予外设 “主动权”之后,CPU可以不必反复查询该设备的状态,而是正常地处理系统任务; CPU与外设处于某种“并行工作”的状态,从而提高CPU的工作效率。,中断方式举例: 某外设在1秒内传送100个字节。 若用程序查询的方式传送,则CPU为传送100个字节所化费的时间等于1秒。 用中断控制方式传送,CPU为执行一个字节的传送需要进入一次中断服务程序。 设CPU执行一次中断服务程序需要100s; 传递100个字节CPU所使用的时间为100s100=10ms; CPU处理中断开销为1,99的时间可执行其他任务; 中断方式的数据传送仍在程序的控制下执行,称为程序中断方式; 适应于中、慢速的外部设备数据传送。,3.2.3 直接存储器存取(DMA)方式 程序中断方式,程序查询方式的缺点: 中断方式: 每传送一次数据,CPU必须执行一次中断服务程序; 对于高速数据传输,容易产生“覆盖错误”。 程序查询方式: 响应速度比中断方式要快一些,完成一次数据传输仍然需要执行七、八条以上的指令。 CPU的工作速度不高时仍有可能跟不上外设数据传输的需要。,直接存储器传送 (Direct Memory AccessDMA) 将外设的数据不经过CPU直接送入内存储器; 或者,从内存储器不经过CPU直接送往外部设备; 一次DMA传送只需要执行一个DMA周期(相当于一个总线读写周期); 能够满足高速外设数据传输的需要; 需要一个专门的器件来协调外设接口和内存储器的数据传输,称为DMA控制器(DMAC),图5-10 DMA数据传送示意图,5.3 开关量输入输出接口,5.3.1 开关量输入接口 5.3.2 开关量输出接口,5.3.1 开关量输入接口 1 基本的开关量输入接口 开关形态:单刀单掷开关/单刀双掷开关/按钮 开关量通过三态缓冲器与系统数据总线连接 常用的三态缓冲器: 74LS244(输入输出同相)/74LS240(输入输出反相) 一条输入指令可以同时读入8位或16位开关量。,图5-11 基本开关量输入接口,2 矩阵式开关量输入接口 开关数量多时,可以排列成矩阵,例如:图5-12(键盘) 数据输出端口连接8根“行线”(Row,R0R7); 数据输入端口连接8根“列线”(Column, C0C7); 电路特点: 没有键按下时,列线端口输入为全“1”; 行线端口输出全“1”时,不论有无键按下,列线端口输入仍然为全“1”; 某一行线输出“0”时,如果该行上有一个键按下,则输入端口输入代码为7个“1”,1个“0”,0的位置与被按下键的位置相对应。,图5-12 键盘(矩阵式开关量输入)接口,键盘扫描与编码: 对8根行线逐行扫描,识别按键的所在行、列,从而获得该键的代码; 一个键的编码可以用它的二字节“行列码”表示。例如,(R3,C2)的二字节“行列码”为F7FBH: F7H=11110111 :按键在R3行上; FBH=11111011 :按键在C2列上; 用“行列码”查表,可以得到这个键的代码。 键的编码也可以用一字节“扫描码”表示。上例中按键的一字节“扫描码”为32H: 高4位0011:键所在的行; 低4位0010:键所在的列; 键刚按下时,会产生“抖动”。,键盘扫描程序: 没有键被按下,返回1; 有键按下时返回按键的二字节“行列码”(行码为高8位,列码为低8位); RPORT, CPORT 定义为行、列端口的地址。 unsigned int kbinput( ) unsigned int row, row0, column, code, k=0; outportb( RPORT, 0); /*各行输出全0,测试有无键按下*/ if (inportb(CPORT) /* 延时20ms,消除抖动 */,if (inportb(CPORT) /* 形成下一个行码 */ ,if (column = = 0 xff ) return( 0 xffff ); /* 未找到按键所在行,返回全“1” */ code = (row0 ,5.3.2 开关量输出接口 1 基本的开关量输出接口 常见的开关量输出: LED发光二极管 LED指示灯用于指示室内仪表状态 小功率LED可以由逻辑电路直接驱动: 输出0:LED发光 输出1:LED熄灭 执行元件驱动线圈,表5-3 部分逻辑电路输出端电流,大功率LED驱动或执行元件驱动线圈的驱动: 普通逻辑电路输出,外接功率放大三极管驱动; 集电极开路驱动器(OC驱动器),输出端通过上拉 电阻接高压。,2 LED七段数码显示管接口,图5-15 多位LED数码显示接口,多位LED显示器驱动: 设置位码,熄灭所有数码管; 将一个数码管的字形代码(段码)送入段码端口; 设置位码,点亮一个数码管 适当延时后,重复以上过程 多位不同的数字同时显示在不同的数码管上。 送段码之前熄灭所有数码管可以消除“段码”和“位码”不同步产生的闪烁。,多位LED数码显示程序: 需要输出的数字分别是1,2,3,4,5,6,7,8 段码和位码的端口地址分别是segport 和 bitport,;数据段和堆栈段 data Segtabdb 40h, 4fh, 24h, 30h, 19h db 12h, 02h, 78h, 00h, 10h buffer db 1, 2, 3, 4, 5, 6, 7, 8 segcodedb? bitcodedb? stack100h,code leddisp proc far pushds; 保护各寄存器内容 pushax pushbx pushcx pushsi movax, data;装载ds movds, ax leabx, segtab;bx 置为七段码表首址 movbitcode, 80h ; 位码初始值为80H(从左边开始) movsi, 0;si用作输出缓冲区指针,初值0 movcx, 8;cx 用作循环计数器,初值8,one: moval, 0 out bitport, al; 送位码0,熄灭各LED moval, buffersi ;取出一个待输出数字 xlat; 转换成七段码 outsegport, al; 向段码端口输出 moval, bitcode outbitport, al; 输出位码,点亮一个LED rorbitcode, 1; 修改位码,得到下一个位码 incsi; 修改输出缓冲区指针 calldelay; 延时 loopone; 循环,点亮下一个LED,popsi popcx;恢复各寄存器 popbx popax popds ret; 返回主程序 leddispendp end,习题5,1. 接口电路与外部设备之间传送的信号有哪几种?传输方向怎样? 2. 接口电路有哪些功能?哪些功能是必需的? 3. I/O端口的编址有哪几种方法?各有什么利弊?80X86系列CPU采用哪种方法? 4. 按照传输信号的种类,I/O端口有几种?它们信号的传输方向怎样? 5. I/O端口译码电路的作用是什么?在最小模式和最大模式下分别有哪些输入信号? 6. 外部设备数据传送有哪几种控制方式?从外部设备的角度,比较不同方式对外部设备的响应速度。,7. 叙述一次查询式输出过程中,接口内各电路、信号的状态变化过程。 8. 比较程序中断方式和查询方式的区别,根据比较,指出中断工作方式的优缺点。 9. 比较DMA方式和程序中断方式的区别,根据比较,指出DMA工作方式的优缺点。 10. 某输入设备数据端口、状态端口、控制端口地址分别为70H, 71H, 72H。状态端口D5=1表示输入完成,控制端口D7=1表示启动设备输入(输入完成后由设备清除该位)。从该设备输入100个字节数据,存入以BUFFER为首地址的缓冲区。如果启动该设备1秒后仍未完成一次输入,则视为超时错,显示出错信息后返回。分别用8086汇编语言和C语言编写完成上述功能的I/O程序。,11. 某输出设备数据端口、状态端口地址分别为220H, 221H。状态端口D0=1表示输出完成。将数据段中以STRING为首地址的20个字符(用七位ASCII代码存储)添加水平和垂直校验发送到该外部设备。用8086汇编语言编写完成上述功能的I/O程序。 12. 试画出矩阵式键盘查询的程序流程图。 13. 试画出公用端口多位LED输出的程序流程图。,
展开阅读全文