1、微机原理、汇编与接口技术,8.2,8.3,可编程并行接口8255A,可编程计数器/定时器8253,串行通信与异步通信控制器8250的应用,第八章 常用可编程接口芯片,8.1,8.1 可编程并行接口8255A,8255是为8080,8085和8088微型机系统设计的并行I/O接口芯片。,8255的内部组成如图所示,8.1.1 8255的组成与接口信号,端口A、端口B和端口C都是8位的端口,都可以选择作为输入或输出。 可以将C的高4位和低4位分开使用,分别作为输入和输出。 A和B作为选通输入或输出的数据端口时,C的指定位与A和B配合使用,用作控制信号或状态信号。,8.1.1 8255的组成与接口信
2、号,控制8255的工作方式。 对端口C的每一位实现按位复位或置位。 A组控制端口A和端口C的上半部(PC7PC4)。 B组控制端口B和端口C的下半部(PC3PC0)。,8.1.1 8255的组成与接口信号,性质:三态双向的8位缓冲器, 接法:连接CPU的数据总线DB。 作用:通过它把数据在CPU和8255之间传送。,8.1.1 8255的组成与接口信号,控制写:CPU的命令或输出数据 - 端口, 控制读:外设的状态或输入数据通过相应的端口送至CPU。,8.1.1 8255的组成与接口信号,(1)A1、A0 : 作用:用来选择 A、B、C 和控制字寄存器 接法:通常连地址线A1和A0。(2)CS
3、 选片信号: 作用:由它启动CPU与8255之间的通信。 接法:它与地址线的译码电路的输出线相连,8.1.1 8255的组成与接口信号,(3)RD读信号: 作用:控制8255送出数据或状态信息至DB 接法:它与PC微机的IOR相连。(4)WR写信号: 作用:控制把DB上的数据或命令写到8255 接法:它与PC微机的IOW相连。,8.1.1 8255的组成与接口信号,(5)RESET 复位信号:它清除控制寄存器,并置A、B、C 3个端口为输入方式。,8.1.1 8255的组成与接口信号,A1,A0和CS,RD,WR及组合所实现的各种功能如下:,8.1.1 8255的组成与接口信号,8255有3种
4、工作方式,由方式选择控制字来选用:(1)方式0 (Mode 0)-基本输入输出。(2)方式1 (Mode 1)-选通输入输出。(3)方式2 (Mode 2)-双向传送。,8.1.2 8255的工作方式与控制字,8.1.2 8255的工作方式与控制字,例如:端口A设置成为方式0, 端口B 设置成为方式1,A B C 三个端口都作为输出使用,怎样设置控制字:控制字:1000 0100MOV AL, 84HOUT port,AL,8.1.2 8255的工作方式与控制字,0,如:端口C的bit3(PC3)置位的控制字为00000111B(07H),它复位的控制字为00000110B(06H)。MOV
5、AL, 07HOUT port, AL注意:使用按位置位/复位控制字,应先送一方式控制字。,8.1.2 8255的工作方式与控制字,例8.1 将8255 C端口的8根I/O线接8只发光二极管的正极(八个负极均接地),用按位置位/复位控制字编写使这8只发光二极管依次亮、灭的程序。设8255的端口地址为380H383H。,8.1.2 8255的工作方式与控制字,8255与PC微机的连接及8255 C端口与8只发光二极管 的连接如图。,程序框图,383H,1000 0000,0000 0001,stack segment stack stackdw 32 dup (0) stack ends cod
6、e segment begin proc farassume ss: stack, cs: codepush dssub ax, axpush ax,MOV DX,383H ;383H为控制字寄存器的端口地址MOV AL,80H ;方式选择字OUT DX,AL ;P223, 端口地址大于255,用DXMOV AL,1 ;PC0的置位控制字 AGAIN: OUT DX,AL ;点亮一只发光二极管LOOP $ ;延时LOOP $AND AL,0FEH ;置位字改为复位字OUT DX,AL ;熄灭点亮的发光二极管ADD AL,3 ;PCiPCi+1,复位字改为下一位的置位字AND AL,0FH ;保
7、持D7为0,PUSH AX ;把置位字压棧保护,腾出AXMOV AH,11 ;检查键盘有无输入INT 21H ;无0送AL,有-1送ALINC AL ;无输入AL=1, 有AL = 0POP AX ;把置位字弹出放入AXJNZ AGAINret begin endp code endsend begin,小结:设置方式控制字,送到控制字寄存器地址383H 对LED控制时,读写C端口,设置置位复位控制字,送到控制字寄存器地址383H,一种基本的I/O方式。 输出是锁存的,输入是不锁存的。 可以由CPU用简单的输入或输出指令来读或写。 接口电路简单,不需要状态端口 3个端口都可作为数据端口。,8.
8、1.3 3种工作方式的功能,例8.1 将8255 C端口的8根I/O线接8只发光二极管的正极(八个负极均接地),用按位置位/复位控制字编写使这8只发光二极管依次亮、灭的程序。设8255的端口地址为380H383H。,若将例8.1改为C端口方式0输出,则控制程序为:MOV DX,383H ;设置方式控制字MOV AL,80HOUT DX,ALMOV DX,382H ;C端口的端口地址送DXMOV AL,1 ;C端口的输出值 AGAIN: OUT DX,ALLOOP $ ;延时LOOP $PUSH AXMOV AH,11 ;11号功能调用:检查键盘有无输入INT 21H ;无0送AL,有-1送AL
9、INC AL ;有键入,AL=-1,AL增1,AL=0POP AXJZ BACKROL AL,1 ;改变C端口的输出值JMP AGAIN BACK: ret,方式0小结:设置方式控制字,送到控制字寄存器地址383H 对LED控制时,读写A或B或C端口,设置对应的位,用OUT送到端口的地址380H或381H或382H,设置C端口的两种方法,用方式0: 设方式控制字,输出到A1A0为11的地址 设置C端口(8位分别对应8个引脚),输出到A1A0为10的地址。 用置位/复位字: 设方式控制字,输出到A1A0为11的地址. 设置置位/复位字,输出A1A0为11的地址.,将3个端口分为A、B两组,A组:
10、A和端口C中的PC3PC5或PC3、PC6、PC7 B组:B和端口C的PC2PC0 3位为B组。 端口A和B都可以由程序设定为输入或输出。 端口C的某些位为控制状态信号 C中余下的两位,仍可作为输入或输出。,方式1输入的状态控制信号及其时序关系如图。,(1) STB(strobe) 选通信号。这是由外设发出的输入信号,信号的下降沿,把输入装置送来的数据送入输入缓冲器;信号的上升沿,使INTR有效(置1)。(2)IBF(input buffer full) 外设将数据送至输入缓冲器后,该信号有效;,(3)INTR(interrupt request) 中断请求信号,这是8255的一个输出信号,可
11、用作向CPU申请中断的请求信号,以要求CPU服务。当IBF为高和INTE为高时,由STB的上升沿使其置为高电平。(4)INTE(interrupt enable) 中断允许信号,A组:INTEA,由PC4的位/复位来控制。B组:INTEB,由PC2 的置位/复位控制。1:允许中断。0:禁止中断。,例8.2 用选通输入方式从A端口输入100个8位二进制数。,硬件工作原理,A端口的八个开关可以设置一个字节的任意数 拨动STB处的抖动开关,产生尖峰向下脉冲, 下降沿时,A端口的字节数据读入芯片缓冲器 上升沿时,对INTR置位 字节数据被读入后,IBF标志置位,LED亮 INTR置位后,由IRQ9向C
12、PU申请中断,从而进入中断程序。 在中断程序中,把A端口的数据存入内存。,软件工作原理,设置8255:工作方式为方式1。对PC4置位 设置8259:装入中断向量的入口地址,设置OCW1 等待中断到来 中断程序:把A端口的数据存入内存,设置OCW2(中断程序要运行100次) 100次后,还原OCW1,程序结束,stack segment stack stackdw 32 dup (0) stack ends data segment BUF DB 100 DUP (?) data ends code segment begin proc farassume ss: stack, cs: code
13、, ds: datapush dssub ax, axpush ax,控制程序:,MOV ES,AX mov ax, data mov ds, ax MOV DX,38FH ;控制字端口地址为38FH MOV AL,0B0H ;方式字1011 0000 OUT DX,AL MOV AL,9 ;PC4置1,允许A端口中断 OUT DX,AL ;设置置位字0000 1001 MOV AX,SEG IS8255 ;中断程序入口地址送中断向量表 MOV ES:01C6H,AX MOV AX,OFFSET IS8255 MOV ES:01C4H,AX MOV CX,100 ;循环次数100 MOV BX
14、,0 MOV DX,38CH ;A端口地址为38CH,IN AL,0A1H ;读屏蔽字OCW1, (由于中断源IRQ9,必然是从片,地址应该为0A1H)AND AL,0FDH ;改变屏蔽字,允许IRQ9中断OUT 0A1H,AL ROTT: JMP $LOOP ROTT ;循环等待100次IN AL,0A1H ;恢复屏蔽字,禁止IRQ9中断OR AL,2OUT 0A1H,ALret IS8255: IN AL,DX ;从A端口读入数据MOV BUFBX,AL ;存到BUF内INC BX ;指向下一个,MOV AL,61H ;指定中断结束命令OUT 0A0H,AL ;从片结束IR1中断MOV A
15、L,62H ;主片结束IR2中断OUT 20H,ALPOP AX ;修改返址INC AXINC AXPUSH AXIRET begin endp code endsend begin,说明,中断控制器8259单片: 地址:20H, 21H 中断类型码:08H-0FH 中断控制器8259级联时:主片:地址,类型码同上从片:地址:0A0H, 0A1H中断类型码:70H-77H连法:主片IR2 -从片IR1,方式1输入 小结,可分成A/B两组 端口A/B作为数据的输入输出,C端口的某些位作为控制信号。 对于A组: A端口输入数据 PC3为INTR, 接8259的输入端IRn PC4为STB,接中断控
16、制开关,如抖动开关 PC5为IBF,接状态标志,如发光二极管 对PC4置位,可以控制端口A的中断,方式1输出的状态控制信号及其时序关系如图。,(1) OBF 输出缓冲器满信号,低电平有效。表示外设可以把数据取走。它由ACK的前沿(下降沿)即外设取走数据后,使其恢复为高。(2)ACK(acknowledge) 低电平有效。这是外设发出的响应信号。,(3)INTR 中断请求信号,高电平有效。当输出装置已经接受了CPU输出的数据后,它用来向CPU提出中断请求,要求CPU继续输出数据。OBF为“1”(高电平)和INTE为“1”(高电平)时,由ACK的后沿(上升沿),使其置位(高电平),WR信号的前沿(
17、下降沿)使其复位(低电平)。 (4)INTEA 由PC6的置位/复位控制。而INTEB由PC2置位/复位控制。INTE置位允许中断。,例8.3 用8只发光二极管及时反映8个监控量的状态,设计接口电路和控制程序。用8个开关模拟8个监控量的状态。A端口输入8个监控量的状态,B端口接8只发光二极管。A端口基本输入,B端口选通输出,用单稳电路来产生选通信号ACK。当需要了解8个监控量的状态时发来选通信号ACK,该信号使控制程序进入中断服务程序。在中断服务程序中,从A端口输入8个监控量的状态后立即从B端口输出。,接口电路,stack segment stack stackdw 32 dup(0) sta
18、ck ends data segment DA1 DB WAIT INTERRUPT, 0DH, 0AH, $ data ends code segment begin proc farassume ss: stack, cs: code, ds: datapush dssub ax, axpush ax,控制程序:,MOV ES,AX mov ax, data mov ds, ax MOV DX,393H MOV AL,94H OUT DX,AL MOV AL,5 ;PC2置1,允许B端口中断 OUT DX,AL MOV AX,SEG IO8255 ;中断程序入口地址送中断向量表 MOV E
19、S:01C6H,AX MOV AX,OFFSET IO8255 MOV ES:01C4H,AX IN AL,0A1H ;读屏蔽字 AND AL,0FDH ;改变屏蔽字,允许IRQ9中断 OUT DX,AL,ROTT: MOC DX,OFFSET DA1MOV AH,9INT 21HJMP $MOV AH,11INT 21HCMP AL,0JE ROTTIN AL,0A1H ;恢复屏蔽字,禁止IRQ9中断OR AL,2OUT 0A1H,ALret,IO8255: MOV DX,390HIN AL,DXINC DXOUT DX,ALMOV AL,61H ;指定中断结束命令OUT 0A0H,ALMO
20、V AL,62HOUT 20H,ALPOP AX ;修改返址INC AXINC AXPUSH AXIRET begin endp code endsend begin,方式1输出 小结,可分成A/B两组 端口A/B作为数据的输入输出,C端口的某些位作为控制信号。 对于B组: B端口输出数据 PC0为INTR, 接8259的输入端IRQn PC2为ACK,接中断控制开关,如消抖开关 PC1为OBF,接状态标志,如发光二极管 对PC2置位,可以允许端口B的中断,这种工作方式,使外设可在单一的8位数据总线上,既能发送,又能接收数据(双向总线I/O)。方式2只限于A组使用,它用双向总线端口A和控制端口
21、C中的5位进行操作,此时,端口B可用于方式0或方式1。端口C的其他3位作I/O用或作端口B控制状态信号线用。,方式2状态控制信号:,INTE1是输出的中断允许信号,由PC6的置位/复位控制 INTE2是输入的中断允许信号,由PC4的置位/复位控制 其他信号的作用及意义与方式1相同。,8. 可编程计数器/定时器8253,Intel系列的计数器/定时器,型号为8253,改进型为8254。8253具有3个独立的功能完全相同的16位计数器,每个计数器都有6种工作方式。,8253的内部结构:,8.1 8253的组成与接口信号,三态、双向、8位的缓冲器。 负责8253和CPU的数据传送。 连CPU的数据总
22、线 具有下面3个基本功能。(1) 传控制字内容给8253的寄存器。(2) 传计数初值给8253的计数器。(3) CPU读取某个计数器的现行值。,8.1 8253的组成与接口信号,CS、RD、WR、A1和A0组合起来所产生的选择与操作功能:,8.1 8253的组成与接口信号,控制字寄存器有3个,都是8位的寄存器,分别对应于3个计数器。写入的控制字由该控制字的最高2位确定送入哪个计数器的控制字寄存器寄存。,8.1 8253的组成与接口信号,每个计数器有CLK, OUT, GATE三个引脚。GATE: 控制计数器是否-1,开始计数CLK: 控制-1的速度(脉冲频率的快慢)OUT: 减到0时输出,8.
23、1 8253的组成与接口信号,8253的计数器有6种工作方式:(1)方式0-计数结束中断(2)方式1-硬件触发单拍脉冲(3)方式2-频率发生器(4)方式3-方波发生器(5)方式4-软件触发选通(6)方式5-硬件触发选通,8.2 计数器的工作方式及其与输入输出的关系,6种工作方式的输出信号,8.2 计数器的工作方式及其与输入输出的关系,8253的控制字,8.3 8253的控制字和初始化编程,要使用8253初始化编程的步骤为:先写入控制字,然后写入计数初值。控制字和计数初值,是通过两个不同的端口地址写入的。 控制字都是写入控制字寄存器的端口地址。 计数初值是由各个计数器的端口地址写入的。,8.3
24、8253的控制字和初始化编程,例如:用计数器0,工作在方式1,按十进制计数,计数值为5080。若该片8253的端口地址为388H38BH,则初始化程序段为:,MOV DX,38BH ;控制字寄存器地址11 MOV AL,33H OUT DX,AL MOV DX,388H ;计数器0地址00 MOV AL,80H ;装计数值低8位 OUT DX,AL MOV AL,50H ;装计数值高8位 OUT DX,AL,8.3 8253的控制字和初始化编程,例2:用计数器1,工作在方式0,按二进制计数,计数值为2244H。若该片8253的端口地址为388H38BH,则初始化程序段为:,MOV DX,38B
25、H ;控制字寄存器地址11 MOV AL,70H OUT DX,AL MOV DX,389H ;计数器1地址01 MOV AL,44H ;装计数值低8位 OUT DX,AL MOV AL,22H ;装计数值高8位 OUT DX,AL,8.3 8253的控制字和初始化编程,CPU可以读取8253的任一瞬间计数值。 8253的计数器是16位的,要分两次读至CPU。 因此,要设法锁存。 锁存有两种办法:(1)利用GATE信号使计数过程暂停。(2)向8253输送一个控制字,令8253的计数值在出寄存器锁存。,8.3 8253的控制字和初始化编程,例如:读取计数器1的16位计数值,存入CX中,其程序段为
26、:,MOV DX,38BH ;控制字寄存器端口MOV AL,40H ;设置计数器1为锁存状态OUT DX,ALMOV DX,389H ;计数器1端口 IN AL,DX ;读取计数值MOV CL,AL ;低8位存到CLIN AL,DX ;第二次读取MOV CH,AL ;高8位存到CH,8.3 8253的控制字和初始化编程,例8.4 8253在IBM PC XT中的应用。,8.4 8253的应用,IBM PC XT微型计算机中8253的部分线路, 端口地址为40H5FH, BIOS取为计数器040H,计数器141H,计数器242H,控制字寄存器43H。3个计数器的输入时钟频率均为1.19MHz。计
27、数器0输出作为18.2Hz方波发生器。用来输出方波作为中断控制器8259的第0号中断信号线(IRQ0)的输入。计数器0的计数值为:1.19M/18.2=65384=216即送16位的0,故其控制字为36H。,8.4 8253的应用,对计数器0初始化的程序段如下:MOV AL,36HOUT 43H,ALMOV AL,0OUT 40H,ALOUT 40H,AL,方式3:方波发生器,装入初值后,OUT输出方波 如果计数初值为N, 方波的周期为N个CLK的周期。 方波的一个周期内,一半高,一半低,计数器输出间隔为15S的负脉冲。该脉冲的上升沿触发D触发器。计数器1的计数值为:1.19106/(1/15
28、)10-6=18故其控制字为54H。对计数器1的初始化程序段如下:MOV AL,54HOUT 43H,ALMOV AL,18OUT 41H,AL,方式2:频率发生器,装入初值后 - OUT 高 CLK控制计数器 -1 直到:计数减到0 - OUT 低 (瞬间) 自动再装初值 - OUT 高,以一定的频率输出负脉冲,计数器2输出不同频率的方波,经电流驱动器75477放大,推动扬声器发出不同频率的声响。计数器2的计数值为可变值。随蜂鸣器声响频率的高低而变,程序设计中让它的取值范围由1到65535,即16位二进制数,故其控制字为B6H。,entry parameters: DH= Number of
29、 long tones to beep DL= Number of short tones to beep err-beep procPUSHF ;保存所有的标志位CLI ;关中断PUSH DSMOV AX,DATA ;DS指向数据段MOV DS,AXOR DH,DH ;是否要鸣长音JZ G3 ;不鸣长音,去鸣短音,下面是IBM PC XT机BIOS中的开机诊断子程序。该子程序让蜂鸣器鸣一声长音(3秒)和一声短音(0.5秒),以指出系统板或RAM模块或者CRT显示器有错。,G1: MOV BL,6 ;蜂鸣常数,一次鸣响延续时0.5BLCALL BEEP ;调用鸣响子程序 G2: LOOP G2
30、 ;鸣响间隔,等待500mSDEC DHJNZ G1 ;长音没鸣响完,继续CMP MFG-TST,1 ;为制造测试模式?JNZ G3 ;为制造测试模式,继续鸣响短音MOV AL,0DH ;停止LED闪OUT PORT-B,AL ;PORT-B=61H,即8255B端口JMP G1,G3: MOV BL,1 ;短音鸣响时间为0.51=0.5SCALL BEEP G4: LOOP G4DEC DLJNZ G3 ;短音没鸣响完,继续 G5: LOOP G5 ;短音鸣响完,延迟1S返回 G6: LOOP G6POP DSPOPFRET err-beep endp,鸣响子程序: beep procMOV
31、 AL,0B6H ;计数器2的控制字OUT 43H,ALMOV AX,533H ;1000Hz分频值,分高低字节两次送入OUT 42H,ALMOV AL,AHOUT 42H,ALIN AL,61H ;读取8255B端口的状态MOV AH,ALOR AL,3,OUT 61H,AL ;打开蜂鸣器SUB CX,CX ;设置等待500ms的常数值 G7: LOOP G7DEC BL ;等0.5sBLJNZ G7MOV AL,AH ;恢复8255B端口的原来值,关蜂鸣器OUT 61H,ALRET beep endp,例8.5 对外部事件计数10次。计数电路如图所示,由图可知,使用的是计数器0。,工作原理
32、,CLK接了单稳电路,第一次拨动KC后,才能装入计数初值。 之后每次拨动KC, 计数器值 -1 计数器0工作在方式0,方式0:计数结束中断,装入初值后 - OUT 低 CLK控制计数器 -1 直到:计数器减到0 - OUT 高,如果程序再次装入初值,则以上过程重复一次。,stack segment stack stackdw 32 dup(0) stack ends data segment DA1 DB WAIT LOAD,0AH,0DH,$ DA2 DB PLEASE INPUT,0AH,0DH,$ DA3 DB PROGRAM TERMINATED NORMALLY,0AH,0DH,$
33、data ends code segment begin proc farassume ss:stack,cs:code,ds:datapush ds,sub ax,axpush axmov ax,datamov ds,axMOV DX,383H ;计数器0的方式0,BCD计数MOV AL,11HOUT DX,ALMOV DX,380H ;给计数器0送初值MOV AL,10H ;十进制BCD计数,10H表示10次OUT DX,ALMOV DX,OFFSET DA1 ;显示DA1MOV AH,9INT 21HMOV DX,380H ;计数器0的端口地址,LOAD: IN AL,DX ;读计数器0
34、的计数值CMP AL,10H ;是否装入初值JNE LOAD ;若没装入,继续等待MOV DX,OFFSET DA2 ;装入成功,显示DA2MOV AH,9INT 21HMOV DX,380H CONTIN: IN AL,DX ;读计数器0的值CMP AL,0 ;是否拨了10次,减到0JNZ CONTINMOV DX,OFFSET DA3;计数器减到0,显示DA3MOV AH,9INT 21Hret begin endp code endsend begin,将OUT0接至80x86微机的IRQ9,使用中断编程的程序如下:stack segment stack stackdw 32 dup(0
35、) stack ends data segment DA1 DB WAIT LOAD,0AH,0DH,$ DA2 DB PLEASE INPUT,0AH,0DH,$ DA3 DB PROGRAM TERMINATED NORMALLY,0AH,0DH,$ data ends,code segment begin proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axMOV ES,AXmov ax,datamov ds,axMOV DX,383H ;8253计数器的方式0,BCD计数MOV AL,11HOUT DX,AL,MO
36、V DX,380HMOV AL,10HOUT DX,ALMOV DX,OFFSET DA1MOV AH,9INT 21HMOV DX,380H LOAD: IN AL,DXCMP AL,10H ;等待单稳输入脉冲,装入计数初值JNE LOADMOV AX,SEG IS8253 ;填写中断向量表MOV ES:01C6H,AX,MOV AX,OFFSET IS8253MOV ES:01C4H,AXIN AL,0A1H ;改变屏蔽字,允许IRQ9中断AND AL,0FDHOUT 0A1H,ALMOV DX,OFFSET DA2MOV AH,9INT 21HJMP $ ;等待单稳输入10个脉冲MOV
37、DX,OFFSET DA3MOV AH,9INT 21Hret,IS8253: MOV AL,61H ;指定中断结束命令OUT 0A0H,ALMOV AL,62HOUT 20H,ALIN AL,0A1H ;关屏蔽,禁止IRQ9中断OR AL,2OUT 0A1H,ALPOP AX ;修改返址INC AXINC AXPUSH AXIRET begin endp code endsend begin,POP CXRET DELAY ENDP ALLB PROCMOV DL,DHAND DL,0FHADD DL,30HCMP DL,3AHJC NAD7ADD DL,7 NAD7: MOV AH,2INT 21HRET ALLB ENDP code endsend begin,