您好,欢迎访问三七文档
信息与通信工程学院微原硬件实验报告姓名:班级:20122111262014.12.21实验一熟悉实验环境及IO的使用一,实验目的1.通过实验了解和熟悉实验台的结构,功能及使用方法。2.通过实验掌握直接使用Debug的I、O命令来读写IO端口。3.学会Debug的使用及编写汇编程序二,实验内容1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作,2.用汇编语言编写跑马灯程序。(使用EDIT编辑工具)实现功能A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。B.通过输出端口控制灯的工作状态(低电平灯亮)三,实验步骤1.实验板的IO端口地址为EEE0H在Debug下,I是读命令。(即读输入端口的状态---拨码开关的状态)O是写命令。(即向端口输出数据---通过发光管来查看)进入Debug后,读端口拨动实验台上八位拨码开关输入I端口地址回车屏幕显示xx表示从端口读出的内容,即八位开关的状态ON是0,OFF是1写端口输入O端口地址xx(xx表示要向端口输出的内容)回车查看实验台上的发光二极管状态,0是灯亮,1是灯灭。2.在Debug环境下,用a命令录入程序,用g命令运行CDebug-amovdx,端口地址moval,输出内容outdx,almovah,0bhint21horal,aljz0100int20h-g运行查看结果,修改输出内容再运行查看结果分析movah,0bhint21horal,aljz0100int20h该段程序的作用:检测键盘有没有按键,有则返回DOS。没有继续执行3.利用EDIT工具编写汇编写跑马灯程序程序实现功能A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。B.通过输出端口控制灯的工作状态(低电平灯亮)CEDIT文件名.asm录入程序按Alt键打开菜单进行存盘或退出编译文件CMASM文件名.asm连接文件CLINK文件名.obj运行文件或用Debug进行调试。四,程序流程图硬件连线图:开始D7=0?D6=0?左移右移CX赋值亮LED调用延时结束START8253初始化8255A初始化设置数码管选通信号按照乐谱,调用音阶发声子程序数码管显示目前音阶调用延时子程序有键盘动作?返回DOSYESNO五,源程序代码datasegmentleddb0cfhdataendsstacksegment'stack'stackdb100dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackstartprocfarpushdsxorax,axpushaxmovax,datamovds,axmovdx,0eee0hloop0:inal,dxmovah,alandal,80hxoral,80hjzloop4moval,ahandal,40hxoral,40hjzloop2movah,alandal,20hxoral,20hjzstoprolled,1jmploop3loop2:rorled,1loop3:andah,3fhmovcl,ahmovch,0moval,ledoutdx,alinccxloop1:calldelaylooploop1jmploop0loop4:retfstop:movled,0ffhmoval,ledoutdx,aljmploop0startendpdelayprocpushcxmovcx,1500hdelay1:pushcxmovcx,800hdelay2:loopdelay2popcxloopdelay1popcxretdelayendpcodeendsendstart六,思考题通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。答:在DEBUG环境下,地址都是默认以16进制显示的,所以当语句中的数据是地址时,可以不加H,如果输入的不是地址而是数据时,就要加上H以表示为十六进制数七,实验收获和体会在这次试验中,我主要学会使用debug环境下的I/O命令,利用该命令点亮了LED灯,并且读取了拨码开关的状态,并知道了如何利用键盘检测返回DOS,在跑马灯实验中,我学会了写延时子程序,在一开始只用了一层循环,导致速度过快而无法观察到跑马灯的效果,在同学的帮助下我编写了二层循环才达到了应有的效果。同时,自己也整体的练习了汇编语言程序的编写,包括段声明,子程序编写等等。除了软件部分,也学习了实验板上的电路连接,初步了解了CPU是如何通过总线读写数据和地址的,为以后的学习奠定了基础。实验二8255A并行接口应用一、实验目的1.掌握8255A的功能及方式0、1的实现2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。3.了解七段数码管显示数字的原理。4.掌握同时显示多位数字的技术。二、实验要求在实验一的基础上学习PIO芯片(8255)编程应用,熟悉平台的主要内容。CS用Y0(EE00H)1.查找八段数码管的显示的显示规律及位选规律在方式0(输入/输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。8255A中A端口地址EE00HB端口地址EE01HC端口地址EE02H控制地址EE03H八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的I、O命令来做。2.6位数码管静态显示学号在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回DOS。3.6位数码管动态显示HELLO要求在数码管电路1-6位数码管上按图3.2所示的规律,动态显示字符串HELLO,当主机键盘按下任意键时结束。三、实验原理1.八段数码管的显示的显示规律及位选规律经实验发现8255A的数码管的显示规律如下图所示:由此很容易得到数字0~9及字母A~F的编码:2.6位数码管静态显示学号该电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6个数码管都有可能显示出相同的数字。如果要使6个数码管“同时”显示不同的数字,必须采用扫描显示的方法,通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在一秒钟内,每一位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。3.6位数码管动态显示HELLO1.本实验应在上面实验的基础上完成2.在数据段,按下列规律设置12个字型码:MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0POINTDWMESG……POINT单元存放MESG单元的有效地址,程序取出POINT单元的内容→BX,然后用BX间址取数送数码管电路,扫描显示6个字符。每过0.5s将POINT单元的内容加1,再将POINT单元的内容→BX,……。POINT单元内容加1,使字符串显示的首地址向高地址移动一个单元,从而使6位字符串向“左”移动一位,实现动态显示。4.动态显示的速度可控制(快或慢),利用实验一读入端口的5.动态显示的示意图如下:四、程序框图1.6位数码管静态显示学号开始初始化8255A,计数N=0显示第N位数N=0是否有键盘键按下N=N+1N6开始否否是是2.6位数码管动态显示HELLO8255初始化point偏移地址送BX,SI最右边数码管显示[BX]的字符左边一个数码管显示[BX+1]的字符左边一个数码管显示[BX+2]的字符左边一个数码管显示[BX+3]的字符左边一个数码管显示[BX+4]的字符左边一个数码管显示[BX+5]的字符计数器CX=255否一共255次?是延时检测是否有按键?结束是否BX值是否和SI相等?BX=BX+1是否五、程序清单1.6位数码管静态显示学号DATASEGMENTNUM1DB0F4H,21H,21H,61H,0F4H,0FDH;211728NUM2DB0F4H,21H,0EDH,61H,21H,0DDH;211716;将两个学号都存在数据段,供显示选择DATAENDSSTACKSEGMENTSTACK'STACK';堆栈段DB100DUP(?)STACKENDSCODESEGMENT;代码段ASSUMESS:STACK,DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX;初始化段基址;----------------------------------MOVDX,0EE03H;给8255A写入控制字MOVAL,80H;A口与B口输出模式OUTDX,AL;----------------------------------LOP:MOVAH,0BH;判断是否有键盘输入INT21HORAL,ALJZLOP1MOVDX,0EE01HMOVAL,00H;若有,则先把显示清零OUTDX,ALMOVAH,4CH;再中止程序INT21HLOP1:XORSI,SI;SI存放学号段码偏移量MOVCX,06H;CX存放扫描次数MOVDX,0EEE0H;判断拨码开关最低位是否为高电平INAL,DXMOVBH,ALMOVAL,01H;AL存放位选信号SHRBH,1JCNUM;若拨码开关为高电平则输出学号一MOVSI,OFFSETNUM1JMPLOP2NUM:MOVSI,OFFSETNUM2;否则输出学号二;开始循环LOP2:MOVDX,0EE01H;向A口输出位选信号OUTDX,ALDECDX;切换为B口PUSHAXMOVAL,[SI];输出对应学号的段选信号OUTDX,ALPOPAXINCDX;切换回A口INCSI;切换为学号的下一位,共6位ROLAL,1;循环扫描位选信号CALLDELAY;扫描延时,一个周期大约1msLOOPLOP2;循环扫描6次JMPLOP;回到开头,进行下一次扫描;----------------------------------DELAYPROCNEAR;延时程序,通过执行指令消耗时间,形成延时PUSHBXPUSHCXMOVBX,0003H;外层循环,LOP3:MOVCX,0FFFFH;内层循环LOP4:LOOPLOP4DECBXJNZLOP3POPCXPOPBX;循环3*16^4次,周期大约为1msRETDELAYENDPCODEENDSENDSTART2.6位数码管动态显示HELLODATASEGMENTHELLODB3DH,0DCH,8CH,8CH,0EDH,0;循环显示的段码TEMPDW0010HPOINTDWHELLO;循环显示指针DATAENDSSTACKSEGMENTSTACK'STACK';堆栈段DB100DUP(?)STACKENDSCODESEGMENT;代码段ASSUMESS:STACK,DS:DATA,CS:CODESTART:MOVAX,SEGDATAMOVDS,AXMOVAX,SEGSTACKMOVSS,AX;初始化段基址MOVDX,0EE03H;初始化控制字MOVAL,80HOUTDX,ALLOP:MOVBX,TEMP;外层循环变量,循环TEMP次,大约每0.5S滚动一次INCPOINT;每结束一次内层循环,将指针值加一CMPPOINT,OFFSETHELLO+06H;若滚动完6次,将“HELLO”和一个空格显示一遍,再从头开始滚动JNZLOP1SUBPOINT,07HLOP1:DECBX;内层循环JZLOP;每次循环BX减一,判断BX是否为0XORSI,SIMOVCX,06H;更内层循环,扫描6次数码管MOVDX,0EEE0H;滚动速度选择INAL,DXTESTAL,01H;若拨码开关拨下来JNZLOPPMOVTEMP,0054H;滚动速度变慢JMPAALOPP:MOVTEMP,0010H;否则变快,TEMP的值决定了延时时间,从而控制速度AA:MOVSI,POINT;将目前的指针值赋给偏移寄
本文标题:北邮微原硬件实验
链接地址:https://www.777doc.com/doc-2582781 .html