课程设计计时器程序设计!
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计时器汇编语言程序设计
1.总体方案论证
1.1计时方法的选择
(1)通过调用系统时钟来完成计时功能,这样就必须每秒或者每更短的时间调用系统时钟然后进行相减操作才能达到计时的每秒时时显示动态时间,虽然理论上可以实现计时功能,但是会比较的麻烦。
(2)通过调用系统的08h号或者1ch号中断来进行设置,使其能够产生100Hz即10ms 一次的中断,同时修改原08号中断的入口地址,使其每次中断执行一次计时的中断服务程序,进而动态显示时间。这种方法不仅简单易行,而且较方便。
经过以上论证,决定采用第二种方案来实现计时器功能。
1.2键盘按键输入的检测
在主程序中,通过先检查键盘是否有输入,如果没有输入,则跳过检查键盘输入的键值的程序,如果有输入则比较输入为“S”或“s”键,“P”或“p”键,“G”或“g”键,“C”或“c”键,“ESC”键中的哪个键,进而执行相应键值对应的实现该功能的程序,达到开始,暂停,继续,清零,退出的功能。
1.3显示计时的时间
考虑到更加直观的显示计时器的计时功能,让其显示的时候将百毫秒和十毫秒位也显示出来,使计时功能更加准确。所以在设计计时器的计时最小单位时,就要使中断频率设置为100Hz,即10ms一次中断。于是显示的计时单位就是“时:分:秒:十毫秒”。同时设置光标位置使其显示在屏幕中央。
1.4时间的进位处理
当十毫秒位超过9时候,要对百毫秒位进行加1操作,如果百毫秒位超过9时,要对秒位进1,当秒位超过9时,对十秒位进1,如果十秒位超过5时,才对分钟位进1,分钟位超过9时,对十分钟的位进1,如果十分钟位的超过5时,对小时位进1。小时位的进位设计就要考虑到小时最多24的特殊性了,所以设置一个变量,在小时位加1的同时给它也加1,如果这个变量加到了24则重新开始计时,此时再把该变量的置零。
1.5显示的形式
为了使计时器的显示界面更加直观更加清楚,所以可以在int10h的情况下将AH赋值为0,同时置AL为10H将显示方式设置为640×350彩色图形,而且为全屏显示,同时颜色通过在int10H的情况下将AH赋值的为0BH,同时置BL为04H可以将屏幕背景颜色设置为红色,这样计时器会更加醒目。
2.程序流程图设计及其说明
2.1主程序流程图
如图2-1主程序流程图所示,主程序是用来完成屏幕初始化(清屏和显示初始界面),同时对键盘按下的键值进行检测判断,进而执行相应键值所对应的程序,达到开始,暂停,继续,清零,退出的功能。
2.2中断服务子程序流程图
如图2-2中断服务子程序流程图所示,中断服务子程序的功能是每次中断执行一次该程序,对十毫秒位、百毫秒位、秒位、十秒位、分钟位、十分钟位、小时位和十小时位进行加1和判断是否进位操作,即达到该时间的情况下就给该时间对应位进行加1操作,使其能够显示正确的动态的时间。
图2-1主程序流程图
图2-2中断服务子程序流程图
3.软件设计关键问题和部分程序段落的说明
3.1判断键盘输入的键值
由于要实现键盘按下不同的键值实现各种不同的功能,所以判断键盘输入的为哪个键就显得尤为主要,所以使用了以下代码进行键盘输入键值判断。首先检查键盘是否有输入,若没有输入,则跳过检查键盘输入的键值的程序,若有输入则比较输入为何种键,接着执行该键值对应要完成的功能的程序。
mov ah,0bh;检验键盘状态,有输入al=00,无输入al=0ffh
int21h
inc al
jnz s1
mov ah,08h;键盘输入无回显,(al)=输入字符
int21h
cmp al,1bh;按下Esc键结束程序
je goout
cmp al,'p';按下p键停止计时
je pause
cmp al,'P';按下p键停止计时
je pause
cmp al,'c';按下c键清零
je clear
cmp al,'C';按下C键清零
je clear
jmp s1
3.2获得08H号中断原入口地址,设置其新入口地址
由于要使用08H号中断来实现,计时功能,所以首先要获得08H号中断的原来的入口地址,AL里存中断类型号,将其存在了ES:BX里,接着设置其新入口地址,将新的中断向
量存在DS:DX里就可以实现设置新入口地址。具体的代码实现如下:
mov al,08h
mov ah,35h;获取08h号中断的原入口地址
int21h
push es
push bx
push ds
mov ax,seg int08h
mov ds,ax
mov dx,offset int08h;设置08h号中断的新入口地址
mov al,08h
mov ah,25h
int21h;调用08h号中断的服务程序
pop ds
3.3设置中断屏蔽寄存器
中断屏蔽寄存器的I/O端口地址是21H,它的8位对应控制8个外部设备。某位为0允
许某外部设备中断,为1则表示某外部设备的中断请求被屏蔽。
图3-3中断屏蔽寄存器
由上图可以看出要使键盘和定时器允许外部中断,则令其对应的位置零,同时使其他设备
不允许外部中断。于是可通过以下代码进行设置:
in al,21h
push ax
mov al,11111100b
out21h,al
3.4设置中断频率为100Hz
由以上要求知道需要使系统内部8253输出方波频率为100Hz,所以要对08H号中断设置,使其能够10ms一次中断,同时要使其工作在通道0方式3的方波发生器。8253是微机系统常用的定时器芯片,它有三个独立的16位减法计数器,每个计数器分配一个端口地址,分别为40h,41h,42h。还有一个控制寄存器,端口地址为43h。