160 likes | 445 Views
例 1 8253 与 8251 综合应用举例. 串行接口芯片 8251 与定时器 / 计数器 8253 的电路连接如图所示, 8251 的发送端 TXD 和接收端 RXD 连接在一起, 8253 的 OUT0 用于产生 8251 的发送和接收时钟 Txclk 和 Rxclk ,已知 8251 的控制口地址为 2B9H ,数据口地址为 2B8H 。 8253 的控制口地址为 283H ,定时器 0 地址为 280H 。 要求编程:从微机键盘输入一个字符,将其 ASCII 码加 1 后发送出去,再接收回来在屏幕上显示这两个字符。实现自发自收,按 ESC 键之后程序结束。.
E N D
例1 8253与8251综合应用举例 • 串行接口芯片8251与定时器/计数器8253的电路连接如图所示,8251的发送端TXD和接收端RXD连接在一起,8253的OUT0用于产生8251的发送和接收时钟Txclk和Rxclk,已知8251的控制口地址为2B9H,数据口地址为2B8H。8253的控制口地址为283H,定时器0地址为280H。 • 要求编程:从微机键盘输入一个字符,将其ASCII码加1后发送出去,再接收回来在屏幕上显示这两个字符。实现自发自收,按ESC键之后程序结束。 8253与8251接口电路图
参考程序 • 8253通道0的计数初值=时钟频率÷(波特率×波特率因子)。 其中时钟频率接1MHz,波特率若选1200,波特率因子若选16, 则计数器初值=1000000/(1200 × 16)=52。 • 3. 收发采用查询方式。
;******************************; ;*8251串行通讯(自发自收)*; ;******************************; data segment ioport equ 5400h-0280h ;tpc 卡中设备的io地址 io8253t0 equ ioport+280h io8253ctrl equ ioport+283h io8251a equ ioport+2b8h io8251b equ ioport+2b9h mes1 db 'you can play a key on the keybord!',0dh,0ah,24h mes2 dd mes1 data ends stacks segment stack db 100 dup (?) stacks ends code segment assume cs:code,ds:data,ss:stacks
start: mov ax,data mov ds,ax mov dx,io8253ctrl ;设置8253计数器0工作方式 mov al,16h ;00 01 011 0 out dx,al mov dx,io8253t0 mov al,52 ;给8253计数器0送初值 out dx,al mov dx,io8251b ;初始化8251 xor al,al mov cx,03 ;向8251控制端口送3个0 delay: call out1 loop delay mov al,40h ;向8251控制端口送40H,使其复位 call out1
mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 call out1 mov al,27h ;向8251送控制字允许其发送和接收 call out1 lds dx,mes2 ;显示提示信息 mov ah,09 int 21h waiti: mov dx,io8251b in al,dx test al,01 ;发送是否准备好 jz waiti mov ah,01h ;是,从键盘上读一字符 int 21h cmp al,27 jz exit ;若为ESC键,则结束返回 inc al mov dx,io8251a out dx,al ;发送 mov cx,40h delay: loop delay ;延时
;向端口输出一字节的子程序 out1 proc near out dx,al push cx mov cx,40h gg: loop gg ;延时 pop cx ret out1 endp code ends end start next: mov dx,io8251b in al,dx test al,02h ;检查接收是否准备好 jz next ;没有,等待 mov dx,io8251a in al,dx ;准备好,接收 mov dl,al mov ah,02h ;显示接收到的字符 int 21h jmp waiti exit: mov ax,4c00h ;退出 int 21h
例2 8253、8255A与8259A综合应用举例 • 微机系统中8253、8255A与8259A的连接电路及各接口芯片的地址分配如图所示。 • 已知主片8259A的中断类型码为08H~0FH,从片8259A的中断类型码为70H~77H。 • 使8255A工作于方式1,输出,允许中断方式工作,A口连接8个发光二极管L0~L7 ,PC0口线连接逻辑电平开关K0。 • 利用8253的定时功能,当K0断开时,每隔1秒钟使8255A产生一次输出中断请求,让CPU进行一次中断服务:依次使L0~L7发光。当K0闭合时,则使L0~L7全亮一次后再全部熄灭,然后结束。 • 设该题利用实验台相关设备资源,试编程。
+5V IR0 IR0 INTR INT IR1 IR1 IR2 IR2 INTA INTA INTA IR3 IR3 8259A SP/EN SP/EN IR4 IR4 20H~21H IR5 IR5 IR6 IR6 +5V IR7 IR7 CAS2 CAS1 CAS0 +5V K0 CAS2 CAS1 CAS0 PC0 GATE0 1MHz L0 INT 8255A CLK0 PA0 GATE1 L1 OUT0 PA1 L2 PA2 8253 8259A CLK1 PC3 L3 PA3 L4 PA4 L5 PA5 A0H~A1H L6 OUT1 PA6 L7 PC6 PA7 CS CS CS CS 288H~28BH 280H~283H 8253、8255A与8259A接口电路图
;应用程序 ;****************************************; ;*可编程并行口8255方式1,A口输出*; ;****************************************; data segment ;中断0-7的向量号为08h-0fh,中断8-15的向量号为70h-77h int_vect equ 072H; irq_mask_0_7 equ 11111011b ;主片中断掩码,允许主片IR2中断 ;当检测到TPC卡中的interrupt_line为0BH时,用的是从片的IR2中断 irq_mask_8_15 equ 11111011b ;从片中断掩码,允许从片IR2中断 ioport_data equ 5400h-280h ;tpc 卡中设备的I/O地址 ioport_cent equ 5000h ;tpc 卡中9054芯片寄存器组的I/O起始地址 io8253t0 equ ioport_data+280h io8253t1 equ ioport_data+281h io8253ctrl equ ioport_data+283h io8255a equ ioport_data+288h io8255c equ ioport_data+28ah io8255ctrl equ ioport_data+28bh
csreg dw ? ipreg dw ? ;旧中断向量保存空间 portout db 00h ;中断计数 msg1 db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$' msg2 db 0dh,0ah,'Press K0 to exit!',0dh,0ah,'$' data ends stacks segment stack db 100 dup (?) stacks ends code segment assume cs:code,ds:data,ss:stacks,es:data .386 start: cli ;关中断 mov ax,data mov ds,ax mov es,ax
;设置中断掩码 in al, 21h and al, irq_mask_2_7 out 21h, al in al, 0a1h and al, irq_mask_9_15 out 0a1h, al mov ax,data mov ds,ax mov dx,offset msg2 mov ah,09h int 21h ;设置 tpc 卡中9054芯片端口,使能9054中断 mov dx,ioport_cent+68h ;中断使能寄存器 in ax,dx or ax,0900h ;D8=1,允许产生PCI中断 out dx,ax ;D11=1,允许local端中断送PCI端 ;保存原中断向量 mov al,int_vect mov ah,35h int 21h mov ax,es mov csreg,ax mov ipreg,bx ;设置新中断向量 mov ax, seg int_proc mov ds,ax mov dx,offset int_proc mov al,int_vect mov ah,25h int 21h
;初始化8253 mov dx,io8253ctrl ;向8253写控制字 mov al,36h ;使0通道为工作方式3 out dx,al mov ax,1000 ;写入循环计数初值1000 mov dx,io8253t0 out dx,al ;先写入低字节 mov al,ah out dx,al ;后写入高字节 mov dx,io8253ctrl mov al,65h ;设8253通道1工作方式2,BCD计数 out dx,al mov al,10h ;写入循环计数初值1000 mov dx,io8253t1 out dx,al ;只写高字节
;初始化8255A mov dx, io8255ctrl ;置8255为A口方式1输出,PC0输入 mov al,0a1h out dx,al mov al,0dh ;将PC6置位 out dx,al mov portout,1 ;A口输出初始值数据00000001 sti ;开中断 loop1: mov dx, io8255c ;读入C口状态 in al,dx test al,01h ;PC0=1,K0键按下? jz loop1 exit: cli ;按键退出 mov dx, io8255a ;将AL从8255的A口输出 mov al,0ffh ;所有灯亮 out dx,al mov cx,0ffffh loop2: mov ax,0f000h ;延时 loop3: dec ax jne loop3 loop loop2 mov al,0 ;所有灯灭 out dx,al
;设置 tpc 卡中9054芯片io口,关闭中断 mov dx,ioport_cent+68h in ax,dx and ax,0f7ffh ;D11=0,禁止中断送PCI端 out dx,ax mov ax,4c00h int 21h ;退出,返回DOS ;恢复中断掩码 mov bl, irq_mask_2_7 not bl in al, 21h or al, bl out 21h, al mov bl, irq_mask_9_15 not bl in al, 0a1h or al, bl out 0a1h, al ;恢复原中断向量 mov dx,ipreg mov ax,csreg mov ds,ax mov ah,25h mov al,int_vect int 21h
;中断服务子程序 ;发 EOI中断结束命令 mov al,20h out 0a0h,al out 20h,al pop ds ;恢复现场 pop dx pop cx pop bx pop ax sti ;开中断 iret ;中断返回 int_proc endp code ends end start int_proc proc far push ax;保护现场 push bx push cx push dx push ds mov ax,data mov ds,ax mov dx,offset msg1 mov ah,09h int 21h ;将AL从8255的A口输出 mov al,portout mov dx, io8255a out dx,al rol portout,1;循环点亮灯