微机原理与接口技术硬件实验报告学院:信息与通信工程学院班级:201******学生姓名:************学号:201*******201*******班内序号:****2实验一熟悉实验环境及IO的使用一、实验目的:1.通过实验了解和熟悉实验台的结构,功能及使用方法。2.通过实验掌握直接使用Debug的I、O命令来读写IO端口。3.学会Debug的使用及编写汇编程序二、实验内容:1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作,2.用汇编语言编写跑马灯程序。(使用EDIT编辑工具)实现功能A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。B.通过输出端口控制灯的工作状态(低电平灯亮)三、实验步骤:1.实验板的IO端口地址为0E8E0H在Debug下,I是读命令。(即读输入端口的状态---拨码开关的状态)O是写命令。(即向端口输出数据---通过发光管来查看)进入Debug后,读端口拨动实验台上八位拨码开关输入I端口地址回车屏幕显示xx表示从端口读出的内容,即八位开关的状态ON是0,OFF是1写端口输入O端口地址xx(xx表示要向端口输出的内容)回车查看实验台上的发光二极管状态,0是灯亮,1是灯灭。2.在Debug环境下,用a命令录入程序,用g命令运行CDebug-amovdx,端口地址3moval,输出内容outdx,almovah,0bhint21horal,aljz0100int20h-g运行查看结果,修改输出内容再运行查看结果分析movah,0bhint21horal,aljz0100int20h该段程序的作用:检测键盘有没有按键,有则返回DOS。没有继续执行3.利用EDIT工具编写汇编写跑马灯程序程序实现功能A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。B.通过输出端口控制灯的工作状态(低电平灯亮)CEDIT文件名.asm录入程序按Alt键打开菜单进行存盘或退出编译文件CMASM文件名.asm连接文件CLINK文件名.obj运行文件或用Debug进行调试。四、程序流程图4软件程序流程图:硬件连线图:开始检测拨码开关最低位=1?中间位=1?最高位=1?按照速度设定向右运动按照速度设定向左运动结束YNYNNY5五、源程序代码:DATSEGMENTNUMDB0EFHDATENDS;定义数据段STASEGMENTSTACK'STACK'DB100DUP(?)STAENDS;定义堆栈段CODSEGMENTASSUMECS:COD,DS:DAT,SS:STASTARTPROCFARPUSHDSMOVAX,0PUSHAX;使用第一种返回DOS的方式MOVAX,DATMOVDS,AXMOVDX,0E8E0H;输出端口设置LOOP0:INAL,DXMOVAH,ALTESTAL,01HJZGG;最低位为1则程序结束6TESTAL,02H;检测中间位JZLOOP0;若输入端为0则继续等待TESTAL,04H;JZRR;跑马灯向右运动ROLNUM,1;跑马灯向左运动JMPLOOP2RR:RORNUM,1;原数据循环右移,使得跑马灯向右跳转LOOP2:ANDAH,1FHMOVCL,AH;设置子程序调用的次数,间接控制延迟时间MOVCH,0;MOVAL,NUMOUTDX,ALINCCXLOOP1:CALLDELAY;调用延时子程序LOOPLOOP1JMPLOOP0;返回等待输入过程GG:RETFSTARTENDP;延时子程序DELAYPROCPUSHCXMOVCX,008FFH;外循环过程D1:PUSHCXMOVCX,004FFH;内循环过程D2:LOOPD2POPCXLOOPD1POPCXRETDELAYENDP;CODENDSENDSTART六、思考题:通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。答:在DEBUG环境下,地址都是默认以16进制显示的,所以当语句中的数据是地址时,可以不加H,如果输入的不是地址而是数据时,就要加上H以表示为十六进制数。七、实验收获和体会:7本次试验涉及到了计算机对于外部设备的控制的基本过程,我们主要学会如何在debug环境下编写I/O命令对于外部设备进行输入和输出。具体而言,利用命令点亮了LED灯,以及读取了拨码开关的状态。通过上述读写的操作,以及编写子程序等过程完成了跑马灯的实现。由于电路板的时钟信号周期很小,在完成一层循环时,形成的跑马灯无法被人眼识别捕捉,呈现出了八个LED灯都亮的状态,不符合要求。于是我们将循环延迟的子程序改成了两层,并且由于输入端的拨码开关一共有三个可以控制跑马灯的模式,其中一个控制开关,另一个控制方向(可左可右),另一个辅助控制跑马灯的速度。实际上我们在跑马灯开启状态下,读入三个拨码开关的状态并且将其转化为三位的二进制数,并且将这个二进制数作为控制延迟子程序的调用次数,从而实现了两种方向下七种速度的实现(本应该有八种,但是一种是关闭状态)。实现了功能的拓展和创新。我们通过本次实验,基本学会了汇编语言代码的编写,熟悉了DEBUG的工作环境和调试过程,并且对于计算机控制外部设备有了更客观清醒的认识,为今后汇编学习做了更充分的准备。实验二8255A并行接口应用一、实验目的:1.掌握8255A的功能及方式0、1的实现2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。3.了解七段数码管显示数字的原理。4.掌握同时显示多位数字的技术。二、实验内容:在实验一的基础上学习PIO芯片(8255)编程应用,熟悉平台的主要内容。CS用Y0(E800H)(一)简要说明:在方式0(输入/输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。8255A中A端口地址E800HB端口地址E801HC端口地址E802H控制地址E803H八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的I、O命令来做。8三、程序流程图:软件程序流程图:程序一:静态显示学号程序二:动态显示hello8255初始化开始待显示字符地址给BX点亮第一个字符熄灭依次点亮后面的字符检测键盘返回DOSYN9硬件连线图:8255初始化从端口读入数据,改变速度显示所需字符键盘是否有输入所需显示字符的地址加1或者返回最初地址程序结束,返回DOSNY10四、源程序代码:程序一:显示静态学号DATASEGMENTSHOWDB0F4H,21H,0EDH,0F1H,0D9H,0EDH;210350的ASCII码值COUNTEQU$-SHOWSLDB?DATAENDSSTACKSEGMENTSTACK'STACK'DB100HDUP(?)STACKENDSCODESEGMENT11ASSUMECS:CODE,DS:DATA,SS:STACK;延时子程序----------------------------------------------------DELAYPROCPUSHCXMOVCX,800HDELAY1:PUSHCX;外层循环MOVCX,400HDELAY2:LOOPDELAY2;内层循环POPCXLOOPDELAY1POPCXRETDELAYENDP;主程序--------------------------------------------------------START:MOVAX,DATAMOVDS,AXNEXT:MOVCX,COUNT;字母个数LEABX,SHOWMOVSL,01HAGAIN:MOVAL,80HMOVDX,0E803HOUTDX,AL;设置输出端口MOVAL,SLMOVDX,0E801HOUTDX,ALMOVAL,[BX]MOVDX,0E800HOUTDX,AL;数码管显示已经保存在数据段的数字MOVAL,00HMOVDX,0E800HOUTDX,AL;清除原有字符INCBX;增加BX数值,显示下一个数字SHLSL,1;Sl左移依次向左选通数码管LOOPAGAIN;循环此过程MOVAH,0BHINT21HORAL,ALJZNEXTOK:MOVAH,4CHINT21HCODEENDSENDSTART12程序二:动态显示HELLODATASEGMENTMESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0DATAENDSSTACKSEGMENTSTACK'STACK'DB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKMAINPROCFARMOVAX,DATAMOVDS,AXMOVES,AXMOVAL,80HMOVDX,0E803HOUTDX,ALLOP6:MOVBX,OFFSETMESGMOVCX,07HLOP5:MOVDX,0E8E0H;从端口读入数据INAL,DXINCALANDAL,07HXORAH,AHMOVDX,AX;DX值设置为外循环次数LOPZ:CALLDISP;显示子程序调用DECDXJNZLOPZ;显示当前状态直至DX=0INCBX;BX决定哪个数码管应被点亮LOOPLOP5;重新设置数码管移动速度JMPLOP6;当六种状态都结束后重新开始显示“HELLO”过程MAINENDP;显示子程序-------------------------------------------------------------DISPPROCNEARPUSHCXPUSHDXPUSHAXMOVBP,0044H;控制显示速度13LOPX:XORSI,SIMOVCX,06H;每次记录六个数码管的状态MOVDX,0E800H;从外部设备读入数据MOVAH,00000001B;每次显示一个数码管LOP2:MOVAL,MESG[BX+SI]OUTDX,ALMOVAL,AH;决定显示哪一个数码管INCDXOUTDX,AL;控制哪一个LED灯亮DECDXROLAH,1;使得下一个LED灯亮INCSICALLDELAY;调用延时子程序CALLKEY;检验按键是否有输入LOOPLOP2;循环执行LOP2直到所有六个数码管都被点亮DECBPJNZLOPX;外层循环,控制显示时间POPAXPOPDXPOPCXRETDISPENDP;返回DOS子程序---------------------------------------------KEYPROCNEAR;检测键盘输入PUSHAXMOVAH,0BHINT21HORAL,ALJZGOON;没有键盘输入则跳向GOONMOVAH,4CH;有任意输入则返回DOSINT21HGOON:POPAXRETKEYENDP;延时子程序--------------------------------------------------DELAYPROCPUSHAXPUSHCXMOVAX,0002H;外层循环LOPD:MOVCX,0HLOOP$;内层循环DECAXJNZLOPDPOPCX14POPAXRETDELAYENDPCODEENDSENDMAIN五、实验心得与体会:这次的实验里我学习了使用8255芯片进行并口接口的应用,先用了I/O命令检测出了数码管的显示规律和段选规律。在实际编写代码时,应该时刻都记住实际上数码管显示图形时,我们看到多个数码管的显示都是逐个选通。应该给数码管加入高于24*6Hz的始终使得人眼无法分清数码管是被依次点亮。在HELLO的动态显示时,这个问题更加复杂,不仅需要在每次显示时数码管被逐个点亮,还需要在每经过一个显示周期,HELLO字符都左移1位,这无法通过二进制数的左右移位实验,而需要另外编写代码。另外还需要注意就是在实验中,每次换下一个数码管显示的时候还会显示之前数码管已经显示的字符,需要将原来的显示清零,才能呈现出所需的左右移动的变化过程。本次过程经过多次调试,另外还经历了电脑死机、板子