微机原理综合实验报告 目录 一. 8255 并行口实验 二. 8259 中断实验(一) 三. 8253 定时/计数器实验 四. A/D 转换实验 五. 步进电机实验 六. 综合实验:十字路口交通灯实验 七. 实验体会 四.8255 并行口实验 1.实验目的: (1)学习利用并行接口芯片 8255 构成并行接口电路的基本方法 (2)熟悉掌握并行接口芯片 8255 的基本性能及在时间应用中的硬件连接、初始化编程方法 2.实验内容: 编写程序,使 8255 的 PB 口为输出口,PA 口为输入口,从 PA 口将 K0~K7 作为一个字节读入,在从 PB 口输出这一反码字节。 3.实验程序: CODE SEGMENT ASSUME CS:CODE START: MOV DX,21BH ;8255 初始化命令字 MOV AL,90H OUT DX,AL BG: MOV DX,218H ;从 PA 口读入数据 IN AL,DX XOR AL,FFH ;求反 MOV DX,219H OUT DX,AL ;从 PB 口输出 JMP BG CODE ENDS END START 4.实验框图 5. 实验电路图 6.实验方法说明 通过 8255 控制字设定 PA 口为输入口,PB 口为数据输出口,读取 PA 口的数值并通过求反指令将数据取反后,经由 PB 口输出。 8259 中断实验(一) 1.实验目的: (1)了解 PC 机的中断结构及 8259 中断控制器的初始化 (2)熟悉 8259 中断控制器的工作原理和硬件连线方法 (3)了解 8259 的应用和硬件编程方法 了解 8259 中断屏蔽 2.实验内容: 编写中断实验程序,主程序使 8255 的PB口为输出口,输出 0FFH,L0~L7 指示灯全亮,中断服务程序从 PB 口输出0FFH,L0~L3 亮,L4~L7 灭,并延时一段时间后返回主程序。 3.实验程序 INT0 EQU 220h INT1 EQU 221h P8255B EQU 219H P8255K EQU 21BH STACK SEGMENT STA DB 50 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START: CLI MOV AX,TOP MOV SP,AX PUSH DS MOV AX,0000H ;定义 IRQ0 中断 MOV DS,AX MOV AX,OFFSET IRQ0 ADD AX,0000H MOV SI,20H MOV [SI],AX MOV AX,CS MOV SI,22H MOV [SI],AX POP DS MOV AL,13H ;对 8259 进行初始化 ICW1 MOV DX,INT0 OUT DX,AL MOV AL,8 ;对 8259 进行初始化 ICW2 MOV DX,INT1 OUT DX,AL MOV CX,0FFFFH LOOP $ MOV AL,9 ;对 8259 进行初始化 ICW4 MOV DX,INT1 OUT DX,AL MOV CX,0FFFFH LOOP $ MOV DX,INT1 MOV AL,0FEH ;对 8259 进行初始化 OCW1 OUT DX,AL MOV CX,0FFFFH LOOP $ MOV DX,INT0 ;对 8259 进行初始化 OCW2,普通 EOI 返回 MOV AL,20H OUT DX,AL MOV CX,0FFFFH LOOP $ STI MOV DX,P8255K ;对 8255 进行初始化 MOV AL,90H OUT DX,AL DSP: MOV AL,0FFH MOV DX,P8255B OUT DX,AL JMP DSP IRQ0: STI MOV CX,0FFFFH LOOP $ MOV AL,0FH MOV DX,P8255B OUT DX,AL MOV DX,INT0 MOV AL,20H OUT DX,AL MOV CX,0FFFFH LOOP $ MOV CX,0FFFFH LOOP $ IRET CODE ENDS END START 4.实验框图 5. 实验电路图 6. 实验方法说明 主程序使 8255 输出高电平,实现 L0~L7 指示灯全亮。设置中断 IRQ0,实现 L0~L3 亮,L4~L7 灭,并延时一段时间后返回主程序。将中断向量的入口地址写入后,通过对8259 初始化命令字的写入,实现中断的调用。 六.8259 中断实验(二) 1. 实验目的 (1)了解 PC 机的中断结构及 8259 中断控制器的初始化 (2)熟悉 8259 中断控制器的工作原理和硬件连线方法 (3)了解 8259 的应用和硬件编程方法 (4)了解 8259 中断屏蔽,以及优先级的判别等特性 2.实验内容: 编写中断实验程序,主程序使 8255 的 PB 口为输出口,输出 0FFH,L0~L7 指示灯全亮,IR0 中断服务程序从 PB 口输出 0FH,L0~L3 灯亮,L4~L7 灯灭,并延时一段时间后返回主程序。IR1 中断服务程序从 PB 口输出 0F0H,L0~L3 灭,L4~L7 亮,并延时一段时间后返回主程序。 3.实验程序 INT0 EQU 220h INT1 EQU 221h P8255B EQU 219H P8255K EQU 21BH STACK SEGMENT STA DB 50 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START: CLI MOV AX,TOP MOV SP,AX PUSH DS MOV AX,0000H ;设置中断向量 IRQ0 MOV DS,AX MOV AX,OFFSET IRQ0 ADD AX,0000H MOV SI,20H MOV [SI],AX MOV AX,CS MOV SI,22H MOV [SI],AX MOV AX,0000H ;设置中断向量 IRQ1 MOV DS,AX MOV AX,OFFSET IRQ1 ADD AX,0000H MOV SI,24H MOV [SI],AX MOV AX,CS MOV SI,26H MOV [SI],AX POP DS MOV AL,13H ;对 8259 进行初始化 ICW1 MOV DX,INT0 OUT DX,AL MOV AL,8 ;对 8259 进行初始化 ICW2 MOV DX,INT1 OUT DX,AL mov cx,0fffh loop $ MOV AL,9 ;对 8259 进行初始化 ICW4 MOV DX,INT1 OUT DX,AL mov cx,0fffh loop $ MOV DX,INT1 MOV AL,0FCH ;对 8259 进行初始化 OCW1 OUT DX,AL mov cx,0fffh loop $ MOV DX,INT0 MOV AL,20H ; 普通 EOI 返回 OUT DX,AL mov cx,0fffh loop $ STI MOV DX,P8255K ;对 8255 进行初始化 MOV AL,90H OUT DX,AL DSP: MOV AL,0FFH MOV DX,P8255B OUT DX,AL JMP DSP IRQ0: STI MOV CX,0FFFFH LOOP $ MOV AL,0FH MOV DX,P8255B OUT DX,AL MOV DX,INT0 MOV AL,20H OUT DX,AL mov cx,0FFFFH LOOP $ mov cx,0FFFFH LOOP $ IRET IRQ1: STI mov cx,0FFFFH LOOP $ MOV AL,0F0H MOV DXP8255B OUT DX,AL MOV DX,INT0 MOV AL,20H OUT DX,AL mov cx,0FFFFH LOOP $ mov cx,0FFFFH LOOP $ IRET code ends end start 4.实验框图 5. 实验电路图 6. 实验方法说明 主程序使 8255 输出高电平,实现 L0~L7 指示灯全亮。设置中断 IRQ0,实现 L0~L3 亮,L4~L7 灭,并延时一段时间后返回主程序。设置中断 IRQ1,实现 L0~L3 灭,L4~L7亮,并延时一段时间后返回主程序。将中断向量的入口地址写入后,通过对 8259 初始化命令字的写入,使 8259 工作在全嵌套方式下,中断优先级 IRQ0 大于 IRQ1,这样通过 8259对中断的判断来实现中断的响应。 七.8253 定时/计数器实验 1.实验目的: (1)了解定时器 8253 的初始化及用法 (2)会用逻辑笔或示波器观察 8253 的工作状态 2 实验内容: 编写程序,使 8253 工作的定时/计时器 2 工作在方式 3 下 3.实验程序: TIM_CTL EQU 203H TIMER0 EQU 200H TIMER1 EQU 201H TIMER2 EQU 202H MODE23 EQU 0B6H MODE13 EQU 76H CODE SEGMENT ASSUME CS:CODE START: TT: CLI MOV DX,TIM_CTL ;初始化 8253 MOV AL,MODE23 OUT DX,AL MOV DX,TIMER2 ;先写低 8 位 MOV AL,0FFh OUT DX,AL MOV AL,0FFh ;后写低 8 位 OUT DX,AL WT: JMP WT CODE ENDS END START 4.实验框图 5.实验电路 6.实验方法说明 设置 8253 计时器工作在方式 2 实现分频器功能,将实验箱上的频率 Q0 经行 65535 分频,再由 OUT 口输出接到逻辑笔,观察逻辑笔的变化。 八.A/D 转换实验 1.实验目的: (1)了解模/数转换的工作原理 (2)掌握 0809 的使用方法 2.实验内容: 编写程序,用 0809 的 IN0 通道采集数据并在数码管上显示 3.实验程序 B8279 EQU 212H D8279 EQU 210H LED0 EQU 00 LED1 EQU 38H DATA SEGMENT LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H DB 5EH,79H,71H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV DX,B8279 ;对 8279 进行初始化 MOV AL,0D0H OUT DX,AL MOV CX,0FFFFH LOOP $ MOV DX,B8279 MOV AL,LED0 OUT DX,AL MOV AL,LED1 OUT DX,AL MOV DX,B8279 MOV AL,95H OUT DX,AL MOV DX,D8279 ;数码管显示 MOV AL,40H OUT DX,AL MOV DX,D8279 MOV AL,5eH OUT DX,AL MOV DX,D8279 MOV AL,77H OUT DX,AL TT: MOV DX,230H ;选通 IN0 通道 OUT DX,AL MOV CX,0FFFFH LOOP $ MOV DX,B8279 MOV AL,83H OUT DX,AL MOV DX,230H IN AL,DX AND AL,0FH LEA BX,LED XLAT MOV DX,D8279 OUT DX,AL MOV DX,B8279 MOV AL,84H OUT DX,AL MOV DX,230H IN AL,DX MOV CL,4H ROR AL,CL AND AL,0FH LEA BX,LED XLAT MOV DX,D8279 OUT DX,AL JMP TT CODE ENDS END START 4.实验框图 5.实验电路图 6.实验方法说明 通过 A/D 转换接口芯片 0809 实现模拟量到数据量的转变,并通过键盘显示芯片 8279 将转换后的数据量显示出来。 步进电机实验 1.实验目的: (1)了解步进电机的工作原理,以及脉冲分配概念 (2)掌握计算机控制步进电机的方法 2.实验内容 编写程序,通过 8255 控制步进电机的旋转 3.实验程序 CODE SEGMENT ASSUME CS:CODE START: MOV DX,21BH ;8255 初始化 MOV AL,90H OUT DX,AL BG: MOV DX,218H IN AL,DX CMP AL,01H JNZ C2 MOV BX,0FFFFH JMP WORK C2: CMP AL,02H JNZ C4 MOV BX,07FFFH JMP WORK C4: CMP AL,04H JNZ C8 MOV BX,0FFFH JMP WORK C8: CMP AL,08H JNZ CC MOV BX,07FFH JMP WORK CC: MOV AL,00H MOV DX,219H OUT DX,AL JMP BG WORK: MOV AL,01H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,03H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,02H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,06H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,04H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,0CH MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,08H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ MOV AL,09H MOV DX,219H OUT DX,AL MOV CX,BX LOOP $ JMP BG CODE ENDS END START 4.实验框图 5.实验电路图 6.实验方法说明 初始化 8255 使 PA 口为输入口,PB 口为输出口,通过 判别 PA 口的数据来使步进电机工作在不同的状态。步进电机的旋转由 OUT 指令控制,实现步进电机按照预定指令旋转。 十.综合实验:十字路口交通灯实验 1.实验要求: (1)正常情况下,红灯、绿灯 5~10 秒定时变化 (2)分别设置南北行人中断按钮和东西行人中断按钮,当行人过马路是绿灯亮并延时 5 秒 (3)设置紧急开关,当按下开关时所以路口的信号灯全为红色 2.发挥部分: (1)红灯和绿灯转换之间设置黄灯,并且黄灯闪烁 3 次 (2)紧急红灯按下时发出警报声 3.实验电路图 4.实验框图 5.实验程序 P8255A EQU 218H ;8255 连接端口定义 P8255B EQU 219H P8255C EQU 21AH P8255K EQU 21BH TIM_CTL EQU 203H ;8253 连接端口定义 TIMER0 EQU 200H TIMER1 EQU 201H INT0 EQU 220H ;8259 连接端口定义 INT1 EQU 221H MDAC EQU 228H ;0832 连接端口定义 ;''''''''''''''''''''''' STACK SEGMENT STACK STA DB 50 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START: CLI MOV AX,TOP MOV SP,AX PUSH DS MOV AX,0000H ;定义中断向量 IRQ0 MOV DS,AX MOV AX,OFFSET IRQ0 ADD AX,0000H MOV SI,20H MOV [SI],AX MOV AX,CS MOV SI,22H MOV [SI],AX ;''''''''''''''''''''''''''' MOV AX,0000H ;定义中断向量 IRQ1 MOV DS,AX MOV AX,OFFSET IRQ1 ADD AX,0000H MOV SI,24H MOV [SI],AX MOV AX,CS MOV SI,26H MOV [SI],AX ;............................ MOV AX,0000H ;定义中断向量 IRQ2 MOV DS,AX MOV AX,OFFSET IRQ2 ADD AX,0000H MOV SI,28H MOV [SI],AX MOV AX,CS MOV SI,2AH MOV [SI],AX POP DS ;............................ MOV DX,TIM_CTL ;计数器 0 工作在方式 1 构成单稳态触发器 MOV AL,00100010B OUT DX,AL MOV DX,TIMER0 MOV AL,0F0H ;只写低 8 位 OUT DX,AL MOV DX,TIM_CTL MOV AL,01110110B ;计数器 1 工作在方式 3 构成方波发生器 OUT DX,AL MOV DX,TIMER1 MOV AL,0FFH ;写低 8 位 OUT DX,AL MOV AL,0FFH ;写高 8 位 OUT DX,AL ;............................ MOV AL,13H ;初始化 ICW1,沿触发且需要 ICW4 MOV DX,INT0 OUT DX,AL MOV CX,0FFFH LOOP $ MOV AL,8 ;初始化 ICW2,自定义 8 号中断 MOV DX,INT1 OUT DX,AL MOV CX,0FFFH LOOP $ MOV AL,9 ;初始化 ICW3,自定义 9 号中断 MOV DX,INT1 OUT DX,AL MOV CX,0FFFH LOOP $ MOV AL,10 ;初始化 ICW2,自定义 10 号中断 MOV DX,INT1 OUT DX,AL MOV CX,0FFFH LOOP $ MOV DX,INT1 ;设置命令字 OCW1,只响应 IR0、IR1、 IR2 引脚中断请求 MOV AL,0F8H OUT DX,AL MOV CX,0FFFH LOOP $ MOV DX,INT0 ;设置命令字 OCW2,普通 EOI 命令 MOV AL,20H OUT DX,AL MOV CX,0FFFH LOOP $ STI ;''''''''''''''''''''''''''''' MOV DX,P8255K ;8255 初始化, B 口输出接 LS240 MOV AL,10000001B OUT DX,AL ;''''''''''''''''''''''''''''' STATE1: MOV DX,P8255B ;东西红,南北绿 MOV AL,01011010B OUT DX,AL MOV CX,10 ;计时 10 秒 S1: CALL DELAY LOOP S1 STATE2: MOV DX,P8255B ;东西绿,南北黄 MOV AL,00000101B OUT DX,AL CALL SHANSHUO STATE3: MOV DX,P8255B ;东西绿,南北红 MOV AL,10100101B OUT DX,AL MOV CX,10 ;计时 10 秒 S3: CALL DELAY LOOP S3 STATE4: MOV DX,P8255B ;东西黄,南北绿 MOV AL,00001010B OUT DX,AL MOV CX,3 CALL SHANSHUO JMP STATE1 ;循环到状态 STATE1,即东西红,南北绿 ;**----------------------------------------------------** DELAY PROC ;延时子程序 1,交通灯持续时间 PUSH CX PUSH DX MOV DX,20 DL500: MOV CX,2801 DL10ms: LOOP DL10ms DEC DX JNZ DL500 POP DX POP CX RET DELAY ENDP ;**----------------------------------------------------** HALF_DELAY PROC ;延时子程序 2,黄灯闪烁时间 PUSH AX PUSH CX MOV AX,2 DELAY1: MOV CX,50000 DELAY2: LOOP DELAY2 DEC AX JNZ DELAY1 POP CX POP AX RET HALF_DELAY ENDP ;**----------------------------------------------------** SHANSHUO PROC ;黄灯闪烁子程序 PUSH AX PUSH DX PUSH CX MOV CX,6 ZAIYICI: MOV DX,P8255B IN AL,DX CMP AL,00000101B JZ FLITTER1 CMP AL,10101111B JZ FLITTER1 CMP AL,00001010B JZ FLITTER2 CMP AL,01011111B JZ FLITTER2 FLITTER1: CMP AL,00000101B JZ MIE1 MOV AL,00000101B OUT DX,AL CALL HALF_DELAY JMP HUI1 MIE1: MOV AL,10101111B OUT DX,AL CALL HALF_DELAY HUI1: DEC CX JNZ ZAIYICI JMP FANHUI FLITTER2: CMP AL,00001010B JZ MIE2 MOV AL,00001010B OUT DX,AL CALL HALF_DELAY JMP HUI2 MIE2: MOV AL,01011111B OUT DX,AL CALL HALF_DELAY JMP HUI2 HUI2: DEC CX JNZ ZAIYICI JMP FANHUI FANHUI: POP CX POP DX POP AX RET SHANSHUO ENDP ;**----------------------------------------------------** WAVE PROC ;紧急事件呼叫子程序 PUSH AX PUSH DX PUSH CX MOV DX,MDAC MOV AL,00H MOV CX,1000 NEXT: OUT DX,AL DEC AL LOOP NEXT JIESHU: MOV DX,MDAC MOV AL,00H OUT DX,AL POP CX POP DX POP AX RET WAVE ENDP ;**----------------------------------------------------** IRQ0: PUSH AX ;紧急事件中断请求 PUSH DX PUSH CX STI MOV CX,0FFFFH LOOP $ CALL WAVE MOV AL,11110000B MOV CX,5 OOO: CALL DELAY LOOP OOO MOV DX,INT0 MOV AL,20H OUT DX,AL MOV CX,0FFFFH LOOP $ MOV CX,0FFFFH LOOP $ POP CX POP DX POP AX IRET ;**----------------------------------------------------** IRQ1: PUSH AX ;南北路口行人中断请求 PUSH DX PUSH CX STI MOV CX,0FFFFH LOOP $ MOV DX,P8255B IN AL,DX TEST AL,01011010B JNZ WUXIAO1 CALL DELAY ;若南北红灯、东西绿灯,则延时 1s 后变为 南北绿灯、东西红灯并持续 4s MOV AL,01011010B MOV DX,P8255B OUT DX,AL MOV CX,4 PPP: CALL DELAY LOOP PPP WUXIAO1: MOV DX,INT0 MOV AL,20H OUT DX,AL MOV CX,0FFFFH LOOP $ MOV CX,0FFFFH LOOP $ POP CX POP DX POP AX IRET ;**----------------------------------------------------** IRQ2: PUSH AX ;东西路口行人中断请求 PUSH DX PUSH CX STI MOV CX,0FFFFH LOOP $ MOV DX,P8255B IN AL,DX TEST AL,10100101B JNZ WUXIAO2 CALL DELAY ;若南北绿灯、东西红灯,则延时 3s 后变为南北红灯、东西绿灯并持续 5s MOV AL,10100101B MOV DX,P8255B OUT DX,AL MOV CX,4 QQQ: CALL DELAY LOOP QQQ WUXIAO2: MOV DX,INT0 MOV AL,20H OUT DX,AL MOV CX,0FFFFH LOOP $ MOV CX,0FFFFH LOOP POP CX POP DX POP AX IRET ;**----------------------------------------------------** CODE ENDS END START 6.实验设计思想说明 根据设计要求,主程序中循环执行交通灯的正常工作状态,设置 8255 为 B 口输出驱动 LM240。采用软件延时,红绿灯持续时间为 10 秒种,黄灯为过渡信号灯,并每隔 0.5 秒闪烁,闪烁 4 次,共持续 2 秒。设置三个中断源,分别为紧急事件中断,南北行人中断和东西行人中断,优先级依次递减。三个中断采用 8259 控制,其中紧急事件中断由计时器8253 产生,南北行人中断和东西行人中断由单脉冲触发按键产生。当出现紧急事件时,通过 0832 进行 D/A 变换产生锯齿波驱动喇叭发出警报。 7.设计过程中遇到的问题及解决方案 (1)紧急事件中断进不去 我在设计过程中是从易到难来设计的,就是说先设计一些基本功能,然后在逐渐添加新的功能。在开始设置的两个行人中断工作以后,我又加入了紧急事件中断,但是在调试过程中,无法进入行人中断。我反复地检查中断服务程序和硬件电路的连接没有发现任何问题。最后当我检查 8259 的初始化程序部分发现控制命令字 OCW1 我没有改动,而在之前的设计中,我设定其只响应 IR0 和 IR1 引脚上的中断请求,这样的话就无论如何也不能响应我设定在 IR2 引脚上的中断请求了,因此我重新改写一下 OCW1 控制命令字,问题就解决了。 (2)8253 产生的方波频率过快,导致信号灯不能持续发光 在初始设计阶段,我打算用 8253 来对信号灯的发光时间进行计时,但无论我怎样设置分频数值,8253 的输出频率还是太高,导致 LM240 不能够持续发光。因此,我选择了用软件延时的方式来控制信号的灯的放光时间,而用 8253 来执行紧急红灯中断的延时。