北京邮电大学实验报告实验三微机.docx
《北京邮电大学实验报告实验三微机.docx》由会员分享,可在线阅读,更多相关《北京邮电大学实验报告实验三微机.docx(12页珍藏版)》请在冰豆网上搜索。
北京邮电大学实验报告实验三微机
北京邮电大学实验报告
题目:
微机原理软件实验三
班级:
2010211127
专业:
信息工程
姓名:
付莹
学号:
10210759
实验五:
中断实验
1.实验类
设计型实验:
编程实现时钟的显示。
2.实验目的
掌握计数器/定时器8253的工作原理和编程方法;
掌握中断控制器8259的工作原理;
掌握中断处理程序的编写。
3.实验条件
硬件条件:
PC机一台。
软件条件:
DOS操作系统;任意一种编辑程序,如EDIT;
宏汇编程序MASM;连接程序LINK;调试程序DEBUG。
可借用该程序中的中断服务程序以及8253的初始化程序段(口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:
1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms)。
4.实验内容及步骤
编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒
Currenttimeis:
xx:
xx:
xx(时分秒键盘输入)
回车后时、分、秒开始计时,时钟不停的刷新。
当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
5.实验报告
(1)画出程序流程图。
(2)提交调试好的汇编语言源程序(.asm)。
DATASEGMENTPARAPUBLIC'DATA'
COUNT100DB100
MESG1DB'Currenttimeis:
$'
MESG2DB'Thetimeiswrong,pleaseinputagian...$'
GETTIMEDB9,'?
'
TENHOURDB0
HOURDB0,':
'
TENMINDB0
MINUTEDB0,':
'
TENSECDB0
SECONDDB0
OLD_OFFDW0
OLD_SEGDW0
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB256DUP(0)
STACKENDS
CODESEGMENTPARAPUBLIC'CODE'
ASSUMECS:
CODE
ASSUMEDS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMESG1;显示'Currenttimeis:
'
MOVAL,09H
INT21H
MOVDX,OFFSETGETTIME;接受屏幕输入时间
MOVAH,0AH
INT21H
MOVHOUR+1,':
';时分秒之间的分隔符为':
'
MOVMINUTE+1,':
';检测时间输入是否符合要求
CMPSECOND,'0'
JCERRO
CMPSECOND,'9'
JGERRO
CMPTENSEC,'0'
JCERRO
CMPTENSEC,'6'
JNCERRO
CMPMINUTE,'0'
JCERRO
CMPMINUTE,'9'
JGERRO
CMPTENMIN,'0'
JCERRO
CMPTENMIN,'6'
JNCERRO
CMPHOUR,'0'
JCERRO
CMPHOUR,'4'
JNCERRO
CMPTENHOUR,'0'
JCERRO
CMPTENHOUR,'3'
JNCERRO
JMPNEXT1
ERRO:
MOVDX,OFFSETMESG2;输入有错,显示'Thetimeiswrong,pleaseinputagian...'
MOVAH,09H
INT21H
JMPSTART
;设置中断向量表
NEXT1:
CLI
MOVAL,08H;取08号中断向量的服务程序地址
MOVAH,35H
INT21H;ES:
BX=入口地址
MOVOLD_OFF,BX;保存原来的终端服务程序地址
MOVBX,ES
MOVOLD_SEG,BX
MOVAL,08H;设置08号中断向量的服务程序地址
MOVAH,25H
MOVDX,SEGTIMER
PUSHDS
MOVDS,DX
MOVDX,OFFSETTIMER
INT21H
POPDS
;设置8253
MOVAL,36H
OUT43H,AL
MOVBX,11932
MOVAL,bl
OUT40H,AL
MOVAL,bH
OUT40H,AL
;设置8259A
MOVDX,20H;ICW1地址
MOVAL,11H;写ICW1,沿触发方式、级联,要ICW4
OUTDX,AL
ADDDX,1;指向ICW2、ICW3、ICW4地址
MOVAL,8;ICW2,中断向量号为08H
OUTDX,AL
MOVAL,4;ICW3,IR2接有从片PIC
OUTDX,AL
MOVAL,1;ICW4,正常屏蔽方式、全嵌套、正常EOI
OUTDX,AL
MOVDX,0A0H;从片ICW1地址
MOVAL,11H;写ICW1,沿触发方式、级联,要ICW4
OUTDX,AL
ADDDX,1;指向ICW2、ICW3、ICW4地址
MOVAL,70H;ICW2,中断向量号为70H
OUTDX,AL
MOVAL,2;ICW3,从片PIC识别号=2
OUTDX,AL
MOVAL,1;ICW4,正常屏蔽方式、正常EOI
OUTDX,AL
STI
;显示时间信息
FOREVER:
MOVDX,OFFSETMESG1;显示'Currenttimeis:
'
MOVAH,09H
INT21H
MOVBX,OFFSETTENHOUR
MOVCX,8
DISD:
MOVAL,[BX];显示具体时间
CALLDISPCHAR
INCBX
LOOPDISD
MOVAL,0DH
CALLDISPCHAR
MOVAL,SECOND
NEXT:
CMPAL,SECOND;检测时间是否改变
JENEXT
JMPFOREVER
;中断服务程序TIMER
TIMERPROCFAR
PUSHAX
DECCOUNT100;每100次中断为1秒
JNZTIMERX
MOVCOUNT100,100
INCSECOND
CMPSECOND,'9'
JLETIMERX
MOVSECOND,'0'
INCTENSEC
CMPTENSEC,'5'
JLETIMERX
MOVTENSEC,'0'
INCMINUTE
CMPMINUTE,'9'
JLETIMERX
MOVMINUTE,'0'
INCTENMIN
CMPTENMIN,'5'
JLETIMERX
MOVTENMIN,'0'
INCHOUR
CMPHOUR,'9'
JLETIMERX
MOVHOUR,'0'
INCTENHOUR
CMPTENHOUR,'1'
JLETIMERX
CMPHOUR,'3'
JLETIMERX
MOVTENHOUR,'0'
MOVHOUR,'0'
TIMERX:
MOVAL,20H;不到100次则结束中断
OUT20H,AL
POPAX
IRET
TIMERENDP
;显示字符的子程序
DISPCHARPROCNEAR
PUSHBX
MOVBX,0
MOVAH,14
INT10H
POPBX
RET
DISPCHARENDP
;恢复原来的中断服务程序
MOVAH,4CH
MOVDX,OLD_SEG
PUSHDS
MOVDS,DX
MOVDX,OLD_OFF
INT21H
POPDS
CODEENDS
ENDSTART
实验抓图
输入错误的时候
(3)总结实验中遇到的问题及解决的方法。
主要实验中是编写时候的问题,第一如何使8259A产生中断,一开始想的是固定循环次数,然后int8ch,但仔细研读了例题,并看了8253的工作方式36H=00110110B,发现方波发生器可以每一次可以把每个方波看做是事件,out为中断请求,这样子,就可以在计时的时候调用中断程序。
在设置的时候,就可以理解了。
此外就是24小时以后清零问题,就是23:
59:
59之后应该跳转到00:
00:
00,需要对小时加上一个跳转,还有就是判断用户输入的对错问题上,分和秒的个位由于一开始写的jnc跳转,但最后要比较的应该改为JG。
这个问题虽然小,但是也从中重新了解了一遍跳转。
【心得体会】
这次的实验由于涉及到了可编程器件的初始化,有和我们的硬件实验联系到了一起,不过学过中断和定时器之后,重新自己编程还是很有成就感的。
对于我本身来说,实验是必不可少的,平时看书把概念看似搞明白了,但是重新利用到了原来的知识又会出现错误,多亏了实验和课程相结合,感觉到了自己学得更加扎实了。
Ps:
祝新年快乐