当前位置:文档之家› 北理工计算机原理与应用实验二

北理工计算机原理与应用实验二

本科实验报告实验名称:计算机原理与应用实验二实验二利用中断方式设计数字时钟一、实验目的1.掌握PC机中断处理系统的基本原理。

2.熟悉定时/计数器8254工作原理及其编程方法。

3.利用实验板上的8254定时器为中断源发中断申请,中断请求用IRQ3(系统总线区的IRQ)。

4.熟悉数码管显示原理,掌握数码管显示接口技术。

5.学习数字时钟原理,实现数字时钟。

6.掌握中断控制器8259管理二、实验内容与步骤1) 接线(参考):PB7~PB0/8255 接dp~a /LED 数码管CS /8254 接Y0 /IO 地址PC3~PC0 /8255 接S3~S0/LED 数码管CS/8255 接Y1 /IO 地址IRQ /总线接OUT1/8254GATE0 /8254 接+5VCLK0 /8254 接1M时钟OUT0 /8254 接CLK1 /8254GATE1 /8254 接+5V三、实验原理1、PC 机用户可使用的硬件中断只有可屏蔽中断,由8259 中断控制器管理。

中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU 发出可屏蔽中断请求。

IBMPC、PC/XT 机内有一片8259 中断控制器对外可以提供8个中断源:中断源中断类型号中断功能IRQ0 08H 时钟IRQ1 09H 键盘IRQ2 0AH 保留IRQ3 OBH 串行口2IRQ4 0CH 串行口1IRQ5 0DH 硬盘IRQ6 0EH 软盘IRQ7 0FH 并行打印机8 个中断源的中断请求信号线IRQ0~IRQ7 在主机的62 线ISA 总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。

对于PC/AT 及286 以上微机内又扩展了一片8259 中断控制,IRQ2 用于两片8259 之间级连,对外可以提供16 个中断源:中断源中断类型号中断功能IRQ8 070H 实时时钟IRQ9 071H 用户中断IRQ10 072H 保留IRQ11 O73H 保留IRQ12 074H 保留IRQ13 075H 协处理器IRQ14 076H 硬盘IRQ15 077H 保留实验系统总线区的IRQ 接到了3 号中断IRQ3 上,即进行中断实验时,所用中断类型号为0BH。

2、中断控制器8259 可利用系统初始化设定如不进行新的初始化,只需对8259 中断控制器的屏蔽寄存器设定IRQ3 为中断允许,其他原有中断允许保持不变。

3、将实验板上的8253 的通道,设定为10ms 周期信号发生器该芯片的通道1 设定为计数器,其输入来自定时器通道0 的输出,利用通道1 的计数器输出作为IRQ3 中断请求信号。

4、8254 定时器的CLK0 由实验板上的1MHZ 振荡器来提供。

5、编写中断服务程序,进行数字钟显示:XX:XX(分秒)其中X 为一数码管。

6、数码管显示接口电路如图所示。

实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。

实验时用PB7~PB0/8255 接dp~a /LED 数码管,PC3~PC0 /8255 接S3~S0/LED 数码管。

七段数码管的字型代码表如下表:7、程序流程图四、实验代码:p8259 equ 20h ;端口首地址p8255 equ 288h ;端口首地址p8253 equ 280h ;IO Y1data segmentled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;数码管sec1 db 0sec2 db 0min1 db 0min2 db 0mes db 42hOld_0A DW 0,0 ;原中断向量 Old_8259 DB 0data endsstacks segmentdb 64 dup (0)stacks endscode segmentassume cs:code,ds:data,es:data start:mov ax,datamov ds,axcli;关闭中断mov al,00110110bmov dx,p8253+3 ;计数器0,工作在模式3out dx,almov ax,10000mov dx,p8253out dx,almov al,ah ;先赋高八位再赋低八位out dx,almov al,01110110bmov dx,p8253+3 ;计数器1,工作在模式3out dx,almov ax,100mov dx,p8253+1out dx,almov al,ah ;先赋高八位再赋低八位out dx,al ;设置中断向量表 PUSH ESPUSH BXMOV Al,0BH ;保护原中断向量,0B中断类型号mov ah,35hINT 21H ;读中断向量表MOV Old_0A+2,ES;ES为段地址,BX为段偏移地址MOV Old_0A,BXPOP BXPOP ESpush dsmov al,0bh ; 写新中断向量mov ah,25hmov dx,seg INT_0Amov ds,dxmov dx,offset INT_0Aint 21hpop dsmov al,10000000b ;对8255进行设置,PB/PC输出mov dx,p8255+3out dx,alin al,p8259+1 ;8259奇地址中断向量屏蔽mov old_8259,al ;字设置保护原屏蔽字and al,11110111b ;开IRQ3out p8259,alsti ;开中断play:lea bx,led ;led段码mov dl,sec1 ;秒个位mov dh,0mov si,dxmov al,[bx][si]mov dx,p8255+1 ;点亮ledout dx,almov ah,00001110bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,alPUSH CXMOV CX,00f00h ;延时delay1:LOOP delay1POP CXmov ah,00001111bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,almov dl,sec2 ;秒十位mov dh,0mov si,dxmov al,[bx][si]mov dx,p8255+1 ;点亮ledout dx,almov ah,00001101bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,alPUSH CXMOV CX,00f00h ;延时delay2:LOOP delay2POP CXmov ah,00001111bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,almov dl,min1 ;分个位mov dh,0mov si,dxmov al,[bx][si]mov dx,p8255+1 ;点亮ledout dx,almov ah,00001011bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,alPUSH CXMOV CX,00f00h ;延时delay3:LOOP delay3 POP CXmov ah,00001111bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,almov dl,min2 ;分十位mov dh,0mov si,dxmov al,[bx][si]mov dx,p8255+1 ;点亮ledout dx,almov ah,00000111bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,alPUSH CXMOV CX,00f00h ;延时delay4:LOOP delay4POP CXmov ah,00001111bmov al,ahmov dx,p8255+2 ;pc输出选通信号 out dx,aljmp playmov ah,4chint 21hINT_0A proc near ;中断服务子程序 cmp sec1,9jz int1inc sec1jmp exitint1:mov sec1,0inc sec2cmp sec2,6jnz exitmov sec2,0inc min1cmp min1,10jnz exitmov min1,0inc min2cmp min2,6jnz exit mov min2,0 exit:mov al,20h out 20h,al iretINT_0A endp code ends end start五、实验结果:编译运行后,可以看到实验板上7段数码管从0开始计数。

一直记到9999然后清零,实现一个9999以内的十进制计数器。

六、实验心得:经过这次实验,我明白了实验代码的重要性,开始的时候显示的数都是8,但是也有计数,就像是初始电平设的比较高,电平直接加在原来的电平上,只能看见有一点变化,后来改了一下play中的赋值之后,计数就对了。

写代码的时候可以用标号来分段,使得长代码比较容易看懂,代码块之间的功能更加清楚明白。

相关主题