1微机接口实验实验报告姓名:学号:班级:2目录实验一交通灯控制实验---------------------------------------------------------1实验二可编程定时器/计数器(8253)-----------------------------------------5实验三中断--------------------------------------------------------------------------9实验四模/数转换器-------------------------------------------------------------15实验五PC机串行通讯实验----------------------------------------------------18实验六竞赛抢答器--------------------------------------------------------------241实验一交通灯控制实验一、实验目的通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。二、实验内容如图1,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通灯变化规律燃灭。PC7PC6PC5PC2PC1PC0CS8255L7L6L5L2L0L1288H—28FH图1十字路口交通灯的变化规律要求:(1)南北路口的绿灯、东西路口的红灯同时亮3秒左右。(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。(3)南北路口的红灯、东西路口的绿灯同时亮3秒左右。(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。(5)转(1)重复。8255动态分配地址:控制寄存器:28BH0EC0BHA口地址:288H0EC08HC口地址:28AH0EC0AH三、参考流程2开始设置8255A口输出C口输出南北路口绿灯亮,东西路口红灯亮长延时南北路口黄灯闪,东西路口红灯亮南北路口红灯亮,东西路口绿灯亮长延时南北路口红灯亮,东西路口黄灯闪是否有键按下返回DOS图2四、源程序及注释源程序:CODESEGMENTASSUMECS:CODESTART:MOVDX,0EC0BHMOVAL,10010000B;C口方式0输出,A口输入OUTDX,ALFIRST:MOVDX,0EC0AHMOVAL,00100100BOUTDX,AL;南北绿,东西红写入C口MOVCX,0;送入初值65536MOVAX,4000H;软件长延时,由经验值确定DELAY1:DECAXJNZDELAY1LOOPDELAY1MOVBL,4;控制黄灯亮的次数SECOND:MOVDX,0EC0AHMOVAL,01000100B3OUTDX,AL;南北黄,东西红MOVCX,3000HMOVAX,0100HLI1:DECAXJNZLI1LOOPLI1MOVDX,0EC0AH;软件短延时MOVAL,00000100B;南北黄灭OUTDX,ALMOVCX,3000HMOVAX,0100HWEN1:DECAXJNZWEN1;软件短延时LOOPWEN1DECBLJNZSECOND;黄灯闪烁4次THIRD:MOVDX,0EC0AH;写入C口MOVAL,10000001BOUTDX,AL;南北红,东西绿MOVCX,0MOVAX,4000HDELAY2:DECAX;软件长延时JNZDELAY2LOOPDELAY2MOVBL,4;控制黄灯亮的次数FORTH:MOVDX,0EC0AH;写入C口MOVAL,10000010BOUTDX,AL;南北红,东西黄MOVCX,3000HMOVAX,0100HLI2:DECAXJNZLI2;软件短延时LOOPLI2MOVDX,0EC0AHMOVAL,10000000BOUTDX,AL;东西黄灭MOVCX,3000HMOVAX,0100HWEN2:DECAXJNZWEN24LOOPWEN2DECBLJNZFORTH;黄灯闪烁4次MOVDL,0FFHMOVAH,06HINT21H;执行键盘输入操作JZFIRSTMOVAH,4CHINT21H;返回操作系统CODEENDSENDSTART五、总结在本次实验中,我主要学会了如何控制延时时间,加长延时时间可以是二极管的闪烁是肉眼可见的。还有就是尽管程序中有键盘输入后可以退出程序的语句,但是必须在程序恰好执行到这个语句时才能有效。总体上这个程序还是比较简单的,只要按照流程就可以写出程序。5实验二可编程定时器/计数器(8253)一、实验目的掌握8253的基本工作原理和编程方法。二、实验内容1.按图3虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。CLK08253GATE0CSOUT0280H-图32.按图4连接电图,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。OUT18253GATE1CLK1CSOUT0GATE0CLK0280H-1MHZ图46二、参考流程图开始设计数器0为工作方式0送计数器初值读计数器值显示计数器有按键按下吗?结束YN开始设计数器0为工作方式3向计数器0送初值1000先送低字节后送高字节设计数器1为工作方式3向计数器1送初值1000先送低字节后送高字节结束图5图6四、源程序及注释源程序1:CODESEGMENTASSUMECS:CODESTART:MOVDX,0EC03HMOVAL,10H;设置控制字00010000(计数器0,方式0,写两个字节,二进制计数)OUTDX,AL;对控制寄存器写入控制字MOVDX,0EC00HMOVAL,0FH;将0FH存入AL寄存器OUTDX,AL;将此时AL的值送入DX端口LP1:INAL,DX;从DX端口读入8位,放在AL寄存器中CALLDISP;调用DISPPUSHDX;将DX内容保存到堆栈段MOVAH,06H;将06H存入AH,为了下句调用21中断MOVDL,0FFH;将0FFH存入DLINT21H;调用21中断POPDX;将DX的内容推出栈段7JZLP1;如果DX的内容是0,就跳转到LP1MOVAH,4CHINT21H;调用中断DISPPROCNEAR;定义一个名为DISP的子程序PUSHDX;把DX的内容保存到堆栈段中ANDAL,0FH;将AL寄存器的内容与0FH进行“与”运算,再把结果存入AL中MOVDL,AL;将AL的值送入DL寄存器CMPDL,9;比较DL中的值与9的大小JLENUM;如果DL的值小于或等于9时,则跳转到NUMADDDL,7;将DL的值与7进行相加后,再送入DL中NUM:ADDDL,30H;将DL的值与30H进行相加后,得到ASCII值MOVAH,02H;在屏幕上显示DLINT21H;调用DOS21中断MOVDL,0DH;回车INT21H;调用中断指令MOVDL,0AH;换行INT21H;调用DOS21中断POPDX;将DX的内容推出栈段RET;子程序在功能完成后返回调用程序继续执行DISPENDPCODEENDSENDSTART源程序2:CODESEGMENTASSUMECS:CODESTART:MOVDX,0EC03HMOVAL,36H;设置控制字00110110(计数器0,方式3,写两个字节,二进制计数)OUTDX,ALMOVAX,1000;向计数器0送初值1000MOVDX,0EC00H;把计数器0地址放在DX寄存器中OUTDX,AL;将AL的低字节送入DX端口MOVAL,AHOUTDX,AL;将AX的高字节送入DX端口MOVDX,0EC03H;把端口地址放在DX寄存器中MOVAL,76H;设置控制字01110110(计数器1,方式3,写两个字节,二进制计数)OUTDX,AL;将AL的值送入DX端口MOVAX,1000;向计数器1送初值1000MOVDX,0EC01H;把端口地址放在DX寄存器中OUTDX,AL;将AL的低字节送入DX端口MOVAL,AHOUTDX,AL;将AX的高字节送入DX端口MOVAH,4CH8INT21H;调用DOS21中断CODEENDSENDSTART五、总结通过本次实验,我更加深入的了解到8253的工作方式。在实验中我用了计数器0,但是也可以改用计数器1,只需要改写控制字。在显示数字时,对于0~9,要加上30H,而对于大于9的数字,要加上37H。9实验三中断一、实验目的1.掌握PC机中断处理系统的基本原理。2.学会编写中断服务程序。三、实验内容PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:中断源中断类型号中断功能IRQ008H时钟IRQ109H键盘IRQ20AH保留IRQ3OBH串行口2IRQ40CH串行口1IRQ50DH硬盘IRQ60EH软盘IRQ70FH并行打印机8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级连,对外可以提供16个中断源:中断源中断类型号中断功能IRQ8070H实时时钟IRQ9071H用户中断IRQ10072H保留IRQ11073H保留IRQ12074H保留10IRQ13075H协处理器IRQ14076H硬盘IRQ15077H保留PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。IRQ+5图7实验电路如图7,直接用手动产单脉冲作为中断请求信号(只需连接一根导线)。要求每按一次开关产生一次中断,在屏幕上显示一次“TPCpcicardInterrupt”,中断10次后程序退出。三、参考流程图11开始关中断设置TPC卡中断使能保存原中断向量设置新中断向量设置中断掩码显示提示信息开中断计数器为0?按任意键?恢复中断掩码恢复原中断向量设置TPC卡中断关闭结束返回YYNN中断开始关中断计数器减一显示提示信息发出EOI结束中断开中断中断返回图8图9四、源程序及注释源程序:datasegmentint_vectEQU073H;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77hirq_mask_2_7equ11111011b;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零12irq_mask_9_15equ11110111b;中断0-7时全一,中断8-15时从低至高相应位为零ioport_centequ0E800h;tpc卡中9054芯片的io地址csregdw?ipregdw?;旧中断向量保存空间irq_timesdw00h;中断计数msg1db0dh,0ah,'TPCpcicardInterrupt',0dh,0ah,'$'msg2db0dh,0ah,'Pressanykeytoexit!',0dh,0ah,'$'msg3db0dh,0ah,'PressDMCtointerrupt10timesandexit!',0dh,0ah,'$'dataendsstacksegmentstackdb100dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stack,es:datastart:;EnableLocalInterruptInput.386climovax,datamovds,axmoves,axmovax,stackmovss,axmovdx,ioport_