微机8253秒表课程设计报告.docx
- 文档编号:29712919
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:35
- 大小:1.42MB
微机8253秒表课程设计报告.docx
《微机8253秒表课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机8253秒表课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
微机8253秒表课程设计报告
--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--
微机8253秒表课程设计报告(总24页)
秒表程序设计
摘要:
本课程设计旨在设计一个秒表计时并储存计时的程序,可控制秒表的计时开始及结束,实现秒表的准确计时,存储计时数据,翻阅计时数据,清除计时数据等功能。
本程序是基于8086微机系统设计,在MasmforWindows软件下采用汇编语言编写,通过选择8253定时器0,工作方式3,输出周期为10ms的方波,产生稳定延时,调用各种中断完成程序各逻辑模块设计,通过键盘扫描得到输入的值,执行对应功能。
每10ms计时一次,每60秒一次循环,存储数据设定为最多20组,可随时存入数据,操作自由度极高,经测试,60秒计时误差不超过%,可实现准确计时及存储功能。
关键字:
秒表、显示计时、存储计时、汇编
1设计任务分析与方案选择
本设计需实现秒表稳定计时,并显示,需要存储计时数据时可立即将当前计时数据存入缓冲区,暂停计时时立即结束并可复位或者继续计数或者查看存储数据,在查看数据时可前后翻阅存储数据,并可清除,当退出查看数据后可使秒表继续计数或复位。
1.1方案选择
1.1.1系统硬件设计选择
本设计采用8253定时器0,工作方式3获得周期为10ms的稳定计时单位,使用8086CPU进行译码,当定时到1s的时候产生一个中断信号,在中断服务程序进行秒的计数,并送入相应的存储单元,8259芯片提供中断,并用8255的A口接七段数码管的段选信号,B口接七段数码管的位选信号。
1.1.2系统软件设计选择
在代码实现上,对于按键的输入上可以直接读取或是先扫描键盘再读取,本设计只存在各逻辑功能之间的转换,因此选择先扫描键盘再读取的方法,可提高代码的容错率及可操作性;使用宏定义及光标定位的方法,并配合各种中断设计界面图形及字体颜色,宏定义可以减少代码的重复度,且便于修改功能,可任意调用,通过定位光标可确定输出位置,可实现同一位置的动态输出;对于时间的扫描,可以选择直接读取系统当前的时间或是读取系统时钟的计时单位,前者的读取直接是BCD码非常便于输出显示,后者需要不停的读取计时单位读取次数非常多,而且结果不是BCD码,需要做判断转换输出,此设计采用读取系统时钟的计时单位,虽然需要不停的读取计时单位读取次数非常多,而且结果不是BCD码,需要做判断转换输出,但是经过与实际情况比较,后者的计时更为准确,区分度更大。
2详细设计
理论分析与计算
此设计需要实现单位为1秒的秒表稳定计时,8253定时器0工作方式3,外部提供一个时钟作为CLK信号,频率f=,为得到周期为10ms的方波,应对8253定时器设置计数初值为×10×10^-3=11932。
因此,8259A每隔10ms向CPU申请一次中断。
可用10作为基本计时单位,此设计的毫秒每一个计时单位改变一次,要达到1秒的计时,需要的计时单位为:
1000ms/10=100,则计数满足100个计时单位时,即毫秒计时到100时,秒位加1,完成1秒稳定计时。
算法设计
本设计的算法包括键盘检测及读取、秒表计时及输出,数据存储、数据操作、界面及提示词设计。
键盘检测及读取
使用21H中断的0BH中断检测是否有键盘按下,如果没有键盘按下则继续检测,如果有键盘按下使用21H中断的08H中断判断是否为所设定的值,如果不是,继续检测输入,如果是便按逻辑进行。
秒表计时及输出
使用8253定时器0,工作方式3获得的周期为,10ms的方波作为计时单位,调用1CH中断,读取1CH原中断向量,并设置中断向量,取计时处理程序偏移地址及段地址,计时处理程序中毫秒加一直到100ms,秒位便加一,毫秒清零,继续计时。
定位光标,在光标位置输出计时,显示格式为00:
00:
00,计时显示采用高位低位分开显示,将计时数值除以10,得到商和余数,商作为高位,余数作为低位,当计时单位满1后,毫秒位加1毫秒,毫秒计时到100,秒位加1并动态显示。
数据存储
在数据段中定义一个大小为40字的全为0的缓冲区用于存储计时数值,在代码段中合适位置取缓冲区的偏移地址给寄存器,存储方式采用高位低位分开存储的方式,将秒数值除以10,商存前一个字节,余数存后一个字节,存完高位后寄存器指向下一个字节存低位,低位存完之后寄存器再指向下一字节,用于存储毫秒计时的高位。
数据操作
定义光标,取缓冲区的偏移地址给寄存器,在合适位置从第一次存储的数据开始显示,此时寄存器指向第一个字节,调用21H的0BH检测键盘输入,如有键盘输入,调用21H的08H检测键入值,当接收操作为查看下一个存储数据时,寄存器加2,指向下一组数据的高位,并调用21H的09H中断显示当前数值,寄存器加一,调用21H的09H中断显示当前所指数据;当接收操作为查看上一个存储数据时,寄存器减二,指向上一组数据的高位,并调用21H的09H中断显示当前数值,寄存器加一,调用21H的09H中断显示当前所指数据;当接收操作为清除当前数据时,将0存入当前寄存器所指字节及下一字节,并调用21H的09H中断显示当前数值:
00:
00;当接收操作为返回计时时,判断键入,跳转到相应操作。
界面及提示词设计
在数据段定义提示语句字符串,使用10H的02H中断定位光标,在代码段中相应位置取代码段的偏移地址,使用21H的09H中断显示字符串,使用宏定义,拥有两个参数,一个是光标位置,所在行数和列数,调用10H的02H中断置光标,调用21H的09H显示字符,可实现在任意位置显示任意字符,用此宏定义绘制计时区及记忆区图形,搭配10H的06H中断可在任一区域进行显示,为使各区域鲜明区分,改变10H的06H中断中出口参数BH的值,设置各字符串为不同颜色,实现彩色输出,增强观赏性。
硬件电路设计
1.193MHZ
图1,硬件电路设计
在整个电子钟的设计中。
我们使用8253用于定时功能,由于8259的中断只能是电平与电缘触发,所以我们选择电缘触发。
由于我们选择一次写入计数初值后的能循环进行,所以我们选择工作方式0在每次的计数初值的N-1是产生一个脉冲。
在CLK0引脚接入的时钟周期,而将计数初值写为11932,继而在OUT0会在每1ms产生脉冲,在控制字的时候采用二进制计数,所以其控制字为00110110B,所以8253能产生准确的计时功能。
8255A芯片,将8255A的A,B口均工作在工作方式0的下,且为输出控制LED的位选与片选,而C口用于修改时间用,同样工作于方式0低四位输出。
所以其控制字为81H。
8259A芯片用于产生中断信号去自动修改秒针。
所以只需将8259的IR0产生中断,其他未屏蔽,单片8259,上升沿中断,要写ICW4,中断号为20H,工作在8086方式。
软件设计
在软件实现上,对于按键的输入上采用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问题解决
计时精度
初版设计采用1AH的00H中断读取系统时钟进行直接计时判断,在程序开始的地方判断是否满足18个计时单位,满足则加1秒,此程序是在所有后面判断键盘输入、存储数据等操作之后才清零计时单位,重新计数判断,在循环设计中,由于每行指令的执行都会消耗一定的时间,这就造成了在执行其他代码时计时单位没有继续计数,使本来计时周期为1秒变为不止一秒,经测试,60秒计时产生误差超过25%,完全达不到秒表计时标准,未解决计时单位计数与代码执行的同步问题,为解决此问题采用了更改中断向量1CH的办法,使用8253定时器0,工作方式3,设置计数初值为11932,并在任意代码执行的同时读取计时单位计数数值,这就避免了其他代码执行时计数并不进行的问题,经测试,60秒计时产生误差不超过%,达到秒表计时标准。
各逻辑之间的相互跳转
在对键入值进行判断后会有各逻辑之间的跳转,使用JZ,JNZ等条件转移指令时会出现错误,导致程序跳转到非理想位置,由于这个设计主要是各逻辑之间的跳转,因此我将各逻辑转移绘制成流程图,并标明所需的跳转转移指令,解决各逻辑之间错误转移的问题。
使用条件转移指令跳转时可能会发生跳转指令错误,是因为这些跳转指令的跳转范围是有限的,当跳转范围在128B之内时才能使用这些指令,超过了需要使用长跳转指令。
对数据的存储
数据存储的缓冲区的类型为DW,有两个字节,在存储时采用的是高低位分开存储的方式,存储低位时使用的是MOV[DI+1],DL,这个指令可实现将DL中的值存入DI+1这个字节,存下一组数据时只INCDI了一次,造成存储错误,后来经查阅资料发现即便执行了MOV[DI+1],DL,DI实际指向的单位仍然是高位字节,因此在程序结束后应INCDI四次才能指向下一组数据的高位。
参考文献
[1]黄玉清,刘双虎,杨胜波,微机原理与接口技术,2015,8
(2):
170-187.
附件清单
程序:
;----设置图形显示宏定义-----
DISMACROLOCAT,CODE
PUSHDX
PUSHBX
PUSHAX
MOVDX,LOCAT;设置光标位置
MOVBH,00
MOVAH,02H
INT10H
MOVDL,CODE;输出字符串
MOVAH,02H
INT21H
POPAX
POPBX
POPDX
ENDM
DATASEGMENT
MSDB0
SECDB0
MSECDB0
MINDB0
FLAGDB0
SFLAGDB0
INIEDW0
INIBDW0
MIDB'00:
$'
MEMDW40DUP('0')
SPACEDB'$'
NULINEDB3DUP(0),'$'
WSTRDB"00:
00:
00",'$'
TITDB'********CurriculumDesign********$'
OPERATIONDB'Operation:
$'
PROMPT1DB'zone:
Input"S"Start,"R"Remember,"C"Continue,"D"diaplasis,"E"Exit$'
PROMPT2DB'zone:
Input"N"Next,"U"Up,"D"Delete,"B"Back$'
TIP1DB'OperatingTimeZone$'
TIP2DB'OperatingMemoryZone$'
NAMDB'---ByCaiLiqiang$'
DATAENDS
STACKSEGMENT
STADB256DUP(0)
TOPEQU$-STA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MAINPROCFAR
;;;;;;;;;;;;
XORAX,AX
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVDI,OFFSETMEM
CALLCLRTIP;标题初始化函数
;-----标题-----
MOVDH,00H
MOVDL,15H
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETTIT
MOVAH,09H
INT21H
CALLCLROPR;提示初始化
;-----操作-----
MOVDH,02H
MOVDL,00H
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETOPERATION
MOVAH,09H
INT21H
;-----操作区提示-----
MOVDH,03H
MOVDL,00H
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETPROMPT1
MOVAH,09H
INT21H
MOVDH,04H
MOVDL,00H
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETPROMPT2
MOVAH,09H
INT21H
;-----计时区-----
CALLCLRTIM;计时区初始化
MOVDH,06H
MOVDL,05H
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETTIP1
MOVAH,09H
INT21H
;-----计时图形----
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,'*'
;-----记忆区-----
CALLCLRMEM
MOVDH,06H
MOVDL,2DH
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETTIP1
MOVAH,09H
INT21H
;-----记忆区图形-----
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,'*'
;-----名字-----
CALLCLRNAME
MOVDH,16H
MOVDL,3EH
MOVBH,00H
MOVAH,02H
INT10H
MOVDX,OFFSETNAM
MOVAH,09H
INT21H
CALLLIGHT
CALLSHOWALL;计时
MAINENDP
;;;;;;;;;;;;;子程序;;;;;;;;;;;;
;-----显示存储数据程序-----
WATCHPROC
MOVDI,OFFSETMEM;把MEM的偏移地址送DI
MOVDL,[DI];输出第一个保存数据
ADDDL,48
MOVAH,02H
INT21H
ADDDL,48
MOVDL,[DI+1];输出第一个保存数据
MOVAH,02H
INT21H
MOVDL,':
'
MOVAH,02H
INT21H
MOVDL,[DI+2];输出第一个保存数据
ADDDL,48
MOVAH,02H
INT21H
ADDDL,48
MOVDL,[DI+3];输出第一个保存数据
MOVAH,02H
INT21H
X:
MOVAH,0BH;利用INT21H/0BH功能号,检测是否有键盘按下
INT21H
CMPAL,00H
JZX;没有键入,转X
MOVAH,08H;有键入,调用INT21H/08H,检测键入值
INT21H
JMPX5
X0:
CMPAL,'n';'n'判断是否查看下一个数据
JZX1;是,执行X1,查看下一个数据
JMPX2;否,执行X2
X1:
;查看第一个数据
INCDI
INCDI
INCDI
INCDI
CALLDISMEM
MOVDL,[DI]
ADDDL,48
MOVAH,02H
INT21H
MOVDL,[DI+1]
MOVAH,02H
INT21H
MOVDL,':
'
MOVAH,02H
INT21H
MOVDL,[DI+2];输出第一个保存数据
ADDDL,48
MOVAH,02H
INT21H
ADDDL,48
MOVDL,[DI+3];输出第一个保存数据
MOVAH,02H
INT21H
MOVAH,08H;有键入,调用INT21H/08H,检测键入值
INT21H
CMPAL,'d';'d'判断是否清除
JZX4;清除
JMPX5;不清除继续检测
X2:
CMPAL,'u';'u'检测是否查看上一个数据
JZX3;是,查看上一个数据
JMPX5;否,继续检测
X3:
;查看上一个数据
DECDI
DECDI
DECDI
DECDI
CALLDISMEM
MOVDL,[DI]
ADDDL,48
MOVAH,02H
INT21H
MOVDL,[DI+1]
MOVAH,02H
INT21H
MOVDL,':
'
MOVAH,02H
INT21H
MOVDL,[DI+2];输出第一个保存数据
ADDDL,48
MOVAH,02H
INT21H
ADDDL,48
MOVDL,[DI+3];输出第一个保存数据
MOVAH,02H
INT21H
MOVAH,08H;有键入,调用INT21H/08H,检测键入值
INT21H
CMPAL,'d';'d'否清除
JZX4
JMPX5
X4:
CALLDISMEM
MOVDL,00H;清除当前数据,00
MOV[DI],DL
ADDDL,48
MOVAH,02H
INT21H
MOV[DI+1],DL
MOVAH,02H
INT21H
MOVDL,':
'
MOVAH,02H
INT21H
MOVDL,00H;清除当前数据,00
MOV[DI+2],DL
ADDDL,48
MOVAH,02H
INT21H
MOV[DI+3],DL
MOVAH,02H
INT21H
MOVAH,08H;有键入,调用INT21H/08H,检测键入值
INT21H
X5:
CMPAL,'b';'b'判断是否返回主程序
JNZX0;否,继续检测
PUSHAX
PUSHBX
PUSHDX
MOVDH,0EH
MOVDL,34H
MOVBH,00H
MOVAH,02H
INT10H
POPDX
POPBX
POPAX
MOVDX,OFFSETSPACE
MOVAH,09H
INT21H
RET;返回
WATCHENDP
;-----计时显示光标定位程序------
LIGHTPROCNEAR
PUSHAX
PUSHBX
PUSHDX
MOVDH,0DH
MOVDL,0DH
MOVBH,00H
MOVAH,02H
INT10H
POPDX
POPBX
POPAX
RET
LIGHTENDP
;-----显示存储光标定位程序
DISMEMPROC
PUSHAX
PUSHBX
PUSHDX
MOVDH,0EH
MOVDL,35H
MOVBH,00H
MOVAH,02H
INT10H
POPDX
POPBX
POPAX
RET
DISMEMENDP
;-----标题初始化程序-----
CLRTIPPROC
MOVAL,1
MOVCX,0000H
MOVDX,0050H
MOVBH,0CH
MOVAH,06H
INT10H
RET
CLRTIPENDP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 8253 秒表 课程设计 报告