1 / 16

例 1 8253 与 8251 综合应用举例

例 1 8253 与 8251 综合应用举例. 串行接口芯片 8251 与定时器 / 计数器 8253 的电路连接如图所示, 8251 的发送端 TXD 和接收端 RXD 连接在一起, 8253 的 OUT0 用于产生 8251 的发送和接收时钟 Txclk 和 Rxclk ,已知 8251 的控制口地址为 2B9H ,数据口地址为 2B8H 。 8253 的控制口地址为 283H ,定时器 0 地址为 280H 。 要求编程:从微机键盘输入一个字符,将其 ASCII 码加 1 后发送出去,再接收回来在屏幕上显示这两个字符。实现自发自收,按 ESC 键之后程序结束。.

ivan
Download Presentation

例 1 8253 与 8251 综合应用举例

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 例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接口电路图

  2. 流程图

  3. 参考程序 • 8253通道0的计数初值=时钟频率÷(波特率×波特率因子)。 其中时钟频率接1MHz,波特率若选1200,波特率因子若选16, 则计数器初值=1000000/(1200 × 16)=52。 • 3. 收发采用查询方式。

  4. ;******************************; ;*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

  5. 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

  6. 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 ;延时

  7. ;向端口输出一字节的子程序 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

  8. 例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全亮一次后再全部熄灭,然后结束。 • 设该题利用实验台相关设备资源,试编程。

  9. +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接口电路图

  10. ;应用程序 ;****************************************; ;*可编程并行口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

  11. 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

  12. ;设置中断掩码 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

  13. ;初始化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 ;只写高字节

  14. ;初始化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

  15. ;设置 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

  16. ;中断服务子程序 ;发 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;循环点亮灯

More Related