微机原理与汇编语言程序设计课程设计_第1页
微机原理与汇编语言程序设计课程设计_第2页
微机原理与汇编语言程序设计课程设计_第3页
微机原理与汇编语言程序设计课程设计_第4页
微机原理与汇编语言程序设计课程设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、课程设计(综合实验)的目的与要求本课程设计包含软件部分和硬件部分两个环节。软件部分:进一步熟悉汇编语言设计方法和步骤,完成在有限的课内实验环节无法涉及到的具有综合设计性的软件实验,主要内容包括:1.完善前期电话号码本设计的功能;2.显示器I/O程序设计,完成窗口控制程序;3.发声系统设计;4.键盘程序设计。硬件部分:利用伟福试验设备中的8253可编程定时/计数器,8259中断控制器,8255可编程并行接口芯片和七段数码管等设计一个电子钟电路,并编制一个程序使电子钟能正常运行。二、设计(实验)正文软件部分【实验一】:电话号码本程序完善实验要求:根据课内实验验收时指导教师提出的意见,以及和同学讨论的结果,设计实现一个功能比较完善的电话号码本,并在设计中体现自己的工作特色,即具备和其他设计不同之处。实验设计:1)已有功能:(1)电话号码本,包括人名和电话号码。(2)程序可以完成电话号码的添加、查询,号码本的排序和显示。2)增加功能:(1)电话号码中已有记录条数显示和剩余记录数显示(2)查询时出现重名情况,显示所有具有该名的人的信息(增加功能的)实现原理:1)建立一个可存放100项的电话号码表,每项包括人名(最多10个字符)和电话号码(最多11个字符)两个部分。2)设置变量Storenumber已经存入的电话信息数和变量spacenumber还可以存入的电话信息数。每当添加一个记录,storenumber+1,spacenumber-1,并且0WstorenumberW100,0WspacenumberW100。5顷白顷g皿ospacenunberdb100;还诃以存A&lC话信息数3)显示Storenumber和spacenumber时,用display子程序,用除10取余法将Storenumber和spacenumber转换成十进制数并输出

4)在已有的Storenumber条记录里,遍历每条记录的名字,只要名字完全相符,就■4)在已有的Storenumber条记录里,遍历每条记录的名字,只要名字完全相符,就■■■■MiiMriii■■*iii■diilifriii■■A:■■•lit■ilitMJ'1-^-*/it基■Hit房■aifa■atit■Wit隽antitmtat・;用除]喊紊法将二进制敖转换成H制数并输出displayprucHOUCNf3:用"除以循环状xnr,h"hMOVHl,It)LP1;XORdhtahD]Ubl顾ahr3«H;咆除法后,时中存商湖申存余数,余数转换成对应的机1】码压入栈pushanLOOPLP1H叫CX>3;将之前从低位到高位依次压入的顺序弹出,循环3次LP2:POPDKnovHlAhHOUAH.02HINT21HLOOPLP2retdMplwyendp实验实现:1)子程序:mulu子程序一一显示程序标题并介绍各指令按键与功能Number子程序一一显示已有和尚存电话条数信息③Storename子程序存入人名和电话号码Order子程序一一冒泡排序,将输入的名字和电话按名字排序Findname子程序一一查找并打印所有符合的名字及电话号码Showall子程序一一排序后,打印所有已记录的名字电话号码2)主程序:①输入指令并判断;②根据输入的指令,跳转到对应的功能区域和子程序做处理;实验结果1)初始界面:DOSBdx0.74rCpuspeed:3000cyclesFram1)初始界面:DOSBdx0.74rCpuspeed:3000cyclesFrameskipOfPro...TfeIEp11O11CBDk****IHress"H”:addanewrecord'rcss"F”:findrecordiress"S”:shnidalltherecords(press"E”:exitLstorertnumberl:090[RerrtainednumberI100ledieinputyuLirchoicie-2)添加电话记录::addamewrecord:fimdrernrd:^}iuw<t11Diei-euuids:exitmumber]:0095numhprl:100leaseiinput:addamewrecord:fimdrernrd:^}iuw<t11Diei-euuids:exitmumber]:0095numhprl:100leaseiinputyourchoice:leaseInputaleaseIinputn.miimberPleaseinputyourchoice:aJplcaseInputuna.incwitlilesstliaii10chardeters:bbbbpleaseInputatelephoiiEnumberuith11numbers:22222222[storednumberJ:002[RegainednLimberJ«G93ledseinputyuuifcchoice:3)按照姓名排序并显示所有电话记录:[storednumberJ:002[RemainednumberJ«G93Pleaseinputyourdioicc:apleaseIinputanaineuithlessthaii10characters:bhbl>pleaseInputatelephonenumberuith11nuiiiliers;33333[storednumberJ:G03[Remainednumber]«G9?Pleaseiinputyourchoice:znameTelephoneRg1111111bbbb岸匕窟岸匕bbbL33333—[storednumber]:G03[Rerrtainednumber]G97ricaaeiinputyum1choice:-——4)显示查找到的姓名为bbbb的人的电话信息:[sLuiednumber];GOO「Rennin前numtiFrl:S7Heaseinputyourclioice:fpleaseImputtlicnameyouFimding:bbbbnameTelephoneUbL22222222bbbb33333实验代码DATASSEGMEHTbaqkdb2伽(lnp(H门bookenddyufnara»db10dlup(?)storpnunberdb0spa'C'Pfiiuiiihpt*db1utiflHdtdldli0用字蝴入的蝴中区telinjmi?db11db?db11dup(?)[电话输入g巾区phonedb12dbYdb12<liiip(?)i目录信息址地末畤入槌馨录坯姓f记已L/宝信翦可记多•时电/否,使查入彝本的出存以标于Asm〕还用labledbtislhiladbtislbiFdbtishisautishiedbllneldlblimedb:提示输入信息tl^hli(iiejinnamedibinphoneflndnanesdD;提示输出倍患inforidbinFor2如^hui#dbnaperson曲nonime>dH9,»*■■»»**i+■■»»»*#■■»»#*#Telpfhone日。。k■»»**■■■»»**■■■»»**■,QdhBQah>■$11'Press"[fir":ddddnF!#rtcard'«0iHipCidl,hp■PresswlFhh::Fiiaidrecordl*\OdhT0iah3'$1■press:showallthereciros■..adin.tMiri,'$fc■press"1""::^xit呼.9。h.Oah,・$・BTQdh^Qahi,*$p1BP0dhrOah/$B■Pledge■please■please'pleaseinpulInputInputInputyourLhaiLv:Bt'$"mnanpuithIeesthan10characters:a11$atelephonenumberifith11numbers:-.thenawjfouFinding:'pq$'OiiTASENPS|'[storednunber]:8/$';-[Renainednumber]:8,*$*;NdneTelepliuiiELDdli,Odh,'4NdPsrsDnl*.OidlhRflah,4$'Sorrytlhensneisnotexistpd?的存到示示旨潮$■;代码段CODESSEGMENTft^SUMESTftllT:MIIU心.DM低MOUDSgciLLmu1IImain:MILnunhprmovdh,0111iut21hcallcrlfempdl/M'jeWDempal/a'jeWDempal,'F'jeFINDempalt1f1jeFINDempt1S1jeSHempalt15'jeSHenpalF1E1j已EXITempalF>1jeEXITjmpmainRD:瘤加新的记录LeadKtinnanenouah.@9hint2inDdllstortridnerailcrlfLeadx,inphonefwumh,四h£nrzini^llstorephuneincstorpnunberdecspacenunbermilordercallcfIFcd11crlFcallcrlfjmpiuinFIND:;根据姓名查找电话号码leadxtfLnditanesnovah,(Whint21hcallFindnamecd11trlFcd11crlfcallcrlfjmpiuinSH:;显示所有电话号码LeadKtshounouahTfl^hint21hcallsliDinallcj11crlfcallcrlfcallcrlfjfiipiuinEXIT:;退出muahviirhint21h■■n-ttin■wHu■»*!!!«■5tOFENa*子彳虽I手«mu■n-n-fl-11!■■w■■nn-h■■■«««■»«««■■:输入名字并保存到M曲电话本中gtor^iidneprfliCipusii>idixiptiSllpushsipush<Hpushb»Ilesib^ihookleaflx.ttlnanp;输入甦名muuah|Odhint21h::::搭麟gir的指针mulstorenunfiprmuu>|[IILpjmmOVEKp11::将辅A姓名存入电话本.将最后的回车换成■$•.之后的空辂傕旧,一共11个字符riDVdlfteloamefSi+Sjcmpal,jt5tup*>u[tav*diJTallinesi&diloopn^metobookstop:moual#24-hmov[bM+di]RalloopmarietQOookpoplb:xpopiiIfjiup5popBXpopdxretstarenameendip;扯*蚪村虽虽科*虽虽麟普虽*•■炷虽黑责烽艰生■村•:炭暴奈■村烽炭果村畏炭来*置扯麟詈虽*蚌普呆是蚪普虽*■村烷果村村:■;辅入电话并保存到血曲电话本中starepHoneprntpushdxpushrxpushsipushdipushbx1eb^^bnokleadxvphone:辅入电话号码mouah,Qdhint211movsi>0滞向独人的电话的篷冲区的指针muudl+23mulsto-reimmhermuuill4.^k皿dl»11;获宿电话本末地址muuex#12phonetiobioDlH:;将输入电话存入电话本,将最后的回车换成5.之后的空格依旧,一共1玲字符niDUal+phanefs].*2]empdlrMhjestopRav[bx^-di]«alihEsiIriicdiloopphanetabonkstop:mualP2^hrov[bK*di]Ralloopphonetcbookpop[诚pop>diiipup-sipopaxjjup>dlxretslurEpliofflit?etiilpXorCk^CXhduclr5tDi-eniutiiberTOC\o"1-5"\h\zcnpexjbeexitl;将storenunbEK^>\C!!■若不用排序decexFioualTstoreniJnberdecalnoubl,23mulnnvnounoUloopin:mou^ddgo:cnpJbmoucnpjzjgccjnlinue:addJinpblboohend»a^<51rodiresiFdisit23bookendfSlluopoutalfbook[di]|al^baoh[5Ljequalchangesi,23y°二吴1BJH最环环si计内外苜地址,,并存在bookend4);内循环从外循环的下一条开始:内循环退出条件.tH>okenfl<sl偿环环

-■-IFFTT%%里子初下

的<-K续

环一盘

循下环环

和SEk信息的苜字母集交换contimiE;MdlSi^23j"!1咿pushcmpu&hdipushsiF1CUCKV1Unext:incdiincsindU1dl,lliaDk[di]cnpal,bcak[Ei]jlcontinue11qcihangBlloopneKtcontimiuel:;外箍环的小内循环继绽下一条-;相等时•继渎比较下一字母F比较前压栈相应寄存器cootiwuiechanq^Ipopsipopdipupcsi.jnpcontinuechange!i|1叩sipopdipopexjnpchangechdmge:pushCMpuishdipushsihcju5*23chan:nnu!alvboDk[di]xcigJlfbaokfsi]xchgbDolk[idi±]ziincsiincdiloopchanpupsipopdipopCM;对应两条电话信息,互相交换’交换前对应寄存器压栈,交换后出栈popdipopexjnpcontinue侦"pgt:;外循壬祥畛比较下一条*di,23Implonpinp^iti:popflipopsip叩Uxpupaxpupl*xpopCKretortierendp【却序后.打印所有巳记录的名字和电话号码shouallprocpushjxpushexpushdxKU『;绐的赋值存储的电话信息条数r限制输出rwvclrstnrenijnihprempext&jenastore浒储条数为。时.提示没有信息ledbxnbnok«eKt:;每条信息,姓名11个字符,号码U个字符、共芝峪字符,为一条pushCMnullCM,23npstl:iwudljht]海条信息中,输出时,遇到$就跳过’继续输出下一^符empdlr24hjznext?mouah,02hint21hneXtW:incbxloopnFKtlcallcrlfpQpCMloopnextjnpexit2nostore:leadx^nopersonintzinexit2:pupdxpopCXpopaxretshowj1.1?ndp;It»H»Kf10JR.1^IBBHMHMHMHMBMBMBHK■■■■■-It■-«■»■■«■■「;查找并打印所有符合的名字及电话号妈pits11d*ipu&llaxipu^llexpifsllbKnuuFindedt0ledpits11d*ipu&llaxipu^llexpifsllbKnuuFindedt0leddx,词nupinnuah.Hahint21hcallcrlfleabx,fFidHUPmoudi,flnwy51,finwv脆iwBFiMnwual»telnidmeenpdl,Bdhjestopnwv[&x+ai]Balific51Mediloopin^metoFinidFindnameproc否找到该姓名;将输入的姓名存到Fnane中’将输入串的最后一个回车符变为-$,stop:nwunwvloopxormo#mouagain:pushpushmynatchinoyempJ.僮rtuy匚呷火■l,24h[bx*di]RalndmetoFindexvcx■cl^storenumberalaFnane[si]alg24hiiidtrh1AhBbnak[bx*$l]«9li924rimdtizlhbiiss:开始查找垓姓名,将牌赋值为序人的电话条数:指示电话本中匹配到的每一条的首堀11;取查找姓名的低对个字符,并比较是否是;比较此时匹配到的电话信息的姓君的第5是否是,$•i都是•*'匹百倒最后,瓯成^曜到未尾,tbfest曜到未尾,tbfest应的字奇是否相等,相等就字符,不等就看Tf电话;匹配成功,骨改标志位月ex,浦出标题和匹配倒依电诘信息;不一亲电话■信息,蛔♦网;用刊判断是否拔到电话悟息:未找到就辕出没有该姓名rwtchiil二empalTbaDl{|[bi:-i"Si]jnzneKt皿51.11Jffip»4tchempfinded.*0[hedi/p日leadK^shoufkiuBh.曲hint21h<MuF“』MB1dispe=:muic;k,芝9mudiT0>disptli:nowSlvV)Mk[bK*(ll]CRp岫】j2di^plnauah+fl*2hint21Hiuispi:ADVdi,1loopdljpoc^llcrlFnext::pap<E!Xpapbuaddbu,23luup4ydinvkjuempjnzdoLeaiIm.nonanenauah309hintUhdo:popbxpopex.p叩ax.popd宣iact||

*MHifM?M-MKiKMKMKMIfIEM>N-IEMMKiM9t»0UAll)PI""T4?ItMMKM9tW«lE9fMHltKiKSIItMMKftIEMMK9fKIfrItHIE湿示已有和尚存的电话条数信息,提示输入一谜择操作iiunbtr|irocpushHXpushdxHOUdx,offsetinforlinuudli¥09hint21hmoual,5torcnunbercalldisplay;,tistorenumber^^成十谜制数并输出Cdllcrlfmoudx»oFf5PtinFor2HOUa"9hiftt21hI1UUdljSpacenunljerrJlldisplay;^spacenunber$|换成十进制数并输出callcrlfmoudKjOFfsetlinemau8口皿int21hnoudx.offsettHld;选择进行何种操作nou皿int21I)p叩dxpopaxretnunber顷Up;卜…………bU子程序;回车并换行模块crlFproispushaxpushdxROMdlfQdhmnuahWhint21riinuudl.Odlimouint21nPopidxpop-axretcrlFend|i;it****-*****************-******dlsp子彳呈序****»***********»<*************;用除1哪条法将二避制数转挨成十进制数并输出displayprocMOUCX,3F用洲除ttbl=m,循环欲xorahHDUB1J0LP1:XDRah„ahD1Ublah,3丽;咆除法后,M中存商中存余数,余数转换成对应的皓C1I码压入核PUSHIXLOOPLP1M叫CX.3;将之前从低位到高位依次压入的顺序弹出,循环3次LP2:POPDxmoudi,dhHDUAHr0ZH1HT21HLOOPLP2retdisplay@ndpCODESEWSENDSTfiRT【实验二】:显示器I/O程序设计实验要求:要求在屏幕上开出三个窗口,它们的左上角和右下角的坐标分别是(5,10),(15,30)和(5,50),(15,70)和(18,15),(22,65),如从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。若需要将字符显示于左窗口,则先按下一键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示出左窗口的内容。如果再按下一键,输入字符就会接在先前输入的字符之后显示出来。当一行字符显示满后,窗口自动向上卷动一行,输入字符继续显示与最低一行,窗口最高一行向上卷动后消失。实验设计:1)功能设计:(1)创建三个窗口;(2)判断是否需要上卷以及实现窗口上卷(3)设置光标位置;(4)在光标处输出字符。2)流程图:2.3.实现原理:1)ROM-BIOSINT10h——显示器功能调用①Ah=02h——设置光标位置②Ah=06h——窗口上滚;宏定义队创建窗口以及滚动窗口createnacranumberTtDpleft_r,topleftcJiottomriyhtr.bottomriyhtcL保护"的做防止被修改:影响到林应的醯出pushaxnou-mouinouimovinouihduimou|intpopendmah,6al,num。"ch,topleft_rcl,topleft_cdhtbottonriqhtr01,bottonright_cbh,F4hiQhax愤列号口的左口的右下角行号旦碇若下角列号上MbI孟显示器⑰能调用③Ah=0ah——在光标处写字符I;宏定义2:在光标处输入字符并在屏幕显示writpmacro;nouan.uaniwubht0;第。侦IIMJVCXf1;逢绣写字符敬设为iint1Bh回等待的acsWS.输出M里面的宇符erdn实验实现:1)数据段①flag——一标记第一行是左窗口0还是右窗口1(默认值0)②x0,y0;窗口0当前光标位置(x0,y0)(默认值(15,10))③x1,y1;窗口1当前光标位置(x1,y1)(默认值(15,50))④x2,y3;窗口2当前光标位置(x2,y2)(默认值(25,15))2)代码段a)宏定义:guangbiao宏定义设置光标位置;write宏定义——在光标处输入字符并在屏幕显示;create宏定义一一实现创建窗口以及滚动窗口。b)主程序:初始化三个窗口及光标位置;从光标处输入字符;第一行两个窗口处理:判断此时第一行是在左窗口还是右窗口,并跳转到对应窗口的处理区域。若是在右窗口,判断字符是否为“->”,是则需改变窗口0到窗口1,不是则在光标处写字符,光标后移并判断是否需要上卷一行,需要就用create上卷,重置光标,不需要就直接进入下方窗口的输出处理区域。若是在右窗口,判断字符是否为“<-”,是则需改变窗口1到窗口0,不是则在光标处写字符,光标后移并判断是否需要上卷一行,需要就用create上卷,重置光标,不需要就直接进入下方窗口的输出处理区域。④下方窗口处理:光标设置在下方窗口,并在光标处输出字符,判断是否需要上卷,需要就用create上卷,不需要就继续输入字符。实验结果1)初始界面:光标在第一行右侧窗口。2)输入文字,输入内容显示在右上角和下方窗口,并自动上卷:3)按“<-”,则输入显示在第一行左窗口和下方窗口,并自动上卷:

4)按"->”,则输入显示在第一行右窗口和下方窗口,并自动上卷:实验代码DATASSEGMENTflagdb1;标记是左窗口0还是右窗口1;窗口0当前光标位置(x0,y0)x0db15y0db10x1db15;窗口1当前光标位置(x1,y1)y1db50x2db22;窗口2当前光标位置(x2,y2)y2db15DATASENDS.““““““““““““““““““““““““““““士赫-Hr““““““““““““““““““““““““““““““““・个个个个个个个个个个个个个个个个个个个个个个个个个个个个么T乂沃个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个

;宏定义1:设置光标位置guangbiaomacrox,ymovah,2movbh,0;光标所在页号movdh,x;光标所在行movdl,y;光标所在列int10h;BIOS调用,置光标位置endm;宏定义2:在光标处输入字符并在屏幕显示writemacro;movah,0ahmovbh,0;第0页movcx,1;连续写字符数设为1int10h;al=字符的acsii码,输出al里面的字符endmpushax;保护ax的值,防止被修改,影响到win2的输出;宏定义3:创建窗口以及滚动窗口createmacropushax;保护ax的值,防止被修改,影响到win2的输出moval,number;要滚动的行数movch,topleft_r;滚动窗口的左上角行号moval,number;要滚动的行数movch,topleft_r;滚动窗口的左上角行号movcl,topleft_c;滚动窗口的左上角列号movah,6;白底红字int10h;白底红字int10h;ROM-BIOS显示器功能调用movdh,bottomright_r;滚动窗口的右下角行号movdl,bottomright_c;滚动窗口的右下角列号movbh,74hpopaxendm・旦-rh““““““““““““““““““““““““““““.*******************************十4、干/TT乂沃个***************************CODESSEGMENTASSUMECS:CODES,DS:DATAS

START:MOVAX,DATASMOVDS,AXcreate11,5,10,15,30create11,5,10,15,30;初始化窗口与光标位置create11,5,50,15,70create5,18,15,22,65putin:guangbiao15,50;输入字符putin:movah,0int16h;BIOS调用,从键盘读字符,al=ASCII码,ah=扫描码cmpint16hcmpflag,1;判断在左窗口0还是右窗口1jzwin1_win2win0win2:;窗口0和窗口2显示时cmpah,4Dhwin0win2:;窗口0和窗口2显示时cmpah,4Dh;判断字符是否为右方向键,是否需改变窗口0到窗口jztowin1;需要就跳转到towin1guangbiaox0,y0;不需要就设置光标在win0writeincy0cmpy0,30;判断是否需要上卷一行jnanoscroll0;不需要就跳转到noscroll0writeincy0cmpy0,30;判断是否需要上卷一行jnanoscroll0;不需要就跳转到noscroll0create1,5,10,15,30;需要就利用create上卷一行,并重置光标movy0,10noscroll0:;noscroll0部分,不需要上卷,直接光标后移,跳转到在win2显示字符的部分guangbiaox0,y0jmpwin2showtowin1:;towin1部分,将光标设置为窗口1的光标,改变flag,继续输入字符guangbiaox1,y1movflag,1jmpputinnoscroll0:towin1:win1win2:;窗口1和窗口2显示时,和上部分结构相同cmpah,4Bhjztowin0guangbiaox1,y1writeincy1cmpy1,70jnanoscroll1create1,5,50,15,70movy1,50noscroll1:guangbiaox1,y1jmpwin2showtowin0:guangbiaox0,y0movflag,0jmpputinwin2show:guangbiaox2,y2writeincy2cmpy2,65jnanoscroll2create1,18,15,22,65movy2,15noscroll2:jmpputinMOVAH,4CHINT21H;判断字符是否为左方向键;noscroll1部分;towin0部分;在win2输出;窗口2光标设置;显示字符;判断win2是否上卷;不大于,不上卷,跳转到noscroll2;大于,需要上卷1行;光标回到新一行起点;noscroll2部分,继续输入字符CODESENDSENDSTART3.【实验三】:发声系统设计实验要求:要求当按下1〜8数字键时,分别发出连续的中音1〜7和高音i(对应频率依次为524Hz、588Hz、660Hz、698Hz、784Hz、880Hz、988Hz和1048Hz);当按下其他键时,暂停发声。如果时间允许,可在此基础上自行发挥,如增加按键功能、编辑歌曲等。实验设计:1)基本功能:(1)当按下1〜8数字键时,分别发出连续的中音1〜7和高音i。(2)当按下其他键(除“u”和“1”)时,暂停发声。2)增加功能:(1)当按下“u”(up)时,发出的音在当前播放的音基础上上升一个,如果超出1-8范围则暂停;(2)当按下“1”(1ow)时,发出的音在当前播放的音基础上下降一个,如果超出1-8范围则暂停;实现原理:1)发声原理:通过给计数器2设定为方式3,先低后高写入不同的计数值,实现不同频率的方波发生器,从而发出各种频率的声音。2)获得计数值:判断输入的字符,找到hz表中对应的计数值赋值给计数器,或hz表中后一位/前一位赋值给计数器。实验实现:1)数据段Hz表——存储要求的8个频率对应的计数值Hz1193180/524,1193180/588,1193180/660,1193180/698,1193180/784,1193180/880,1193180/988,1193180/1048previous——记录前一发出的音调,用于“u”和“1”的功能实现。2)程序段a)子程序:spenkon子程序扬声器开子程序。当PB0与PB1同时为高电平,扬声器才打开speakoff子程序扬声器关闭子程序。令PB1PB0=00B,其他位不变。b)主程序:通过控制字,设置计数器2工作方式为方波发生器;输入字符;判断是否是“u”或“1”,是则在前一音基础上,进行升降调;

判断是否是1-8,是则将hz表中对应数值赋值给计数器2,都不是则暂停。实验结果DUS-1)输入1-8时,发出对应的音调:DUS-DOSBox0,74Cpuspeed:30QQcydesrFrameskip0,Pro...2)输入“疽'或“l”时,进行升调和降调:DOSBox0.74Cpuspeed:3DOOcycles,Frameskip0DOSBox0.74Cpuspeed:3)按下除了1-8、“u”和“l”以外的按键,声音暂停:囹DOSBoxD.74;Cpuspeed:3000cycles,Frameskip0,Pro..,—X实验代码DATASSEGMENT;中音1〜7和高音i,对应频率依次为524Hz、588Hz、660Hz、698Hz、784Hz、880Hz、988Hz和1048Hz,ax=1193180/发音频率hzdw1193180/524,1193180/588,1193180/660,1193180/698,1193180/784,1193180/880,1193180/988,1193180/1048previousdw0DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXmoval,0b6h;通过控制字,设置定时器2工作方式,al=10110110,方式3-方波发生器,先低后高写入out43h,alagain:movah,1;输入字符int21hcmpprevious,0;判断是否有前一音,即是否在播放中jznopreviouscmpal,'u';播放中,按下'u'就可以在前一音基础上,进行升调jzincreasecmpal,'l';播放中,按下'1'就可以在前一音基础上,进行降调jzdecreasenoprevious:cmpal,'1';判断是否为数字1〜8jbnextcmpal,'8'janextsubal,31h;将1〜8变为0〜7,存于alshlax,1;因为存储为字型变量,所以要将0-7变为地址偏移时要乘以2xorah,ahmovbx,ax;bx获得偏移量movprevious,axmovax,hz[bx];取出对应的记数值out42h,al;设置定时器2的记数值moval,ahout42h,alcallspeakonjmpagain;连续发声,直到按下另一个键next:;暂停callspeakoffmovprevious,0jmpagainincrease:;在正在播放的音调基础上升调,当超过限定音调时暂停addprevious,2cmpprevious,14;与最高音比较janextmovbx,previousmovax,hz[bx]out42h,almoval,ahout42h,alcallspeakonjmpagaindecrease:;在正在播放的音调基础上降调,当低于限定音调时暂停subprevious,2cmpprevious,0;与最低音比较jbnextmovbx,previousmovax,hz[bx]out42h,almoval,ahout42h,alcallspeakonjmpagainMOVAH,4CHINT21H・二^毛旦1^由二Mr“““““““““““““““““““““““““““““““,个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个」4、干-p用乂庆个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个;子程序1:【扬声器开子程序】;GATE2接并行接口PB0,即61H的D0位,输出OUT2经与门,与门受PB1控制,只有PB0与PB1同时为高电平,扬声器才打开speakonprocpushaxinal,61h;读取61H端口的原控制信息oral,03h;al=00000011,只令D1D0=PB1PB0=11B,其他位不变out61h,alpopaxretspeakonendp;子程序2:【扬声器关闭子程序】speakoffprocpushaxinal,61handal,0fch;al=11111100,只令D1D0=PB1PB0=00B,其他位不变out61h,alpopaxretspeakoffendpCODESENDSENDSTART【实验四】:键盘程序设计实验要求:键盘程序设计,编写一个程序,每当在键盘上按下一个按键时,就显示其接通和断开扫描码。实验设计:1)保存原09h号中断处理程序地址;2)设置新的中断处理程序地址:3)设计新的中断处理new09h——获得返回的键盘扫描码并以十进制数输出;4)恢复原09H中断处理程序地址。实现原理:1)Pc机键盘面向用户的是由按键组成的矩形结构键盘阵列。键盘电路正常工作时不断地扫描键盘矩阵。有按键,则确定按键位置后以串行数据形式发送给系统板键盘接口电路。按键按下时,发送接通扫描码,简称扫描码;键松开时,则发送该键的断开扫描码。断开扫描码=接通扫描码+80H。若一直按住该键,则以每秒10次拍发速率连续发送该键的接通扫描码。2)83键的pc机标准键盘的接通码:3)微处理器响应中断,则进入键盘中断服务程序(INT09H),中断服务程序完成:读取键盘扫描码:用INTAL,60H即可;响应键盘:系统使PB7=1;允许键盘工作:系统使PB7=0;处理键盘数据;给8259A中断结束EOI命令,中断返回。实验实现:1)子程序:New09h子程序——新的09h中断处理程序。dpcrlf子程序一一使光标后输出空格的子程序;display子程序一一用除10取余法将接通码和断开码转换成十进制数并输出。2)主程序:获取09号原中断中断向量,并在栈中保存返回的中断向量es:bx;关中断;设置09号新中断向量,ds:dx=new09h段地址:new09h有效地址;设置8259A,允许IRQ1号中断,其他不变;新中断设置完成,开中断;关中断,返回8259原状态,恢复原中断,恢复完成,开中断。实验结果1)依次按下“A”、“B”、“C”,依次输出它们的接通码和断开码A:30158;B:48176;C:461742)连续按下“A”,则以每秒10次拍发速率输出它的的接通码torLXJSBok0.74,Cpuspeed:3000cycles,Frameskip0,Pro..,toroaomafcuti036auwtwooau由。tuatwooutiauwtwoeaoe坦tuatwoeuoauw03003015BG290E6QG©实验代码DATASSEGMENTflagbyte0DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXmovax,3509hes:bxint21h;获取09号原中断中断向量,并在栈中保存返回的中断向量pushespushbxcli;关中断pushds;设置09号新中断向量,ds:dx=new09h段地址:new09h有效地址movdx,segnew09hmovds,dxmovdx,offsetnew09hmovax,2509hint21hpopdsinal,21h;设置8259A,允许IRQ1号中断,其他不变pushaxandal,0fdh;11111101out21h,alsti;新中断设置完成,开中断start1:cmpflag,1;判断是否恢复jnestart1cli;关中断popax;返回8259原状态out21h,alpopdx;恢复原中断popdsmovax,2509hint21hsti;回复完成,开中断;***********************子程序1:新的09h中断处理程序*****************new09hprocsti;开中断pushax;保护寄存器pushbxinal,60h;读取键盘扫描码pushaxinal,61h;61h是8255的PB口地址,使PB7=1,响应键盘oral,80h;10000000out61h,alandal,7fh;01111111,使PB7=0,允许键盘工作out61h,alpopax;以下进行键盘数据处理cmpal,1;esc退出jenextcalldisplaycalldpcrlfjmpagainnext:pushdsMOVAX,DATASMOVDS,AXmovflag,1popdsagain:moval,20h;向中断控制器8259A发送普通中断结束命令out20h,alpopbxpopaxiretnew09hendp;*******************子程序2:dpcrlf子程序**************************;使光标后输出空格的子程序dpcrlfprocpushaxpushdxmovah,2movdl,20hint21hpopdxpopaxretdpcrlfendp;*********************子程序3:display子程序***************************;用除10取余法将二进制数转换成十进制数并输出displayprocpushcxpushaxpushbxpushdxMOVCX,3;用ax除以bl=10,循环3次xorah,ahMOVBl,10LP1:XORah,ahDIVblADDah,30H;8位除法后,al中存商,ah中存余数,余数转换成对应的ASCII码压入栈PUSHaxLOOPLP1MOVCX,3;将之前从低位到高位依次压入的顺序弹出,循环3次LP2:POPDxmovdl,dhMOVAH,02HINT21HLOOPLP2popdxpopbxpopaxpopcxretdisplayendpMOVAH,4CHINT21HCODESENDSENDSTART硬件部分【实验五】:电子钟设计实验要求:利用伟福实验系统提供的8253计数器,8259中断控制器、七段数码管、8255并行接口芯片等,设计实现一个电子钟的电路,并编制一个程序使得该电子钟能正常工作。其中,8253计数器用于产生计时脉冲(如1s、100ms等),中断服务程序用于对时、分、秒的计数更新,并存入相应的存储单元,主程序设置相应芯片的工作方式、完成时、分、秒信息的显示等。实验设计:1)功能设计:能产生一秒脉冲将一秒脉冲送到8259,计算机能根据一秒脉冲计时,相应的更改时:分:秒的值,并将其显示在LED管中;能通过实验箱上的小键盘,设定闹钟的时和分和时间的起始值的时和分;当时间的时和分和闹钟的时和分完全相同时,扬声器响起,响铃一分钟后停止。整个过程中,正常计时。实现原理:1)8259用于获得一秒脉冲,每1s调用中断服务程序更新存储的时分秒数值。2)8253计数器用于产生计时1S脉冲(如1s、100ms等),同时可以用来控制扬声器的开和关。3)6位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码输出地址位0x004h,位码输出地址为0x002h。4)6*4的小键盘,向列扫描码地址(0x002h)逐列输出低电平,然后从行地址(0x001h)读回。如果有键按下,则相应的行的值应为低,如果无键按下,由于上拉电阻的作用,行为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。实验实现:1)硬件实现:1s脉冲的产生:F=4M脉冲,通过F/64输出4M/64脉冲,将该脉冲连接到8253的count0输入口,给count0计数值62500,则count0输出4M/(64*62500)=1Hz脉冲,即一秒脉冲。闹铃的开和关:F=4M脉冲,通过F/4输出1M脉冲,将1M脉冲连接到8253的count1输入口,将count1的输出连接到扬声器。当没有闹钟的时和分和当前显示时间的时和分不同时,将count1的计数值设为00H,从而实现扬声器的关闭,当闹钟的时和分和当前显示时间的时和分相同时,将count1的计数值设为2500(其他一些值也可),从而实现扬声器的打开,闹铃响起。2)软件实现:

a)子程序:Delay子程序一一延时子程序,用于LED管的显示;DisplayLED子程序——6个八段管从左到右显示LEDBuf中存的数据;TestKey子程序——检测是否有按键按下;GetKey子程序——获得按下的键的键码;Iinit子程序——初始化8259芯片;IEnter子程序一一新的中断服务程序;8253的count0口的1s脉冲的输出连接到8259,每来一个脉冲,就进入新设置的中断服务程序,进行时分秒的更新。Nclock子程序一一闹钟,判断当前时和分是否和闹钟的时和分相等,不等就结束,相等就打开扬声器;b)主程序:初始化8253,设置新的中断处理程序地址;等待从键盘输入闹钟的时和分等待从键盘输入时间起始的时和分6个八段管显示时分秒并正常计时,同时判断是否到闹钟设定值,到了就响铃。5.5.实验接线5.5.实验接线COUNT2equ0c002hOUTBITequ08002h;位控制口实验代码CONTROLequ0c003hCOUNT0equ0c000hCOUNT2equ0c002hOUTBITequ08002h;位控制口OUTSEGequ08004h;段控制口popcxIN_KEYequ08001h;键盘读入popax口retDelayendpICW1equ00010011b;单片8259,上升沿中断,要写ICW4DisplayLEDprocnearICW2equ00100000b;中断movbx,offsetLEDBuf号为20Hmovcl,6;共6ICW4equ00000001b;工作个八段管在8086/88方式movah,00100000b;从OCW1equ11111110b;只响左边开始显示应INT0中断DLoop:CS8259Aequ0d000h;8259movdx,OUTBIT地址moval,0CS8259Bequ0d001houtdx,al;关所有八段管datasegmentmoval,[bx]CNTdb0movdx,OUTSEGLEDBufdb6dup(?);显示缓冲outdx,alHourdb0movdx,OUTBITMinutedb0moval,ahSeconddb0outdx,al;显示LEDMAP:;八段管显一位八段管示码pushaxdb3fh,06h,5bh,4fh,movah,166h,6dh,7dh,07hcallDelaydb7fh,6fh,77h,7ch,popax39h,5eh,79h,71hshrah,1KeyTable:;键码定incbx义deccldb16h,15h,14h,0ffhjnzDLoopdb13h,12h,11h,10hmovdx,OUTBITdb0dh,0ch,0bh,0ahmoval,0db0eh,03h,06h,09houtdx,al;关所db0fh,02h,05h,08h有八段管db00h,01h,04h,07hretN_MDB0DisplayLEDendpN_HDB0dataendsTestKeyprocnearmovdx,OUTBITcodesegmentmoval,0assumecs:code,ds:dataoutdx,al;输出Delayprocnear线置为0pushax;延时子程movdx,IN_KEY序inal,dx;读入pushcx键状态moval,0notalmovcx,axandal,0fh;高四loop$位不用TestKeyendp等键释放movah,10GetKeyprocnearcallDelaymovch,00100000bcallTestKeymovcl,6jneWaitReleaseKLoop:moval,blmovdx,OUTBITretmoval,ch;GetKeyendp找出键所在列notalIEnterprocnearoutdx,alpushaxshrch,1pushdxmovdx,IN_KEYincSecondinal,dxmoval,Secondnotalcmpal,60andal,0fhjneExitjneGoon_;该列movSecond,0有键入incMinutedecclmoval,MinutejnzKLoopcmpal,60movcl,0ffh;没有jneExit键按下,返回0ffhmovMinute,0jmpExit1incHourGoon_:moval,Hourdecclcmpal,24shlcl,2;键值jneExit=列X4+行movHour,0movch,4Exit:LoopC:movdx,CS8259Atestal,1moval,20hjnzExitl中断服务程序结束指令shral,1outdx,alincclpopdxdecchpopaxjnzLoopCiretExit1:IEnterendpmovdx,OUTBITmoval,0IInitprocoutdx,almovdx,CS8259Amovch,0moval,ICW1movbx,offsetKeyTableoutdx,aladdbx,cxmovdx,CS8259Bmoval,[bx];moval,ICW2取出键码outdx,almovbl,almoval,ICW4WaitRelease:outdx,almovdx,OUTBITmoval,OCW1moval,0outdx,alretoutdx,alretmovds,axIlnitendpmovHour,0movMinute,0nclockprocMOVsECOND,0;闹钟MOVN_H,0movAL,N_HMOVBL,HOURMOVN_M,0CMPBL,ALmoval,36h;00110110BJNZNOT1计数器0,16位,方式3,二进制movAL,N_Mmovdx,CONTROLMOVBL,Minuteoutdx,alCMPBL,ALmovax,62500JNZNOT1movdx,COUNT0outdx,;MOVBL,secondal;计数器低字节;addbl,10moval,ahMOVDX,outdx,CONTROL;8253al;计数器高字节MOVAL,76H;计数器1,方moval,70h;01110100B式3计数器1,16位,方式0,二进制OUTDX,ALmovdx,CONTROLoutdx,alplay:MOVDX,COUNT1calldisplayledMOVAX,00HMOVAX,2500OUTDX,ALMOVDX,COUNT1MOVAL,AHOUTOUTDX,ALDX,AL;装入计数初值cliMOVAL,AHmovax,0OUTDX,ALmovds,axmovbx,moval,70h;4*ICW2;中断号01110100B;计数器1,16位,方式0,movax,code二进制shlax,movdx,CONTROL4;x16outdx,aladdax,offsetIEnterMOVDX,COUNT1中断入口地址(段地址为0)MOVAX,00Hmov[bx],axOUTDX,ALmovax,0MOVAL,AHincbxOUTDX,ALincbxnot1:mov[bx],retax;代码段地址为0nclockendpcallIInitmovax,datastartprocnearmovds,axmovax,datasti

cmpsi,2pushaxjnzQLoop11pushbxpushcxMLoop21:pushdxmovsi,0movax,datamovdx,offsetLEDBufmovds,axmovLEDBuf,08H;显QLoop21:示一.一.一.一.callDisplayLEDmovLEDBuf+1,08H显示movLEDBuf+2,08HcallTestKeymovLEDBuf+3,08H有键入?movLEDBuf+4,08HjeQLoop21movLEDBuf+5,08H无键入,继续显示MLoopll:callGetKeymovsi,0读入键码movdx,offsetLEDBufandal,0fh显示键码QLoopll:movah,0callDisplayLED;movbx,offsetLEDMAP显示addbx,axcallTestKey;pushax有键入?moval,[bx]jeQLoop11;movLEDBuf+si+2,al无键入,继续显示popaxcallGetKey;cmpsi,0读入键码jeTen21andal,0fh;jmpOne21显示键码Ten21:movah,0movcl,10movbx,offsetLEDMAPmulcladdbx,axaddN_M,alpushaxincsimoval,[bx]cmpsi,2movLEDBuf+si,aljnzQLoop21popaxOne21:cmpsi,0addN_M,aljeTen11incsijmpOne11cmpsi,2Ten11:jnzQLoop21movcl,10popdxmulclpopcxaddN_H,alpopbxincsipopaxcmpsi,2jnzQLoop11pushaxOne11:pushbxaddN_H,alpushcxincsipushdx

movax,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论