微机系统的基本IO接口技术(二)可编程芯片

2. 可编程并行接口芯片8255

2.1 内部结构和外部引脚

注意:C上半口位于A组,是高四位;下半口位于B组,是低四位。
在这里插入图片描述在这里插入图片描述

2.2 三种工作方式

2.2.1 方式0 基本输入输出方式

  • A、B口都可由程序设定为8位的输入口或输出口
  • C口的两个半口(高4位和低4位)可独立设为输入或输出端口

2.2.2 方式1 选通输入输出方式

  • A口和B口可作为输入或输出端口使用,此时C口的某些位与它们配合,作为控制或通信联络信号。
  • C口没有使用某些位可以单独定义为I/O口用。

方式1下A和B端口的输入和输出具有不同的组态,内部逻辑不同:

  • A输入征用C3 C4 C5;
  • A输出征用C3 C6 C7;
  • B无论输入输出,占用C0 C1 C2。

基本工作原理前面已经在并行通信那里讲过了,在这里分别对应一下:

  • STB:“数据输入准备好”信号,由外设提供的输入信号,当其有效时,将输入设备送来的数据锁存至8255的输入锁存器。
  • IBF:“数据输入回答”信号,表示A口已经接收到数据。
  • INTR:向CPU发出的中断请求,在INTE和IBF处于高电位时有效(即内部中断允许且输入缓冲器已满)。
  • OBF:“数据输出准备好”信号,表示CPU已经输出了数据。
  • ACK:“数据输出回答”信号,表示外设已经接收到数据。

值得一提的是,INTE是内部终端允许触发器,可通过C端口的置位或复位操作使其允许中断或禁止中断。A输入置位PC4,A输出置位PC6,B置位PC2。
在这里插入图片描述在这里插入图片描述

根据并行通信的工作原理和外部引脚信号,可以很清楚地看懂工作波形,这里就不解释了,左图和右图分别是输入波形和输出波形:
在这里插入图片描述在这里插入图片描述

2.2.3 方式2 双向输入输出方式

方式2是双向的数据传输方式,仅限于A口,这时C端口配合其工作,B口可以工作在方式0或方式1
在这里插入图片描述

2.3 8255编程

写两个控制字是8255编程的关键所在,知道这个其实就没什么难度了:

  1. 方式选择控制字:按照题目要求写出控制字,记住AB分别征用了C的哪些端口。
  2. 端口C置位/复位控制字:一般是要触发一下INTE,记住AB触发C的哪个端口。
    在这里插入图片描述在这里插入图片描述

编程时候特别注意一下:IN / OUT指令要求如果端口号≥256(超出8位立即数范围),则要用DX间接寻址。

例1:编写对8255的初始化程序片段,要求:A口方式0输入,B口方式0输出,C口作为8位的输出口使用。8255控制端口的地址为12BH。

对照方式选择控制字格式可得控制字:10010000B=90H,
初始化程序片段:

MOV AL, 90H		;方式选择控制字 
MOV DX, 12BH	;由于端口号>256,用DX间接寻址 
OUT DX,	AL		;写入控制寄存器

例2:编写程序段,要求:使A口为方式1输入,且采用中断传送;B口采用方式0输出;其余C口的位作为输出。假设控制端口地址为63H。

对照方式选择控制字格式可得控制字:10110000B,
初始化程序片段:

MOV AL, 10110000B 	;方式选择控制字 
OUT	63H, AL     	;写入控制寄存器 
MOV	AL, 00001001B   ;置位/复位控制字,使PC4=1,从而INTE=1允许内部中断 
OUT 63H, AL	  	    ;置位/复位控制字写入控制寄存器

3. 可编程定时/计数器芯片8253/8254

计算机的定时/计数主要有三种方式:

  • 软件定时:依赖机器频率,不具备通用性和准确性。
  • 硬件定时:这里指纯硬件方法计时,电路一旦形成,不宜改动,准确性、灵活性不足。
  • 可编程硬件定时:精度高、通用性好、灵活。

这里说的8253/8254自然就属于第三种。基本原理:当用于计数时,计数装入初始值后,在GATE为高电平的情况下,可以用外部事件作为CLK脉冲对计数值进行减1计数;每来一个脉冲,计数器减1一次;当计数值减到结束时,由OUT端输出一个信号。

3.1 内部结构及引脚信号

  • 内部有3个独立的16位减法计数器(也称通道,下降沿计数器值减1);
  • 每个定时/计数器通道独立工作,都有2种计数方式。
    在这里插入图片描述

3.2 六种工作方式

8253/8254有六种工作方式,可以分成三组。需要注意的是,无论哪种方式下,都需要经历写控制字、写初值、硬件计数的过程。需要注意,写初值只是写入了预置寄存器,并没有真正开始计数,之后到来的第一个CLK脉冲预置寄存器才将初值送到减1计数器;从第二个CLK的下降沿,计数器才开始真正地减1计数, 一会儿看到工作时序就一目了然了。
在这里插入图片描述

  • 第一组:方式0和方式1,单次触发。如果不重新写入初值(方式0)或不重新GATE触发(方式1),则只输出一次,不会输出一个连续的脉冲序列。
    在这里插入图片描述
  • 第二组:方式2和方式3,输出连续脉冲。当初值为N时,二者均产生N倍时钟周期的连续波信号:速率信号发生器的连续波中高电平为N-1倍的时钟宽度,低电平为一个时钟宽度;方波信号发生器则产生占空比为1:1的方波(严格来讲,初值为偶数才时严格方波,初值为奇数时高电平宽度比低电平多1)
    在这里插入图片描述
  • 第三组:方式4和方式5,选通信号发生器,只产生一次选通信号,宽度为一个时钟周期。与前两组区别在于,第一组是计数期间持续低电平,第二组是产生连续波形。在这组中,前者为软件出发,所以GATE可以一直为高电平;后者为硬件出发,即通过GATE门控信号触发。
    在这里插入图片描述

3.3 8253/8254编程

两步走,先写控制字(规定计数通道、工作方式等),再写初值。

控制字长这样:
在这里插入图片描述
初值计算:在这里插入图片描述
懂了原理之后这公式也不难理解:如果要求计时时间为T,初值的含义就是在这T时间内会经过多少个时钟脉冲,所以用 T × f C L K T \times f_{CLK} T×fCLK 就可以了。 f C L K f_{CLK} fCLK 就是芯片自己的频率,意味着单位时间内产生多少个脉冲,注意下单位即可。

例1:已知8253的端口地址为40H~43H,用8253的计数器0,每隔2ms输出一个负脉冲,设CLK0为2MHz,完成软件设计。

  1. 选方式,算计数初值。 要求每隔一段时间输出一个负脉冲,所以第一组、第三组的单次触发都不能用,第二组中的速率信号发生器刚好,所以选择方式二; N = T × f C L K = 4000 N = T \times f_{CLK} = 4000 N=T×fCLK=4000
  2. 写控制字。 如果是二进制计数,初值为0FA0H,高低字节均不为0所以既写高字节由写低字节,对应操作类型为11,所以控制字为00110100B;如果选择BCD计数,初值为4000H,低字节为0,只需写高字节,对应操作类型为10,所以控制字为00100101B。
  3. 写程序。 端口地址给出来了,40H、41H、42H、43H分别对应计数器0、1、2和控制口。以二进制计数为例:
MOV AL, 00110100B	;向控制口写控制字
OUT 43H, AL

MOV AX, 0FA0H		;自动分出高八位和低八位
OUT 40H, AL			;给计数器0传第八位
MOV AL, AH			;给计数器0传高八位
OUT 40H, AL

这里关于OUT / IN指令注意两点:

  • 指令格式为: OUT DX/imm8, AL/AX; IN AL/AX, DX/imm8
  • OUT/ IN 指令只允许交换的数据存在于AL/AX寄存器中,不可以是AH,BL等寄存器,所以如果高低字节都要写入,则需要把AH的数据传到AL中然后进行输出。
  • OUT/ IN 指令中的端口号:如果小于等于255,可以imm8直接寻址;如果大于255,需要用DX进行间接寻址。

例2:8254口地址为158H~15BH,其A1和A0与相应地址线相连。计数器2的OUT端产生最大宽度的方波,写出8254的初始化程序。

最大宽度方波,即要求计数器进行最大次计数:采用二进制计数,初值为0(因为减1之后才判断,所以初值不是65535)

MOV AL, 0B6H	;写控制字
MOV DX, 15BH	;写控制口到DX
OUT DX, AL		;输出控制字

MOV AX, 0000H	;写初值
MOV DX, 15AH	;写计数器0端口到DX
OUT DX, AL		;传低位
MOV AL, AH		;传高位
OUT DX, AL		

例3:某8086系统中有一片8253芯片,端口地址为500H、502H、504H 、506H,各通道均接6MHz的时钟信号。要求:计数器0输出一个最大宽度的负脉冲;计数器1输出一个方波信号,周期为100KHz;计数器2输出一个定时中断信号,定时时间为0.2ms。

计数器0:负脉冲,选方式1;最大宽度,二进制初值为0;高低都写;
计数器1:方波,选方式3;初值 = 1/100K × 6MHz = 60;小于等于255,只写第八位;
计数器2:定时中断,选方式0;初值 = 0.2 × 6K = 1200;大于255,高低都写。
端口号大于255,需要用DX间接寻址。


如果想了解计数器的状态,可以发锁存命令读计数器当前的值。 锁存命令字参考上述控制命令字的格式:左边两位通道选择,操作类型为00锁存,其余的几位无关紧要。

例:设某系统中8253的端口地址为0B0~0B3H,读取计数器1当前的计数值(设计数值为16位),并存入BX寄存器。

MOV AL, 01000000H	;发锁存命令
OUT 0B3H, AL
IN AL, 0B1H			;取低8位,不能直接取到BL中
MOV BL, AL
IN AL, 0B1H			;取高8位
MOV BH, AL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值