微机原理与接口综合设计Word下载.docx
《微机原理与接口综合设计Word下载.docx》由会员分享,可在线阅读,更多相关《微机原理与接口综合设计Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
4.中断服务程序的编写5
5.DOS功能调用5
6.时间调整模块设计6
7.硬件电路图6
三.软件思想7
1.主流程图8
2.时间显示流程图9
3.日期显示流程图10
附录A:
源程序及程序注释11
参考文献17
四.心得体会总结18
时钟控制系统设计
一、课程设计任务与要求
1.设计一个时钟,可以显示时、分、秒、日、月、年,并可以调整。
2.利用PC系列微机现有的硬件和软件资源,编写程序,使在CRT屏幕上显示XXXX年XX月:
XX日:
XX(时):
XX(分):
XX(秒),并且每秒钟更新一次显示。
3.编写程序,利用主机内的8253/8254-2的计数器0产生10ms对称方波输出,该输出送至IRQ0使8259A每10ms产生一次中断,100次中断后秒量+1,然后调整年、月、日、时、分、秒并显示在屏幕上。
程序从按下任意键开始显示数据区中存放的时间值,运行中按下空格键则停止运行返回DOS。
4.调整程序,直至运行正常。
二、课程设计过程
1.中断程序设计
(1)IBMPC/XT系统板上使用了一片8253-5,其地址40~43H,其中0通道工作于方式3,每55ms向中断控制器8259A的IRQ端发一次中断请求。
此定时中断的用途之一是系统报时。
现在借用原有电路,重新设置定时器、编写服务程序来做硬件时钟实验,为此程序开始应首先保护原系统的08H中断的中断向量(中断服务程序入口地址),以便程序退出时恢复原系统的设置。
保护原系统08H中断矢量可用DOS35H功能调用读出加以适当保存,也可以用以下指令,将中断矢量压入堆栈保存。
CLI;
关中断
CLD;
DF=0
MOVAX,0000H
MOVDS,AX;
DS:
SI指向08中断矢量在中断矢量表中的位置
MOVSI,0020H
LODSW
MOVBX,AX;
BX=原中断服务入口偏移地址
LODSW:
AX=原中断服务程序入口地址
PUSHAX;
压栈保护
PUSHBX
(2)将现中断服务程序入口地址填入中断矢量表中除了可用DOS25H功能调用外也可使用以下指令。
MOVES,AX
MOVDI,0020H;
ES:
DI指向08H中断矢量在中断矢量表中的存放位置
MOVAX,OFFSETTIMER
STOSW;
写入中断服务程序的偏移地址
MOVAX,SEGTIMER
STOSW;
写入中断服务程序的段地址
2.8259A中断屏蔽与恢复
借用系统用的08H中断还应注意保护原8259A的中断屏蔽寄存器内容。
读或写8259A的奇地址可以得到和改写IMR寄存器的内容。
执行
INAL,21H
PUSHAX
两条指令可以得到IMR的值并压入堆栈保护。
MOVAL,0FCH
OUT21H,AL
两条指令又可以重写IMR,使之只开放时钟和键盘的中断。
在程序退出前又应恢复IMR值。
用
POPAX
指令可以将原压堆栈保护的IMR值重新写入中断屏蔽寄存器。
3.8253初始化程序设计
MOVAL,00110110B;
8253初始化,0通道,工作方式3,采用二进制
OUT43H,AL
MOVAX,11932;
初值=11932
OUT40H,AL
MOVAL,AH
4.中断服务程序的编写
中断服务程序主要完成秒,分,时的调整并重写入数据区中。
中断服务程序中所用寄存器如与主程序有冲突,应该在中断服务程序一开始用压栈指令保护主程序中寄存器内容,中断返回前用出栈指令恢复此内容。
注意,先压入的寄存器应该后弹出。
最后在中断返回前还应向8259A发中断结束命令,使8259A内的在服务寄存器中的相应位复位;
MOVAL,20H
OUT20H,AL
5.有关字符输入的DOS功能调用
直接控制台输入输出(DOS6号功能调用)
调用格式;
MOVDL,X
MOVAH,06H
INT21H
功能;
从控制台(或键盘)输入或向屏幕输出字符。
本设计在程序运行过程中检测是否按下空格键或C键,按下空格键则停止运行返回DOS,按下C键则转到调整时间程序。
不按键则显示时间。
FOREVER:
MOVDL,0FFH;
有键按下么?
MOVAH,06H
JZDISP;
无按键下则转显示DISP
CMPAL,20H;
是有空格键么?
JZEXIT;
是则退出
CMPAL,'
C'
;
是有C键么?
JZTET;
是则调整时间
DISP:
LEADX,YEAR;
不是则显示时间
MOVAH,09H
INT21H
6.时间调整模块设计
当程序运行过程中,若有C键按下,则关掉中断,设置好日期时间后打开中断
TET:
调整日期时间
PUSHAX
MOVAH,01H
INT21H
MOVYEAR,AL
……………
STI
JMPFOREVER
7.硬件电路图
三、软件思想
主流程图和中断服务程序流程图
1.程序主流程图
2.时间显示流程图
3.日期显示流程图
源程序及程序注释
PAGE60,78
STACKSEGMENT
DB256DUP(0)
STACKENDS
DATASEGMENT
COUNTDB100
YEARDB'
2'
YEAR1DB'
0'
YEAR2DB'
YEAR3DB'
9'
DB'
-'
MHDB'
1'
MONTHDB'
DB'
TENDDB'
DATEDB'
TENHDB'
HOURDB'
3:
'
TENMDB'
5'
MINUTEDB'
9:
TENSDB'
SECONDDB'
0DH,'
$'
DATAENDS
CODESEGMENT
STARTPROCFAR
ASSUMECS:
CODE,DS:
DATA
MOVAX,0
PUSHAX
MOVAH,01H;
等待按键按下
CLI
CLD
MOVDS,AX
MOVSI,0020H;
SI指向08H中断向量
LODSW;
取08中断入口的偏移地址
MOVBX,AX
取08中断入口段地址
PUSHAX;
PUSHBX
MOVAX,DATA;
建立数据段的可寻址性
MOVDS,AX
MOVAX,0000H
MOVES,AX
MOVDI,0020H;
DS指向08中断向量存放地址
MOVAX,OFFSETTIMER
STOSW;
写入偏移地址
MOVAX,CS
写入段地址
8253初始化,0通道,3方式,HEX
将11932赋给AX初值
INAL,21H;
读8259的中段屏蔽寄存器IMR
MOVAL,0FCH
OUT21H,AL;
写IMR,只准许定时器和键盘中断
STI
有按下键没有?
无按键情况下则转显示DISP
是有空格键吗?
是有C键吗?
MOVAL,SECOND;
取秒单位值
WAITCHA:
CMPAL,SECOND;
改变否?
JZWAITCHA;
没改变则等待
JMPFOREVER;
改变则跳到FOREVER
TET:
MOVYEAR1,AL
MOVYEAR2,AL
MOVYEAR3,AL
MOVMH,AL
MOVMONTH,AL
INT21H
MOVTEND,AL
MOVDATE,AL
MOVTENH,AL
MOVAH,01H
MOVHOUR,AL
MOVTENM,AL
MOVMINUTE,AL
EXIT:
CLI;
有空格键按下则退出
CLD
POPAX
恢复IMR
MOVAL,36H;
8253初始化,55MS
MOVAL,0
MOVAX,0;
恢复08H中断的中断向量
MOVES,AX
MOVDI,4*8
STOSW
STOSW
RET
TIMERPROCFAR;
中断服务程序
PUSHAX
DECCOUNT
JNZL2;
不到1秒L2
MOVCOUNT,100;
到1秒,重置COUNT,并修改时间
INCSECOND
CMPSECOND,'
JLETIMEXT
MOVSECOND,'
INCTENS
CMPTENS,'
6'
JLTIMEXT
MOVTENS,'
INCMINUTE
CMPMINUTE,'
MOVMINUTE,'
INCTENM
CMPTENM,'
JLTIMEXT
MOVTENM,'
JMPL3
L2:
JMPTIMEXT
L3:
MOVAL,HOUR:
取时个位,时十位,组合成BCD