北京邮电大学实验报告实验三微机
- 格式:docx
- 大小:103.87 KB
- 文档页数:11
北京邮电大学实验报告题目:微机原理软件实验三班级: 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产生一次中断。
在中断服务程序中管理刷新时、分、秒Current time is: xx:xx:xx (时分秒键盘输入)回车后时、分、秒开始计时,时钟不停的刷新。
当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
5. 实验报告(1)画出程序流程图。
开始等待回车键按下(08H 中断调用)取原8H 中断的中断矢量并压栈保护建立数据段的可寻址性 装载现在的中断服务程序8253初始化产生10ms 方波,10ms 中断一次重写IMR ,只开放时钟和键盘中断开中断监测键盘(06H 中断调用)是Ctrl+C ? 关中断 恢复IMR重置8253,,55ms 中断一次恢复原中断开中断返回DOS ,结束Yes有键按下?显示时间值(09H 中断调用)取消秒Yes 计数达到100次(1秒)?NoYesNoNo实现等待计时功能实现循环,秒值变化则返回继续执行程序显示“Current time is :” 读入键盘输入(2)提交调试好的汇编语言源程序(.asm)。
DATA SEGMENT PARA PUBLIC 'DAT A'COUNT100 DB 100MESG1 DB 'Current time is:$'MESG2 DB 'The time is wrong, please input agian...$'GETTIME DB 9,'?'TENHOUR DB 0HOUR DB 0,':'TENMIN DB 0MINUTE DB 0 ,':'TENSEC DB 0SECOND DB 0OLD_OFF DW 0OLD_SEG DW 0DATA ENDSSTACK SEGMENT PARA ST ACK 'ST ACK'DB 256 DUP(0)STACK ENDSCODE SEGMENT PARA PUBLIC 'CODE'ASSUME CS:CODEASSUME DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET MESG1 ;显示'Current time is:'MOV AL,09HINT 21HMOV DX,OFFSET GETTIME ;接受屏幕输入时间MOV AH,0AHINT 21HMOV HOUR+1,':' ;时分秒之间的分隔符为':'MOV MINUTE+1,':' ;检测时间输入是否符合要求CMP SECOND,'0'JC ERROCMP SECOND,'9'JG ERROCMP TENSEC,'0'JC ERROCMP TENSEC,'6'JNC ERROCMP MINUTE,'0'JC ERROCMP MINUTE,'9'JG ERROCMP TENMIN,'0'JC ERROCMP TENMIN,'6'JNC ERROCMP HOUR,'0'JC ERROCMP HOUR,'4'JNC ERROCMP TENHOUR,'0'JC ERROCMP TENHOUR,'3'JNC ERROJMP NEXT1ERRO: MOV DX,OFFSET MESG2 ;输入有错,显示'The time is wrong, please input agian...'MOV AH,09HINT 21HJMP START;设置中断向量表NEXT1: CLIMOV AL, 08H ;取08号中断向量的服务程序地址MOV AH, 35HINT 21H ;ES:BX = 入口地址MOV OLD_OFF, BX ;保存原来的终端服务程序地址MOV BX,ESMOV OLD_SEG, BXMOV AL,08H ;设置08号中断向量的服务程序地址MOV AH,25HMOV DX,SEG TIMERPUSH DSMOV DS,DXMOV DX, OFFSET TIMERINT 21HPOP DS;设置8253MOV AL,36HOUT 43H,ALMOV BX,11932MOV AL,blOUT 40H,ALMOV AL,bHOUT 40H,AL;设置8259AMOV DX,20H ;ICW1地址MOV AL,11H ;写ICW1,沿触发方式、级联,要ICW4OUT DX,ALADD DX,1 ;指向ICW2、ICW3、ICW4地址MOV AL,8 ;ICW2,中断向量号为08HOUT DX, ALMOV AL, 4 ;ICW3,IR2接有从片PICOUT DX, ALMOV AL, 1 ;ICW4,正常屏蔽方式、全嵌套、正常EOIOUT DX,ALMOV DX, 0A0H ;从片ICW1地址MOV AL, 11H ;写ICW1,沿触发方式、级联,要ICW4OUT DX, ALADD DX, 1 ;指向ICW2、ICW3、ICW4地址MOV AL, 70H ;ICW2,中断向量号为70HOUT DX, ALMOV AL, 2 ;ICW3,从片PIC识别号=2OUT DX, ALMOV AL, 1 ;ICW4,正常屏蔽方式、正常EOIOUT DX,ALSTI;显示时间信息FOREVER: MOV DX,OFFSET MESG1 ;显示'Current time is:'MOV AH,09HINT 21HMOV BX,OFFSET TENHOURMOV CX,8DISD: MOV AL,[BX] ;显示具体时间CALL DISPCHARINC BXLOOP DISDMOV AL,0DHCALL DISPCHARMOV AL,SECONDNEXT: CMP AL,SECOND ;检测时间是否改变JE NEXTJMP FOREVER;中断服务程序TIMERTIMER PROC FARPUSH AXDEC COUNT100 ;每100次中断为1秒JNZ TIMERXMOV COUNT100,100INC SECONDCMP SECOND,'9'JLE TIMERXMOV SECOND,'0'INC TENSECCMP TENSEC,'5'JLE TIMERXMOV TENSEC,'0'INC MINUTECMP MINUTE,'9'JLE TIMERXMOV MINUTE,'0'INC TENMINCMP TENMIN,'5'JLE TIMERXMOV TENMIN,'0'INC HOURCMP HOUR,'9'JLE TIMERXMOV HOUR,'0'INC TENHOURCMP TENHOUR,'1'JLE TIMERXCMP HOUR,'3'JLE TIMERXMOV TENHOUR,'0'MOV HOUR,'0'TIMERX: MOV AL,20H ;不到100次则结束中断OUT 20H,ALPOP AXIRETTIMER ENDP;显示字符的子程序DISPCHAR PROC NEARPUSH BXMOV BX,0MOV AH,14INT 10HPOP BXRETDISPCHAR ENDP;恢复原来的中断服务程序MOV AH,4CHMOV DX,OLD_SEGPUSH DSMOV DS,DXMOV DX,OLD_OFFINT 21HPOP DSCODE ENDSEND START实验抓图输入错误的时候(3)总结实验中遇到的问题及解决的方法。
主要实验中是编写时候的问题,第一如何使8259A产生中断,一开始想的是固定循环次数,然后int 8ch,但仔细研读了例题,并看了8253的工作方式36H=00110110B,发现方波发生器可以每一次可以把每个方波看做是事件,out 为中断请求,这样子,就可以在计时的时候调用中断程序。
在设置的时候,就可以理解了。
8254O U T 0C L K 0IN T IR 08259CPU周期性方波此外就是24小时以后清零问题,就是23:59:59之后应该跳转到00:00:00,需要对小时加上一个跳转,还有就是判断用户输入的对错问题上,分和秒的个位由于一开始写的jnc 跳转,但最后要比较的应该改为JG 。
这个问题虽然小,但是也从中重新了解了一遍跳转。
【心得体会】这次的实验由于涉及到了可编程器件的初始化,有和我们的硬件实验联系到了一起,不过学过中断和定时器之后,重新自己编程还是很有成就感的。
对于我本身来说,实验是必不可少的,平时看书把概念看似搞明白了,但是重新利用到了原来的知识又会出现错误,多亏了实验和课程相结合,感觉到了自己学得更加扎实了。
Ps :祝新年快乐。