合肥工业大学微机原理课程设计报告.doc
合肥工业大学计算机与信息学院课程设计课 程:微机原理与接口技术设计专业班级:信息安全13-1班学 号:姓 名: 马骏一、设计题目及要求:利用 8259A中断,实现对8253多种计数初值的设定。设计要求:1. 在中断服务程序中设定8253的计数初值。2. 开关K1用于设定0.5秒方波的计数初值,K2用于设定1秒方波的计数初值,K3用于设定2秒方波的计数初值。3. 用8253的输出信号,控制一个发光二极管,以演示修改效果。二、设计思想: 使用8259芯片控制中断,在中断程序中对8253芯片初始化实现输出不同频率的方波,并且在中断程序中修改数码管缓存区的编码,以及控制8255输出频率的缓存区数值。三、功能流程图:四、 结果讨论:在试验开始时我们首先学会了如何连接试验箱及软件,如何下载程序,运行调试。我们还遇到8253芯片的cs无法和试验箱的5v电压相连的问题,通过请教老师知道连接试验箱的vcc接口处也是可以的。在需要知道138译码器为8259和8253分配地址时通过请教老师,我们知道了计算方法。我们还发现在试验中无法多次触发中断,一般中断两三次便不再响应中断,在老师的指导下我们在主循环中加入了数码管显示,在中断中修改数码管显示字符的编码,并且在数码管显示前首先关中断,在数码管显示,及8255输出之后开中断。但我们发现如果数码管显示和8255输出的延时过大时会出现抓不到中断的情况,于是我们适当调小延时,最后完美的解决了这一问题。附录:实验代码:CODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODEORG 3400HZXK EQU 0FFDCH ;显示管地址ZWK EQU 0FFDDHLED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;无用 DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3HBUF DB ?,?,?,?,?,? ;没用到的缓冲区PA EQU 0FFD8HPB EQU 0FFD9HPC EQU 0FFDAHPCTL EQU 0FFDBHLedBuf db 6 dup(?) ;显示缓冲OUTSEG equ 0ffdch ;显示管地址OUTBIT equ 0ffddhIN_KEY equ 0ffdeh ;没用到的键盘地址Port0 EQU 0FFE0H ;8259芯片的端口号 A0=0Port1 EQU 0FFE1H ;A0=1START:CALL F8259 ;8259初始化CALL F8255P0: CLI ;关中断MOV AX,OFFSET INT0 ;将中断程序地址装入中断向量表MOV BX,0020H ;08号中断 K1 IRQ0 中断地址MOV BX,AXMOV BX,0022H ;固定格式MOV AX,0000HMOV BX,AXSTI ;开中断P1: CLIMOV AX,OFFSET INT1MOV BX,0024H ;09号中断地址 K2 IRQ1MOV BX,AXMOV BX,0026HMOV AX,0000HMOV BX,AX;CALL F8259STIP2: CLIMOV AX,OFFSET INT2MOV BX,0028HMOV BX,AXMOV BX,002AHMOV AX,0000HMOV BX,AX; CALL F8259STICALL WP ;初始化显示“GOOD” ;循环程序运行P: CLI ; CALL DIS CALL PMARK call Disp ;显示函数 将缓冲区的编码输出到显像管地址 STI NOP ;时间停顿 NOP NOP NOP NOP NOP NOPJMP P;-F8255: MOV DX,PCTL MOV AL,90H OUT DX,AL RET;-PMARK: CLI mov dx,pb MOV AL,RUNLED ROL AL,01H MOV RUNLED,AL OUT DX,AL mov cx,RUNDELdelay2: nop CALL DISP loop delay2 STI RET;-F8259: MOV AL,1BH ;8259的初始化 icw1电平触发 调用间隔8 单片方式需要写入ICW4MOV DX,Port0OUT DX,AL ;输出到8259端口MOV AL,08H ; icw2 IRQ0 K1中断号08H IRQ1 K2 中断号09H .MOV DX,Port1OUT DX,ALMOV AL,01H ; icw4 非特殊完全嵌套 非缓冲 非自动结束 8086/8088模式OUT DX,ALMOV AL,0F8H ;屏蔽只留IR0,IR1,IR2。OCW1 从右向左每一位代表一个中断 屏蔽哪一位哪一位设为1OUT DX,ALRET;-INT0: CLICALL FB0STIMOV DX,Port0 ;8259端口地址MOV RUNDEL,10H;MOV AL,20HOUT DX,AL ;输出到8259 提示中断结束IRETINT1: CLICALL FB1STIMOV DX,Port0MOV RUNDEL,20H;MOV AL,20HOUT DX,ALIRETINT2: CLICALL FB2MOV DX,Port0MOV RUNDEL,30H;MOV AL,20HOUT DX,ALSTIIRET;-FB0: MOV DX,0FFEBH ;8253端口地址 8253初始化MOV AL,B ;控制字 计数器0 先低后高 方式三 二进制计数OUT DX,AL ;输出到8253端口MOV AL,10HMOV DX,0FFE8H ;第一个端口减3OUT DX,ALMOV AL,27H ;计数初值2710H 4.91MHZ T7OUT DX,ALcall WP1RET;-FB1:MOV DX,0FFEBHMOV AL,BOUT DX,ALMOV AL,20HMOV DX,0FFE8HOUT DX,ALMOV AL,4EH ;计数初值4E20HOUT DX,ALCALL WP2RETFB2: MOV DX,0FFEBHMOV AL,BOUT DX,ALMOV AL,40HMOV DX,0FFE8HOUT DX,ALMOV AL,9cH ;计数初值9c40HOUT DX,ALCALL WP3RET;-WP: ;向缓冲区写入待输出到显像管的编码 显示"Good" mov LedBuf+0,0c2h ;第一个显像管的编码G mov LedBuf+1,0a3h ;O mov LedBuf+2,0a3h ;O mov LedBuf+3,0a1h ;D mov LedBuf+4,0ffh ;不显示 mov LedBuf+5,0FFh ;不显示 RET ;函数返回;-;-WP1: mov LedBuf+0,0A4h ;显示"" mov LedBuf+1,0C0h mov LedBuf+2,0F9h mov LedBuf+3,0B0h mov LedBuf+4,82h mov LedBuf+5,90h RET;-;-WP2: ; MOV BUF,02H ;初始化显示“P.” ;MOV BUF+1,00H ; MOV BUF+2,01H ;MOV BUF+3,04H ;MOV BUF+4,01H ;MOV BUF+5,01H mov LedBuf+0,0A4h ;显示"" mov LedBuf+1,0C0h mov LedBuf+2,0F9h mov LedBuf+3,0B0h mov LedBuf+4,0F9h mov LedBuf+5,0F9h RET;-;-WP3: ; MOV BUF,02H ;初始化显示“P.” ;MOV BUF+1,00H ;MOV BUF+2,01H ;MOV BUF+3,05H ;MOV BUF+4,01H ;MOV BUF+5,01H mov LedBuf+0,0A4h ;显示"" mov LedBuf+1,0C0h mov LedBuf+2,0F9h mov LedBuf+3,0B0h mov LedBuf+4,0A4h mov LedBuf+5,0A4h RET;-Disp: PUSH CX mov bx,offset LEDBuf ;得到缓冲区的地址 mov cl,6 ;共6个八段管 循环计数 mov ah,b ;从左边开始显示DLoop: mov dx,OUTBIT ;显像管地址 mov al,0 ;关显示管代码 out dx,al ;关所有八段管 mov al,bx ;得到缓冲区地址 mov dx,OUTSEG out dx,al mov dx,OUTBIT mov al,ah out dx,al ;显示一位八段管 push ax mov ah,1 call Delay1 pop ax shr ah,1 inc bx dec cl jnz DLoop mov dx,OUTBIT mov al,0 out dx,al ;关所有八段管 POP CX retDelay1: ;延时子程序 push cx mov cx,256 loop $ pop cx ret ORG 5000HRUNLED DB 01H ;跑马灯初始值RUNDEL DW 05HDONE:CODE ENDSEND START