北京交通大学微机接口实验实验报告姓名:学号:班级: 1 目录实验一交通灯控制实验---------------------------------------------------------1 实验二实验三实验四实验五实验六可编程定时器/计数器-----------------------------------------5 中断--------------------------------------------------------------------------9 模/数转换器-------------------------------------------------------------15 PC机串行通讯实验----------------------------------------------------18 竞赛抢答器--------------------------------------------------------------24 2 实验一交通灯控制实验一、实验目的通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。
二、实验内容如图1,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。
编程使六个灯按交通灯变化规律燃灭。
L7L6L5L2L1L0 PC7 PC6 PC5PC2 PC1 PC0 288H—28FHCS8255 图 1 十字路口交通灯的变化规律要求:南北路口的绿灯、东西路口的红灯同时亮3秒左右。
南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。
南北路口的红灯、东西路口的绿灯同时亮3秒左右。
南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。
转重复。
8255动态分配地址:控制寄存器:28BH 0EC0BH A口地址:288H 0EC08H C口地址:28AH 0EC0AH三、参考流程1 开始设置8255A口输出C口输出南北路口绿灯亮,东西路口红灯亮长延时南北路口黄灯闪,东西路口红灯亮南北路口红灯亮,东西路口绿灯亮长延时南北路口红灯亮,东西路口黄灯闪是否有键按下返回DOS图 2 四、源程序及注释源程序:CODE SEGMENT ASSUME CS:CODE START: MOV DX,0EC0BH MOV AL,10010000B;C口方式0输出,A 口输入OUT DX,AL FIRST: MOV DX,0EC0AH MOV AL,00100100B OUT DX,AL;南北绿,东西红写入C口MOV CX,0;送入初值65536 MOV AX,4000H;软件长延时,经验值确定DELAY1:DEC AX JNZ DELAY1LOOP DELAY1 MOV BL,4;控制黄灯亮的次数SECOND:MOV DX,0EC0AH MOV AL,01000100B 2 OUT DX,AL;南北黄,东西红MOV CX,3000H MOV AX,0100HLI1: DEC AX JNZ LI1 LOOP LI1 MOV DX,0EC0AH;软件短延时MOV AL,00000100B;南北黄灭OUT DX,AL MOV CX,3000H MOV AX,0100H WEN1: DEC AX JNZ WEN1LOOP WEN1 DEC BL JNZ SECOND THIRD: MOV DX,0EC0AH MOV AL,10000001B OUT DX,AL MOV CX,0 MOV AX,4000H DELAY2:DEC AX JNZ DELAY2 LOOP DELAY2MOV BL,4FORTH: MOV DX,0EC0AH MOV AL,10000010B OUT DX,AL MOV CX,3000H MOV AX,0100H LI2:DEC AX JNZ LI2 LOOP LI2MOV DX,0EC0AH MOV AL,10000000B OUT DX,AL MOV CX,3000H MOV AX,0100H WEN2:DEC AX JNZ WEN2 ;软件短延时;黄灯闪烁4次;写入C口;南北红,东西绿;软件长延时;控制黄灯亮的次数;写入C口;南北红,东西黄;软件短延时;东西黄灭 3LOOP WEN2 DEC BL JNZ FORTH;黄灯闪烁4次MOV DL,0FFH MOV AH,06H INT 21H;执行键盘输入操作JZ FIRST MOV AH,4CH INT 21H;返回操作系统CODE ENDS END START 五、总结在本次实验中,我主要学会了如何控制延时时间,加长延时时间可以是二极管的闪烁是肉眼可见的。
还有就是尽管程序中有键盘输入后可以退出程序的语句,但是必须在程序恰好执行到这个语句时才能有效。
总体上这个程序还是比较简单的,只要按照流程就可以写出程序。
4 实验二可编程定时器/计数器一、实验目的掌握8253的基本工作原理和编程方法。
二、实验内容1.按图3虚线连接电路,将计数器0设置为方式0,计数器初值为N,用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化。
CLK0 8253280H-GATE0CS OUT0 图3 2.按图4连接电图,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化。
OUT1 8253 GATE1280H-CLK1CS OUT0GATE0CLK01MHZ 图4 5 二、参考流程图开始开始设计数器0为工作方式0设计数器0为工作方式3送计数器初值读计数器值向计数器0送初值1000先送低字节后送高字节设计数器1为工作方式3N显示计数器有按键按下吗?Y向计数器1送初值1000先送低字节后送高字节结束结束图5图6 四、源程序及注释源程序1:CODE SEGMENT ASSUME CS:CODE START:MOV DX,0EC03H MOV AL,10H;设置控制字00010000 OUT DX,AL;对控制寄存器写入控制字MOV DX,0EC00H MOV AL,0FH;将0FH存入AL寄存器OUT DX,AL;将此时AL的值送入DX端口LP1: IN AL,DX;从DX端口读入8位,放在AL寄存器中CALL DISP;调用DISP PUSH DX;将DX内容保存到堆栈段MOV AH,06H;将06H存入AH,为了下句调用21中断MOV DL,0FFH ;将0FFH存入DL INT 21H;调用21中断POP DX;将DX的内容推出栈段 6 JZ LP1;如果DX的内容是0,就跳转到LP1MOV AH,4CH INT 21H;调用中断DISP PROC NEAR;定义一个名为DISP的子程序PUSH DX;把DX的内容保存到堆栈段中AND AL,0FH;将AL寄存器的内容与0FH进行“与”运算,再把结果存入AL中MOV DL,AL;将AL的值送入DL寄存器CMP DL,9;比较DL中的值与9的大小JLE NUM;如果DL的值小于或等于9时,则跳转到NUM ADD DL,7;将DL的值与7进行相加后,再送入DL中NUM: ADD DL,30H;将DL的值与30H进行相加后,得到ASCII值MOV AH,02H;在屏幕上显示DL INT 21H;调用DOS21中断MOV DL,0DH;回车INT 21H;调用中断指令MOV DL,0AH;换行INT 21H;调用DOS21中断POP DX;将DX的内容推出栈段RET;子程序在功能完成后返回调用程序继续执行DISP ENDP CODE ENDS END START 源程序2:CODE SEGMENTASSUME CS:CODE START:MOV DX,0EC03H MOV AL,36H ;设置控制字00110110OUT DX,AL MOV AX,1000 ;向计数器0送初值1000 MOV DX,0EC00H ;把计数器0地址放在DX寄存器中OUT DX,AL;将AL的低字节送入DX端口MOV AL,AH OUT DX,AL;将AX的高字节送入DX端口MOV DX,0EC03H ;把端口地址放在DX寄存器中MOV AL,76H ;设置控制字01110110 OUT DX,AL;将AL的值送入DX端口MOV AX,1000 ;向计数器1送初值1000 MOV DX,0EC01H ;把端口地址放在DX寄存器中OUT DX,AL;将AL的低字节送入DX端口MOV AL,AH OUT DX,AL;将AX的高字节送入DX端口MOV AH,4CH7 INT 21H;调用DOS21中断CODE ENDS END START五、总结通过本次实验,我更加深入的了解到8253的工作方式。
在实验中我用了计数器0,但是也可以改用计数器1,只需要改写控制字。
在显示数字时,对于0~9,要加上30H,而对于大于9的数字,要加上37H。
8实验三中断一、实验目的1.掌握PC机中断处理系统的基本原理。
2.学会编写中断服务程序。
三、实验内容PC机用户可使用的硬件中断只有可屏蔽中断,8259中断控制器管理。
中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。
IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:中断源中断类型号中断功能IRQ008H 时钟IRQ109H键盘IRQ2 0AH保留IRQ3OBH串行口 2 IRQ40CH串行口 1 IRQ50DH硬盘IRQ60EH 软盘IRQ70FH并行打印机8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。
对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级连,对外可以提供16个中断源:中断源中断类型号中断功能IRQ8 070H实时时钟IRQ9071H 用户中断IRQ10072H保留IRQ11073H保留IRQ12 074H保留9 IRQ13075H协处理器IRQ14 076H硬盘IRQ15077H 保留PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。
IRQ+5 图7 实验电路如图7,直接用手动产单脉冲作为中断请求信号。
要求每按一次开关产生一次中断,在屏幕上显示一次“TPC pci card Interrup t”,中断10次后程序退出。
三、参考流程图10 开始关中断设置TPC卡中断使能保存原中断向量设置新中断向量设置中断掩码显示提示信息开中断Y计数器为0?N 中断开始Y按任意键?N关中断计数器减一显示提示信息发出EOI结束中断开中断中断返回恢复中断掩码恢复原中断向量设置TPC卡中断关闭结束返回图8图9 四、源程序及注释源程序:data segment int_vect EQU 073H;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h irq_mask_2_7 equ 11111011b;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零11 irq_mask_9_15 equ 11110111b ;中断0-7时全一,中断8-15时从低至高相应位为零ioport_cent equ 0E800h ;tpc 卡中9054芯片的io地址csreg dw? ipreg dw?;旧中断向量保存空间irq_times dw00h;中断计数msg1db 0dh,0ah,’TPC pci card Interrupt’,0dh,0ah,’$’ msg2db 0dh,0ah,’Press any key to exit!’,0dh,0ah,’$’ msg3db 0dh,0ah,’Press DMC to interrupt 10 times and exit!’,0dh,0ah,’$’ data ends stack segment stack db 100 dup (?) stack ends code segment assume cs:code,ds:data,ss:stack,es:datastart: ;Enable Local Interrupt Input .386 cli mov ax,data mov ds,ax mov es,ax mov ax,stack mov ss,ax mov dx,ioport_cent+68h ;设置tpc 卡中9054芯片io口,使能中断in ax,dx or ax,0900h out dx,ax mov al,int_vect;保存原中断向量mov ah,35h int 21h mov ax,es mov csreg,axmov ipreg,bx mov ax,seg int_proc;设置新中断向量mov ds,ax mov dx,offset int_proc mov al,int_vect mov ah,25h int 21h in al, 21h;设置中断掩码12 and al, irq_mask_2_7 out21h, al in al, 0a1h and al, irq_mask_9_15 out0a1h, al mov ax,data mov ds,ax mov dx,offset msg2 mov ah,09h int 21h mov dx,offset msg3 mov ah,09h int 21h mov irq_times,0ah sti loop1: cmp irq_times,0;等待中断并判断中断10次后退出jz exit mov ah,1 int 16h jnz exit;按任意键退出jmp loop1 exit: cli mov bl, irq_mask_2_7;恢复中断掩码not bl in al, 21h or al, bl out21h, al mov bl, irq_mask_9_15 not bl in al, 0a1h or al, bl out0a1h, al mov dx,ipreg;恢复原中断向量mov ax,csreg mov ds,ax mov ah,25h mov al,int_vect int 21h 13mov dx,ioport_cent+68h;设置tpc 卡中9054芯片io口,关闭中断in ax,dx and ax,0f7ffh out dx,ax mov ax,4c00h int 21h int_proc proc far push ax push dx push ds dec irq_times mov ax,data;Interrupt to do mov ds,ax mov dx,offset msg1 mov ah,09h int 21h mov al,20h;Send EOI out 0a0h,al out 20h,al pop ds pop dx pop ax sti iret int_proc endp code ends end start 五、总结本次实验的程序比较复杂,所以我用的是老师所准备的程序。