版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..秒表程序设计摘要:本课程设计旨在设计一个秒表计时并储存计时的程序,可控制秒表的计时开始及结束,实现秒表的准确计时,存储计时数据,翻阅计时数据,清除计时数据等功能。本程序是基于8086微机系统设计,在MasmforWindows软件下采用汇编语言编写,通过选择8253定时器0,工作方式3,输出周期为10ms的方波,产生稳定延时,调用各种中断完成程序各逻辑模块设计,通过键盘扫描得到输入的值,执行对应功能。每10ms计时一次,每60秒一次循环,存储数据设定为最多20组,可随时存入数据,操作自由度极高,经测试,60秒计时误差不超过1.2%,可实现准确计时及存储功能。关键字:秒表、显示计时、存储计时、汇编设计任务分析与方案选择本设计需实现秒表稳定计时,并显示,需要存储计时数据时可立即将当前计时数据存入缓冲区,暂停计时时立即结束并可复位或者继续计数或者查看存储数据,在查看数据时可前后翻阅存储数据,并可清除,当退出查看数据后可使秒表继续计数或复位。方案选择系统硬件设计选择本设计采用8253定时器0,工作方式3获得周期为10ms的稳定计时单位,使用8086CPU进行译码,当定时到1s的时候产生一个中断信号,在中断服务程序进行秒的计数,并送入相应的存储单元,8259芯片提供中断,并用8255的A口接七段数码管的段选信号,B口接七段数码管的位选信号。系统软件设计选择在代码实现上,对于按键的输入上可以直接读取或是先扫描键盘再读取,本设计只存在各逻辑功能之间的转换,因此选择先扫描键盘再读取的方法,可提高代码的容错率及可操作性;使用宏定义及光标定位的方法,并配合各种中断设计界面图形及字体颜色,宏定义可以减少代码的重复度,且便于修改功能,可任意调用,通过定位光标可确定输出位置,可实现同一位置的动态输出;对于时间的扫描,可以选择直接读取系统当前的时间或是读取系统时钟的计时单位,前者的读取直接是BCD码非常便于输出显示,后者需要不停的读取计时单位读取次数非常多,而且结果不是BCD码,需要做判断转换输出,此设计采用读取系统时钟的计时单位,虽然需要不停的读取计时单位读取次数非常多,而且结果不是BCD码,需要做判断转换输出,但是经过与实际情况比较,后者的计时更为准确,区分度更大。2详细设计2.1理论分析与计算此设计需要实现单位为1秒的秒表稳定计时,8253定时器0工作方式3,外部提供一个时钟作为CLK信号,频率f=1.1931816MHz,为得到周期为10ms的方波,应对8253定时器设置计数初值为1.1932×10×10^-3=11932。因此,8259A每隔10ms向CPU申请一次中断。可用10作为基本计时单位,此设计的毫秒每一个计时单位改变一次,要达到1秒的计时,需要的计时单位为:1000ms/10=100,则计数满足100个计时单位时,即毫秒计时到100时,秒位加1,完成1秒稳定计时。2.2算法设计本设计的算法包括键盘检测及读取、秒表计时及输出,数据存储、数据操作、界面及提示词设计。2.2.1键盘检测及读取使用21H中断的0BH中断检测是否有键盘按下,如果没有键盘按下则继续检测,如果有键盘按下使用21H中断的08H中断判断是否为所设定的值,如果不是,继续检测输入,如果是便按逻辑进行。2.2.2秒表计时及输出使用8253定时器0,工作方式3获得的周期为,10ms的方波作为计时单位,调用1CH中断,读取1CH原中断向量,并设置中断向量,取计时处理程序偏移地址及段地址,计时处理程序中毫秒加一直到100ms,秒位便加一,毫秒清零,继续计时。定位光标,在光标位置输出计时,显示格式为00:00:00,计时显示采用高位低位分开显示,将计时数值除以10,得到商和余数,商作为高位,余数作为低位,当计时单位满1后,毫秒位加1毫秒,毫秒计时到100,秒位加1并动态显示。2.2.3数据存储在数据段中定义一个大小为40字的全为0的缓冲区用于存储计时数值,在代码段中合适位置取缓冲区的偏移地址给寄存器,存储方式采用高位低位分开存储的方式,将秒数值除以10,商存前一个字节,余数存后一个字节,存完高位后寄存器指向下一个字节存低位,低位存完之后寄存器再指向下一字节,用于存储毫秒计时的高位。2.2.4数据操作定义光标,取缓冲区的偏移地址给寄存器,在合适位置从第一次存储的数据开始显示,此时寄存器指向第一个字节,调用21H的0BH检测键盘输入,如有键盘输入,调用21H的08H检测键入值,当接收操作为查看下一个存储数据时,寄存器加2,指向下一组数据的高位,并调用21H的09H中断显示当前数值,寄存器加一,调用21H的09H中断显示当前所指数据;当接收操作为查看上一个存储数据时,寄存器减二,指向上一组数据的高位,并调用21H的09H中断显示当前数值,寄存器加一,调用21H的09H中断显示当前所指数据;当接收操作为清除当前数据时,将0存入当前寄存器所指字节及下一字节,并调用21H的09H中断显示当前数值:00:00;当接收操作为返回计时时,判断键入,跳转到相应操作。2.2.5界面及提示词设计在数据段定义提示语句字符串,使用10H的02H中断定位光标,在代码段中相应位置取代码段的偏移地址,使用21H的09H中断显示字符串,使用宏定义,拥有两个参数,一个是光标位置,所在行数和列数,调用10H的02H中断置光标,调用21H的09H显示字符,可实现在任意位置显示任意字符,用此宏定义绘制计时区及记忆区图形,搭配10H的06H中断可在任一区域进行显示,为使各区域鲜明区分,改变10H的06H中断中出口参数BH的值,设置各字符串为不同颜色,实现彩色输出,增强观赏性。2.3硬件电路设计11.193MHZ图1,硬件电路设计在整个电子钟的设计中。我们使用8253用于定时功能,由于8259的中断只能是电平与电缘触发,所以我们选择电缘触发。由于我们选择一次写入计数初值后的能循环进行,所以我们选择工作方式0在每次的计数初值的N-1是产生一个脉冲。在CLK0引脚接入1.1932MHZ的时钟周期,而将计数初值写为11932,继而在OUT0会在每1ms产生脉冲,在控制字的时候采用二进制计数,所以其控制字为00110110B,所以8253能产生准确的计时功能。8255A芯片,将8255A的A,B口均工作在工作方式0的下,且为输出控制LED的位选与片选,而C口用于修改时间用,同样工作于方式0低四位输出。所以其控制字为81H。8259A芯片用于产生中断信号去自动修改秒针。所以只需将8259的IR0产生中断,其他未屏蔽,单片8259,上升沿中断,要写ICW4,中断号为20H,工作在8086方式。2.4软件设计在软件实现上,对于按键的输入上采用DOS系统功能,通过功能号0BH对应功能扫描键盘判断是否有按键被按下,如果有则通过功能号08H对应功能读取键盘缓冲区得到按键输入信息。1S定时采用8253定时器0,工作方式3获得10ms稳定计时单位,设置1CH中断向量,程序进行时,不断读取1CH中断服务程序是否计数到1个计时单位。计时储存采用高位低位分开存储到DW类型的缓冲区中方法,读取存储也采用高低位分别读取的方法。界面设计采用定义宏定义的方法,参数包括光标定位位置及需要输出的字符串,调用INT10H的06H中断设置每个区域的显示及字符串的颜色。软件代码流程图:图2:设计流程图图2为设计流程图,程序运行时会等待输入,当输入为S,便开始计时,开始计时时可输入E或者R,输入R,存储当前计时;输入E,暂停计数,程序在此等待输入,当输入为C,继续计数;当输入为D,重新计数;当输入为W,查看存储区所存储数据,存储区显示第一次存储的数据,等待输入,当输入为N,查看下一组存储数据;当输入U,查看上一组存储数据;当输入D,清除当前组数据;当输入B,返回计时区,等待输入。3系统调试与效果分析运行效果图:图3为程序开始界面,按下S开始计时图3:程序开始界面图4为程序开始计时界面,按下R存储当前计时,按下E暂停计时图4:程序运行界面图5为存储区显示界面,按下N,查询下一组存储数据,按下U查看上一组存储数据,按下D清除当前组数据,按下B返回计时区重新等待操作。图5:存储区显示界面图6,为当前存储清零,按下U,显示上一组,按下N,显示下一组,按下B,返回计时。图6:清除当前存储区4问题解决4.1计时精度初版设计采用1AH的00H中断读取系统时钟进行直接计时判断,在程序开始的地方判断是否满足18个计时单位,满足则加1秒,此程序是在所有后面判断键盘输入、存储数据等操作之后才清零计时单位,重新计数判断,在循环设计中,由于每行指令的执行都会消耗一定的时间,这就造成了在执行其他代码时计时单位没有继续计数,使本来计时周期为1秒变为不止一秒,经测试,60秒计时产生误差超过25%,完全达不到秒表计时标准,未解决计时单位计数与代码执行的同步问题,为解决此问题采用了更改中断向量1CH的办法,使用8253定时器0,工作方式3,设置计数初值为11932,并在任意代码执行的同时读取计时单位计数数值,这就避免了其他代码执行时计数并不进行的问题,经测试,60秒计时产生误差不超过1.2%,达到秒表计时标准。4.2各逻辑之间的相互跳转在对键入值进行判断后会有各逻辑之间的跳转,使用JZ,JNZ等条件转移指令时会出现错误,导致程序跳转到非理想位置,由于这个设计主要是各逻辑之间的跳转,因此我将各逻辑转移绘制成流程图,并标明所需的跳转转移指令,解决各逻辑之间错误转移的问题。使用条件转移指令跳转时可能会发生跳转指令错误,是因为这些跳转指令的跳转范围是有限的,当跳转范围在128B之内时才能使用这些指令,超过了需要使用长跳转指令。4.3对数据的存储数据存储的缓冲区的类型为DW,有两个字节,在存储时采用的是高低位分开存储的方式,存储低位时使用的是MOV[DI+1],DL,这个指令可实现将DL中的值存入DI+1这个字节,存下一组数据时只INCDI了一次,造成存储错误,后来经查阅资料发现即便执行了MOV[DI+1],DL,DI实际指向的单位仍然是高位字节,因此在程序结束后应INCDI四次才能指向下一组数据的高位。参考文献[1]黄玉清,刘双虎,杨胜波,微机原理与接口技术,2015,8<2>:170-187.附件清单程序:;----设置图形显示宏定义-----DISMACROLOCAT,CODEPUSHDXPUSHBXPUSHAXMOVDX,LOCAT;设置光标位置MOVBH,00MOVAH,02HINT10HMOVDL,CODE;输出字符串MOVAH,02HINT21HPOPAXPOPBXPOPDXENDMDATASEGMENTMSDB0SECDB0MSECDB0MINDB0FLAGDB0SFLAG DB 0 INIE DW 0 INIB DW 0MIDB'00:$'MEMDW40DUP<'0'>SPACEDB'$'NULINE DB 3DUP<0>,'$' WSTR DB"00:00:00",'$'TITDB'********CurriculumDesign********$'OPERATIONDB'Operation:$'PROMPT1DB'1.timezone:Input"S"Start,"R"Remember,"C"Continue,"D"diaplasis,"E"Exit$'PROMPT2DB'2.memoryzone:Input"N"Next,"U"Up,"D"Delete,"B"Back$'TIP1DB'OperatingTimeZone$'TIP2DB'OperatingMemoryZone$'NAMDB'---ByCaiLiqiang$'DATAENDSSTACKSEGMENTSTADB256DUP<0>TOPEQU$-STASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MAINPROCFAR;;;;;;;;;;;;XORAX,AXMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVDI,OFFSETMEMCALLCLRTIP;标题初始化函数;-----标题-----MOVDH,00HMOVDL,15HMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETTITMOVAH,09HINT21HCALLCLROPR;提示初始化;-----操作-----MOVDH,02HMOVDL,00HMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETOPERATIONMOVAH,09HINT21H;-----操作区提示-----MOVDH,03HMOVDL,00HMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETPROMPT1MOVAH,09HINT21HMOVDH,04HMOVDL,00HMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETPROMPT2MOVAH,09HINT21H;-----计时区-----CALLCLRTIM;计时区初始化MOVDH,06HMOVDL,05HMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETTIP1MOVAH,09HINT21H;-----计时图形----DIS070EH,'*'DIS070FH,'*'DIS0710H,'*'DIS0711H,'*'DIS0814H,'*'DIS0916H,'*'DIS0A18H,'*'DIS0B1AH,'*'DIS0D1BH,'*'DIS0E1BH,'*'DIS101AH,'*'DIS1118H,'*'DIS1216H,'*'DIS1314H,'*'DIS1411H,'*'DIS1410H,'*'DIS140FH,'*'DIS140EH,'*'DIS130BH,'*'DIS1209H,'*'DIS1107H,'*'DIS1005H,'*'DIS0E04H,'*'DIS0D04H,'*'DIS0B05H,'*'DIS0A07H,'*'DIS0909H,'*'DIS080BH,'*';-----记忆区-----CALLCLRMEMMOVDH,06HMOVDL,2DHMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETTIP1MOVAH,09HINT21H;-----记忆区图形-----DIS072EH,'*'DIS0731H,'*'DIS0733H,'*'DIS0735H,'*'DIS0737H,'*'DIS0739H,'*'DIS073BH,'*'DIS073EH,'*'DIS093EH,'*'DIS0B3EH,'*'DIS0D3EH,'*'DIS0F3EH,'*'DIS113EH,'*'DIS133EH,'*'DIS143EH,'*'DIS143BH,'*'DIS1439H,'*'DIS1437H,'*'DIS1435H,'*'DIS1433H,'*'DIS1431H,'*'DIS142EH,'*'DIS132EH,'*'DIS112EH,'*'DIS0F2EH,'*'DIS0D2EH,'*'DIS0B2EH,'*'DIS092EH,'*'DIS072EH,'*';-----名字-----CALLCLRNAMEMOVDH,16HMOVDL,3EHMOVBH,00HMOVAH,02HINT10HMOVDX,OFFSETNAMMOVAH,09HINT21HCALLLIGHTCALLSHOWALL;计时MAINENDP;;;;;;;;;;;;;子程序;;;;;;;;;;;;;-----显示存储数据程序-----WATCHPROCMOVDI,OFFSETMEM;把MEM的偏移地址送DIMOVDL,[DI];输出第一个保存数据ADDDL,48MOVAH,02HINT21HADDDL,48MOVDL,[DI+1];输出第一个保存数据MOVAH,02HINT21HMOVDL,':'MOVAH,02HINT21HMOVDL,[DI+2];输出第一个保存数据ADDDL,48MOVAH,02HINT21HADDDL,48MOVDL,[DI+3];输出第一个保存数据MOVAH,02HINT21HX:MOVAH,0BH;利用INT21H/0BH功能号,检测是否有键盘按下INT21HCMPAL,00HJZX;没有键入,转XMOVAH,08H;有键入,调用INT21H/08H,检测键入值INT21HJMPX5X0:CMPAL,'n';'n'判断是否查看下一个数据JZX1;是,执行X1,查看下一个数据JMPX2;否,执行X2X1:;查看第一个数据INCDIINCDIINCDIINCDICALLDISMEMMOVDL,[DI]ADDDL,48MOVAH,02HINT21HMOVDL,[DI+1]MOVAH,02HINT21HMOVDL,':'MOVAH,02HINT21HMOVDL,[DI+2];输出第一个保存数据ADDDL,48MOVAH,02HINT21HADDDL,48MOVDL,[DI+3];输出第一个保存数据MOVAH,02HINT21HMOVAH,08H;有键入,调用INT21H/08H,检测键入值INT21HCMPAL,'d';'d'判断是否清除JZX4;清除JMPX5;不清除继续检测X2:CMPAL,'u';'u'检测是否查看上一个数据JZX3;是,查看上一个数据JMPX5;否,继续检测X3:;查看上一个数据DECDIDECDIDECDIDECDICALLDISMEMMOVDL,[DI]ADDDL,48MOVAH,02HINT21HMOVDL,[DI+1]MOVAH,02HINT21HMOVDL,':'MOVAH,02HINT21HMOVDL,[DI+2];输出第一个保存数据ADDDL,48MOVAH,02HINT21HADDDL,48MOVDL,[DI+3];输出第一个保存数据MOVAH,02HINT21HMOVAH,08H;有键入,调用INT21H/08H,检测键入值INT21HCMPAL,'d';'d'否清除JZX4JMPX5X4:CALLDISMEMMOVDL,00H;清除当前数据,00MOV[DI],DLADDDL,48MOVAH,02HINT21HMOV[DI+1],DLMOVAH,02HINT21HMOVDL,':'MOVAH,02HINT21HMOVDL,00H;清除当前数据,00MOV[DI+2],DLADDDL,48MOVAH,02HINT21HMOV[DI+3],DLMOVAH,02HINT21HMOVAH,08H;有键入,调用INT21H/08H,检测键入值INT21HX5:CMPAL,'b';'b'判断是否返回主程序JNZX0;否,继续检测PUSHAXPUSHBXPUSHDXMOVDH,0EHMOVDL,34HMOVBH,00HMOVAH,02HINT10HPOPDXPOPBXPOPAXMOVDX,OFFSETSPACEMOVAH,09HINT21HRET;返回WATCHENDP;-----计时显示光标定位程序------LIGHTPROCNEARPUSHAXPUSHBXPUSHDXMOVDH,0DHMOVDL,0DHMOVBH,00HMOVAH,02HINT10HPOPDXPOPBXPOPAXRETLIGHTENDP;-----显示存储光标定位程序DISMEMPROCPUSHAXPUSHBXPUSHDXMOVDH,0EHMOVDL,35HMOVBH,00HMOVAH,02HINT10HPOPDXPOPBXPOPAXRETDISMEMENDP;-----标题初始化程序-----CLRTIPPROCMOVAL,1MOVCX,0000HMOVDX,0050HMOVBH,0CHMOVAH,06HINT10HRETCLRTIPENDP;-----提示初始化程序-----CLROPRPROCMOVAL,4MOVCX,0100HMOVDX,0450HMOVBH,05HMOVAH,06HINT10HRETCLROPRENDP;------计时区初始化程序-----CLRTIMPROCMOVAL,15MOVCX,0600HMOVDX,1420HMOVBH,0AHMOVAH,06HINT10HRETCLRTIMENDP;-----记忆区初始化程序-----CLRMEMPROCMOVAL,15MOVCX,0621HMOVDX,1450HMOVBH,0DHMOVAH,06HINT10HRETCLRMEMENDP;-----姓名初始化程序-----CLRNAMEPROCMOVAL,2MOVCX,1521HMOVDX,1750HMOVBH,0CHMOVAH,06HINT10HRETCLRNAMEENDPSHOWALL PROC CLIMOVAL,1CHMOVAH,35H INT21HMOVINIE,ESMOVINIB,BXSHOWINI: CALLLIGHTMOVDX,OFFSETWSTRMOVAH,09H INT21HKSCANW: MOVAH,0BH INT21HCMPAL,00H JEKSCANWMOVAH,08H INT21HCMPAL,'s' JETIME JMPKSCANW MOVAH,4CH INT21HTIME: MOVMIN,0MOVSEC,0MOVMSEC,0 CALLINITIRSHOWSTART: MOVSFLAG,1MOVFLAG,1 CALLLIGHT CALLTIMESHOWWSTOP: MOVAH,0BH INT21HCMPAL,00H JESHOWSTARTMOVAH,08H INT21HCMPAL,'e' JNERMOVSFLAG,0MOVFLAG,0 JMPJUDGER:CMPAL,'r';r,存储计数 JZMEMORY JMPSHOWSTARTMEMORY: ;存储CMPSEC,9 JASECBIGMOVDL,00HMOV[DI],DLMOVDL,SECADDDL,48MOV[DI+1],DLINCDIINCDICMPMSEC,9 JAMSECBIGMOVDL,00HMOV[DI],DLMOVDL,MSECADDDL,48MOV[DI+1],DLINCDIINCDI JMPSHOWSTARTSECBIG:MOVCL,10MOVAL,SECMOVAH,0DIVCL ;AH存余数,AL存商MOVDL,ALMOV[DI],DLMOVDH,AHMOVDL,DHADDDL,48MOV[DI+1],DLINCDIINCDIMSECBIG:MOVCL,10MOVAL,MSECMOVAH,0DIVCL ;AH存余数,AL存商MOVDL,ALMOV[DI],DLMOVDH,AHMOVDL,DHADDDL,48MOV[DI+1],DLINCDIINCDI JMPSHOWSTARTJUDGE:MOVAH,0BH INT21HANDAL,AL JZJUDGEREJUDGE:MOVAH,08H INT21HCMPAL,'d';检测是否输入D,重新计数 JZTIME ;是D,重新计时CMPAL,'c';检测输入是否为C,是否继续计时 JZSHOWSTART;是C,继续计时,否则继续检测CMPAL,'w';检测是否输入W,是否查看保存数据 JNZREJUDGE ;否,继续检测DO6 CALLDISMEM CALLWATCH;查看保存数据 JMPREJUDGE;继续检测MOVAH,4CH INT21H BACK:RET
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训学校专业演讲培训服务合同
- 地砖订购合同范本
- 小学端午节活动策划
- 母婴护士培训个人总结
- 护士长管理培训班总结
- 安全环保创新活动主题班会
- 二零二四年防水防潮打胶协议
- 二零二四年度舞台演出视觉效果:投影机设备及服务合同
- 二零二四年度夫妻共有房产转让合同3篇
- 急性脑出血护理查房
- 中职学生学情分析
- 钢管单元工程质量评定表
- 现场监护人培训
- 中班语言诗歌活动《月亮》课件
- 小学生爱国知识竞赛题省公开课一等奖全国示范课微课金奖课件
- 中华传统文化与人生修养智慧树知到期末考试答案2024年
- 儿童慢性咳嗽的诊治指南
- 育婴员中级第三章教育实施
- 中外政治思想史-形成性测试二-国开(HB)-参考资料
- 《促进民族团结作业设计方案-2023-2024学年初中道德与法治统编版》
- 部编小语三下四单元(《花钟》《蜜蜂》)大单元任务群教学设计
评论
0/150
提交评论