211122班+李济汉+10210737+21号+微机原理硬件实验报告Word文档下载推荐.docx
《211122班+李济汉+10210737+21号+微机原理硬件实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《211122班+李济汉+10210737+21号+微机原理硬件实验报告Word文档下载推荐.docx(52页珍藏版)》请在冰豆网上搜索。
2、编程从键盘输入一个字符或数字,将其ASC码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。
3、按硬件连接图2简单并行输入接口电路图连接电路(74LS244插通用插座,74LS32用实验台上的“或门”)。
74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关输出K0K7,8个数据输出端分别接数据总线D0D7。
4、用逻辑电平开关预置某个字母的ASC码,编程输入这个ASC码,并将其对应字母在屏幕上显示出来。
5、接线:
输出:
按硬件连接图2接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门);
输入:
按硬件连接图2接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门)。
三、硬件接线图与软件流程图硬件接线图1:
硬件接线图2:
软件流程图1(实验一):
软件流程图2(实验二):
四、实验代码实验一:
datasegmentY4dw02a0h;
定义分配的IO地址端口Y5dw02a8hdataendsstksegmentstackstackdb100hdup(?
)stkendscodesegmentassumecs:
code,ds:
data,ss:
stkstart:
pushdsxorax,axpushaxmovax,datamovds,axmovcx,0100Hagain1:
movdx,Y4inal,dx;
将Y4值赋给AL,输出一个负脉冲,使灯亮loopagain1movcx,0100Hdelay1:
nop;
实现软件延时loopdelay1movcx,0100Hagain2:
movdx,Y5inal,dx;
将Y5值赋给AL,输出低电平,使灯灭loopagain2movcx,0100Hdelay2:
noploopdelay2jmpstart;
重复执行movah,4cHint21Hcodeendsendstart实验二:
datasegmenty5dw02a8H;
定义分配的IO地址端口dataendsstksegmentstackstackdb100hdup(?
pushdsxorax,axpushaxmovax,data;
初始化数据段movds,axmovah,01H;
输入int21Hcmpal,1BH;
与ESC的ASCII码值进行比较,若相等则退出jzexitmovdx,y5outdx,al;
输出ASCII码值对应的信号,使得相应灯点亮jmpstartexit:
xorax,ax;
退出时清零,使所有灯灭movdx,y5outdx,almovah,4cH;
返回DOSint21Hcodeendsendstart五、实验结果实验一中,LED7灯按照指定软件延时不断闪烁。
实验二中,LED0-LED6分别表示输入键值的1-7位,若该位为1,则灯亮,否则灯灭,灯亮的情况反映了输入键的ASCII码的值。
六、问题分析在本次实验中,我遇到了如下问题:
对于实验一,在调试过程中一开始我的灯只闪了一次,并没有循环闪烁下去,我检查了代码,确实无误,于是我分析原因在于:
程序只运行了一次就返回了,程序结尾没有加入跳转指令。
后来我加入了jmpstart,并使用了汇编软件的重构运行。
这样只要我不按ESC键,程序就会一直循环运行下去。
最终我的灯依照汇编程序的逻辑不断闪烁下去,成功达到了实验目的。
对于实验二,我一开始并不知道如何将ASCII码值转化为灯亮的情况,以为需要将ASCII码先转化为二进制数再进行输出。
后来我突然反应过来,实验的目的就是输出ASCII码值,而不是二进制数,并且寄存器AL中存入的直接就是ASCII码值,因此可以直接输出AL中的值。
最后我加入了一个新功能:
在退出时令AL赋为全0,并进行输出,这样每次退出灯就会全灭,效果很好。
七、实验总结与心得体会通过本次实验,我对I/O地址译码电路与并行接口的工作原理有了更深一步的认识,并对汇编语言的编程有了更深入的理解。
这是我第一次接触PCI设备,我依照老师的指导要求,认真连接电路,并检查无误。
在实验一的调试过程中一开始我的灯只闪了一次,并没有循环闪烁下去,我检查了代码,确实无误,于是我分析程序只运行了一次就停止了,没有跳回,后来我终于找到了解决方法:
利用汇编软件的重构运行。
在实验二中,我也非常认真地进行了设计,并加入了自己的创新功能:
退出清零。
这次实验不仅加深了我对课本理论知识的理解,更让我在实践中意识到微机原理的硬件实验是需要一定的操作能力与耐心的,它既锻炼了我的软件编程能力,更锻炼了我的动手实践能力。
实验三:
可编程并行接口8255实验四:
七段数码管实验五:
键盘显示控制实验一、实验目的1、通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。
2、掌握数码管显示数字的原理。
3、掌握8255控制键盘及显示电路的基本功能及编程方法。
4、掌握一般键盘和显示电路的工作原理。
二、实验内容及原理实验三:
一片8255内部有3个端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以工作在方式0。
方式0是基本型输入/输出。
这种方式和外设交换数据时,8255端口与外设之间不使用联络线。
方式1为选通型输入/输出。
用这种方式和外界交换数据时,端口和外设之间要有联络信号。
方式2是双向数据传送,仅A口有这项功能。
当A口工作在方式2时,B口仍可以工作在方式0或方式1,但此时B口方式1只能用查询方式与CPU交换信息。
8255工作方式选择字共8位(如图),存放在8255控制寄存器中。
最高位D7为标志位,D7=1表示控制寄存器中存放的是工作方式选择字,D7=0表示控制寄存器中存放的是C口置位/复位控制字。
8255的C口可进行位操作,即:
可对8255C口的每一位进行置位或清零操作,该操作是通过设置C口置/复位字实现的(图8-10)。
C口置/复位字共8位,各位含义如下:
8255有两个命令字,即方式选择控制字和C口置0/置1控制字,初始化编程的步骤是:
向8255控制寄存器写入“方式选择控制字”,从而预置端口的工作方式。
当端口预置为方式1或方式2时,再向控制寄存器写入“C口置0/置1控制字”。
这一操作的主要目的是使相应端口的中断允许触发器置0,从而禁止中断,或者使相应端口的中断允许触发器置1,从而允许端口提出中断请求。
注意:
“C口置0/置1控制字”虽然是对C口进行操作,但是该控制字是命令字,所以要写入控制寄存器,而不是写入C口控制寄存器。
向8255数据寄存器写入“数据”或从8255数据寄存器读出“数据”。
实验电路如硬件连接图所示,8255C口接逻辑电平开关K0K7,A口接LED显示电路L0L7。
编程从8255C口输入数据,再从A口输出。
PC7PC0/8255接K7K0/逻辑电平开关PA7PA0/8255接L7L0/LED显示CS/8255接Y1/IO地址8255控制寄存器端口地址-28BH,A口的地址-288H,B口的地址-289H,C口的地址-28AH。
实验四:
1、静态显示:
按4-4-1连接好电路,将8255的A口PA0PA7分别与七段数码管的段码驱动输入端adp相连,位码驱动输入端S0、S1、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示自己的学号的后四位(0737),或编程在数码管上循环显示“00-99”,位码驱动输入端S0、S1接PC0、PC1;
S2、S3接地。
2、实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
七段数码管的字型代码表如下表:
显示字形gefdcba段码001111113FH1000011006H21010115BH310011114FH4110011066H511011016DH611111017DH7000011107H811111117FH911011116FH3、接线:
PA7PA0/8255接dpa/LED数码管PC3PC0/8255接S3S0/LED数码管CS/8255接Y1/IO地址实验五:
编程要求:
使得在小键盘上每按一个健,4位数码管上显示出相应字符,它们的对应关系如下:
小键盘显示小键盘显示00CC11Dd22EE33FF445566778899ABb设置8255c口键盘输入、a口为数码管段码输出。
1、识别闭合键的方法行扫描法是使键盘某一行线为低电平,其余为高电平,然后读取列值,如列值中有某位为低电平,则表明行列交叉点处的键被按下;
否则扫描下行,知道扫完全部的行线为止。
行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线接另一个并行口,先让它工作在输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线的值,如此时某键按下则必使某一列线值为0,然后程序再对两个并行端口的工作方式进行设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么在闭合键所在的行线上的值必定为0。
这样,有按键时,可读得唯一的行值和列值。
2、设计时,行、列值应放在一个表中,通过查表确定按下的是哪个键。
3、键闭合时,注意加延时防抖动。
4、键松开时,加判断释放程序。
5、按下键盘某键能够返回系统。
PC7PC0/8255接行3列0/4X4键盘PA7PA0/8255接dpa/LED数码管CS/8255接Y1/IO地址PB3PCB/8255接S3S0/LED数码管(或哪位数码管要显示则位选S接+5V即高电平,不想显示的数码管S接GND即低电平)三、硬件接线图与软件流程图硬件接线图1:
软件流程图1(实验三):
软件流程图2(实验四):
软件流程图3(实验五):
四、实验代码实验三:
DATASEGMENTPORTKDW28BH;
控制寄存器端口地址PORTADW288H;
A端口地址PORTCDW28AH;
C端口地址DATAENDSSTACKSEGMENTSTACKSTACKDB100DUP(?
)STACKENDSCODESEGMENTASSUMECS:
CODE,DS:
DATA,SS:
STACKSTART:
MOVAX,DATAMOVDS,AXMOVDX,PORTK;
8255初始化MOVAL,89H;
工作于方式0OUTDX,ALLOOP1:
MOVDX,PORTC;
设置输入C端口INAL,DXMOVDX,PORTA;
设置输出A端口OUTDX,ALJMPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART实验四(静态显示学号):
DATASEGMENTPORTKDW28BH;
C端口地址LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDATAENDSSTACKSEGMENTSTACKSTACKDB100HDUP(?
MOVAX,DATAMOVDS,AXMOVDX,PORTK;
置8255为A口方式0输出MOVAL,80HOUTDX,ALNEXT:
MOVAL,LED+7MOVDX,PORTAOUTDX,ALMOVDX,PORTCMOVAL,01H;
显示第一个字符7OUTDX,ALMOVDX,PORTC;
熄灭数码管MOVAL,0OUTDX,ALMOVAL,LED+3MOVDX,PORTAOUTDX,ALMOVAL,02H;
显示第二个字符3MOVDX,PORTCOUTDX,ALMOVDX,PORTC;
熄灭数码管MOVAL,0OUTDX,ALMOVAL,LED+7MOVDX,PORTAOUTDX,ALMOVAL,04H;
显示第三个字符7MOVDX,PORTCOUTDX,ALMOVDX,PORTC;
熄灭数码管MOVAL,0OUTDX,ALMOVAL,LEDMOVDX,PORTAOUTDX,ALMOVAL,08H;
显示第四个字符0MOVDX,PORTCOUTDX,ALMOVDX,PORTC;
熄灭数码管MOVAL,0OUTDX,ALJMPNEXTMOVAH,4CH;
返回DOSINT21HCODEENDSENDSTART实验四(00-99计数):
STACKADDONEPROCNEARADDBL,1;
BL为个位数CMPBL,10JZCARRYRETCARRY:
MOVBL,0;
若加到10,则产生进位,十位数加1ADDBH,1RETADDONEENDPSTART:
置8255为A口方式0输出MOVAL,80HOUTDX,ALXORBX,BX;
将BX作为00-99计数器MOVBL,0MOVBH,0MOVDI,OFFSETLED;
记录数码管的显示数组NEXT:
MOVCX,00FFH;
在一段时间内显示同一个数,直到计数器加一LOOP1:
PUSHBXXORBH,BH;
清除十位数MOVAL,DI+BX;
先显示个位数字MOVDX,PORTAOUTDX,ALPOPBXMOVAL,01H;
位码最后一位显示个位MOVDX,PORTCOUTDX,ALMOVAL,00H;
灭零信号MOVDX,PORTCOUTDX,ALPUSHBXMOVBL,BH;
将十位数放入个位数,并清除高位XORBH,BHMOVAL,DI+BX;
再显示十位数字MOVDX,PORTAOUTDX,ALPOPBXMOVAL,02H;
位码倒数第二位显示十位MOVDX,PORTCOUTDX,ALMOVAL,00H;
灭零信号MOVDX,PORTCOUTDX,ALLOOPLOOP1CALLADDONE;
进行计数加一操作JMPNEXTMOVAH,4CH;
返回DOSINT21HCODEENDSENDSTART实验五:
DATASEGMENTPORTADW288H;
8255端口,a口段码PORTBDW289H;
8255端口,b口位码PORTCDW28AH;
8255端口,c口键盘PORTKDW28BH;
8255端口,控制口LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;
数码管显示ARRAYDB00H,070H,0B0H,0D0H,0E0H;
比较数组,高四位其中一位为0DATAENDSSTACKSEGMENTSTACKSTACKDB100DUP(?
STACKKEYCHECKPROCNEAR;
检测按键子程序PUSHAXPUSHCXPUSHDXMOVCX,01HINSULT:
MOVDX,PORTCMOVBX,OFFSETARRAY;
取出用于比较的数组中的某一项,ADDBX,CX;
用于检测高四位,高四位为按行检测,进行比较判断哪一行被按下MOVAL,BXOUTDX,AL;
C口高位为输出,只从低位输入,通过输出来遍历高位INAL,DX;
检测是否有按键MOVAH,ALCALLDELAY;
延时INAL,DXCMPAL,AH;
延时后看是否键仍旧是按下状态JNZINSULT;
若不是,则视为抖动,应重新检测ANDAL,0FH;
只检测低四位,低四位为按列检测CMPAL,0FHJZCATS;
若为0FH,则该行没有按键按下CMPAL,0EHJZCATS1;
若为0EH,则该行第四列被按下CMPAL,0DHJZCATS2;
若为0DH,则该行第三列被按下CMPAL,0BHJZCATS3;
若为0BH,则该行第二列被按下CMPAL,07HJZCATS4;
若为07H,则该行第一列被按下JMPBUTVALCATS:
INCCX;
行数递增,只检测四次,因为仅有四行CMPCX,05HJNZJUMP;
若没检测完每一行,则继续检测MOVCX,01H;
若检测完四行,则重新检测JUMP:
JMPINSULTCATS1:
MOVBX,04H;
若第四列有键被按下,则记录列值JMPBUTVALCATS2:
MOVBX,03H;
若第三列有键被按下,则记录列值JMPBUTVALCATS3:
MOVBX,02H;
若第二列有键被按下,则记录列值jmpBUTVALCATS4:
MOVBX,01H;
若第一列有键被按下,则记录列值BUTVAL:
SUBCX,01H;
CX记录的是行值,由于行下标从零开始,因此要减一MOVAL,CL;
行值4列值即为被按键的位置MOVDL,04HMULDLADDBL,ALSUBBL,01H;
此时BX记录的是被按键的位置,由于列下标从零开始,因此要减一POPDXPOPCXPOPAXRETKEYCHECKENDPDELAYPROCNEAR;
延时子程序PUSHCXMOVCX,100HWAIT1:
LOOPWAIT1POPCXRETDELAYENDPDISPLAYPROCNEAR;
数码管显示子程序MOVAX,BXMOVBX,OFFSETLEDADDBX,AX;
查表找到按键对应的数码管的值MOVAL,BXMOVDX,PORTAOUTDX,AL;
输出RETDISPLAYENDPSTART:
设置控制字寄存器MOVAL,81HOUTDX,ALMOVDX,PORTB;
位码只在最后一位有效MOVAL,01HOUTDX,ALGOON:
CALLKEYCHECKCALLDISPLAYMOVDX,PORTCINAL,DXMOVAH,ALTREM:
CALLDELAYINAL,DXCMPAL,AH;
防抖,通过延时检测按键是否真从按下变为松开状态JZTREM;
若两次都处于按键状态,说明没有松开按键JMPGOONMOVAX,4C00HINT21HCODEENDSENDSTART五、实验结果实验三中,当开关0-7中某一位或某些位有效时,LED灯0-7中的相应位置灯亮。
实验四中,第一个小实验的四位数码管静态显示出我的学号后四位,第二个小实验的后两位数码管显示一个两位数,并每隔一定时间,该两位数加一。
实验五中,当在小键盘上按键时,数码管会显示按下的键是0-9、A-F中相应的哪一个。
在静态显示学号时,我遇到了一个十分棘手的问题,一开始数码管的四位全显示的是相同的符号,但并不是数字,但即使经过单步调试,我也并没有发现程序上的错误,于是我又检查了一遍硬件的连线,终于发现原来是段码和位码的线接反了,我错误地将C端口接在了段码上,于是我重新连了一遍线,数码管终于能够正常显示我的学号了。
在数码管显示两位数计数时,我曾一度出现数码管飞快计数的情况,不论我在中间加入多少延时子程序,速率改变的效果都不显著,分