第一篇:北京交通大学微机原理实验报告(yuan)
微机原理
实 验 报 告
隋伟 08212013 自动化0801
目 录
一、I/O地址译码与交通灯控制实验……………………………………3
二、可编程定时器/计数器(8253)……………………………………6
三、中断实验(纯DOS)………………………………………………11
四、模/数转换器…………………………………………………………18
五、串行通讯 ……………………………………………………………16
六、课程综合实验(抢答器)……………………………………………28
七、自主设计实验——LED显示………………………………………32
八、参考文献……………………………………………………………35
一、I/O地址译码与交通灯控制实验
一.实验目的
通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。
二.实验内容
如图5-3,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通灯变化规律燃灭。
十字路口交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮3秒左右。(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。(3)南北路口的红灯、东西路口的绿灯同时亮3秒左右。(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。(5)转(1)重复。
8255动态分配地址: 控制寄存器: 0C40BH
A口地址: 0C408H C口地址: 0C40AH
三.程序流程图和程序清单
DATA SEGMENT X DB ? DATA ENDS
STACK1 SEGMENT STACK DW 100H DUP(0)STACK1 ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA
MOV DS,AX MOV DX,0EC0BH
;写控制字;---------------INIT----------------
MOV AL,80H OUT DX,AL
L3: MOV DX,0EC0AH
CALL DELAY CALL DELAY;长延时,3s左右 MOV AL,24H OUT DX,AL;南北绿灯,东西红灯亮
CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY
MOV BL,8 MOV AL,04H L0: XOR AL,40H;南北黄灯闪,东西红灯亮
MOV AL,81H OUT DX,AL;南北红灯亮,东西绿灯亮 CALL DELAY OUT DX,AL CALL DELAY;延时
CALL DELAY DEC BL;闪烁几次 JNZ L0
CALL DELAY CALL DELAY CALL DELAY;长延时,3s左右
CALL DELAY CALL DELAY CALL DELAY CALL DELAY
MOV BL,9 MOV AL,80H L1: XOR AL,02H;南北红灯亮,东西黄灯闪
OUT DX,AL CALL DELAY DEC BL;延时
CALL DELAY JNZ L1;闪烁几次
CALL DELAY
;------------------------------
;-----------延时函数------------DELAY : PUSH CX PUSH DX MOV CX,1FFFH LOP1: MOV DX,0FFFFH LOP2: DEC DX
LOOP LOP1 POP DX POP CX RET JNZ LOP2 MOV AH,4CH INT 21H MOV DL,0FFH MOV AH,06H INT 21H JZ L3;六号功能判断若无字符输入ZF=1继续循环
CODE ENDS END START
四.实验遇到的问题和解决方法
问题:绿灯灭后黄灯没有出现闪烁的效果,一直保持常亮
解决方法:修改程序,通过利用异或和循环指令使绿灯灭、红灯亮后,黄灯口的状态从0到1循环变换,并通过调用延迟子程序,从而实现人眼可辨的黄灯闪的效果。
二、可编程定时时钟/计数器(8253)
一、实验目的
掌握8253的基本工作原理和编程方法。
二、实验内容
1. 按图5-1虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
图 5-1
2. 按图5-2连接电图,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。
图5-2 三.实验原理
8253具有3个独立的计数通道,采用减1计数方式。在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。当计数脉冲是已知周期的时钟信号时,计数就成为定时。作计数器时,要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。
8253中各通道可有6种可供选择的工作方式,以完成定时、计数或脉冲发生器等多种功能。本实验用到的是方式0—计数结束中断。在写入计数值N之后的第一个CLK的下降沿将N装入计数执行单元,待下一个CLK的下降沿到来且门控信号GATE为高电平时,通道开始启动计数。在计数过程中,OUT一直保持低电平,直到计数达“0”时,OUT输出由低电平变为高电平,并且保持高电平。8253动态分配地址: 控制寄存器: 0C403H
计数器0地址: 0C400H 计数器1地址: 0C401H
四.程序流程图和程序清单 1)DATA SEGMENT N EQU 0BH CHL
STACK1 SEGMENT STACK DW 100 DUP(0)STACK1 ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX;--------------INIT----------------
L0:;MOV AL,0;计数器初值,不大于0FH DB 0AH,0DH,'$';换行
DATA ENDS MOV DX,0C403H MOV AL,10H OUT DX,AL MOV DX,0C400H MOV AL,N;控制寄存器地址
;计数器0,低字节,方式0,二进制计数;写入控制字
OUT DX,AL;写入计数初值 MOV CL,N;计数器0锁存
;MOV DX,IO8253;OUT DX,AL MOV DX,0C400H IN AL,DX CMP AL,CL JNE L0 DEC CL MOV DL,AL;若AL不等于CL,则继续到L0循环;更改CL值
;读取当前数值
CMP DL,09H;是0~9吗? JLE ASCI ADD DL,07H;是A~F MOV AH,02H;单字符输出计数器当前值 INT 21H MOV DX,OFFSET CHL MOV AH,09H INT 21H
;输出字符串换行 ASCI: ADD DL,30H
CMP CL,0 JNL L0;CL不小于0时,继续循环
;------------------------------
MOV AH,4CH INT 21H END START CODE ENDS
2)
DATA SEGMENT X DB ? DATA ENDS
STACK1 SEGMENT STACK DW 100H DUP(0)STACK1 ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV AL,36H MOV DX,0C403H;写计数器0控制字 OUT DX,AL MOV AX,1000;写计数器0初值 MOV DX,0C400H OUT DX,AL;先写低字节后写高字节 MOV AL,AH OUT DX,AL;----------------MOV AL,76H MOV DX,0C403H OUT DX,AL;写计数器1控制字 MOV AX,1000;写计数器0初值 MOV DX,0C401H OUT DX,AL MOV AL,AH;先写低字节后写高字节 OUT DX,AL CODE ENDS END START
五.实验遇到的问题和解决方案 问题:计数初值没有显示出来
解决方法:进行TD调试,发现逻辑上出现了问题。修改程序,通过利用CMP AL,CL
JNZ L0来实现将所有的计数值都显示出来。
三、中断实验(纯DOS)
一、实验目的
1、掌握PC机中断处理系统的基本原理。
2、学会编写中断服务程序。
二、实验原理与内容
1、实验原理
PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源: 中断源 中断类型号 中断功能
IRQ0 08H 时钟
IRQ1 09H 键盘
IRQ2 0AH 保留
IRQ3 OBH 串行口2 IRQ4 0CH 串行口1 IRQ5 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 保留
PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。
2、实验内容
实验电路如图31,直接用手动产单脉冲作为中断请求信号(只需连接一根导线)。要求每按一次开关产生一次中断,在屏幕上显示一次“TPC pci card Interrupt”,中断10次后程序退出。
三、编程提示
1.由于9054的驱动程序影响直写9054芯片的控制寄存器,中断实验需要在纯DOS的环境中才能正常运行。这里指的纯DOS环境是指微机启动时按F8键进入的DOS环境。WINDOWS重启进入MSDOS方式由于系统资源被重新规划过,所以也不能正常实验。
2.由于TPC卡使用PCI总线,所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置,获取方法请参看汇编程序使用方法的介绍。(也可使用自动获取资源分配的程序取得中断号)
3.在纯DOS环境下,有些微机的BIOS设置中有将资源保留给ISA总线使用的选项,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就
无法做实验,这时需要将此选项修改为使用即插即用。
4.在纯DOS环境下,有些微机的BIOS设置中有使用即插即用操作系统的选项,如果在使用即插即用操作系统状态下,BIOS将不会给TPC卡分配系统资源,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就无法做实验,这时需要将此选项修改为不使用即插即用操作系统。
5.由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能,代码如下:
mov dx,ioport_cent+68h;设置 tpc 卡中9054芯片io口,使能中断
in ax,dx or ax,0900h out dx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址,每台微机可能都不同,编程时需要了解当前的微机使用哪段并进行设置,获取方法请参看本书结尾部分的介绍。(也可使用自动获取资源分配的程序取得),+68H的偏移是关于中断使能的寄存器地址,设置含义如下:
程序退出前还要关闭9054的中断,代码如下:
mov dx,ioport_cent+68h;设置 tpc 卡中9054芯片io口,关闭中断
in ax,dx
and ax,0f7ffh out dx,ax
6.PC机中断控制器8259 的地址为20H、21H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结束命令:
MOV AL,20H OUT 20H,AL
中断结束返回DOS时应将IMR对应位置1,以关闭中断。
四、参考流程图
五、参考程序 程序名:INT.ASM;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
data segment
int_vect EQU 071H;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h 55
irq_mask_2_7 equ 011111011b;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零
irq_mask_9_15 equ 011111101b;中断0-7时全一,中断8-15时从低至高相应位为零
ioport_cent equ 0d800h;tpc 卡中9054芯片的io地址
csreg dw ?
ipreg dw ?;旧中断向量保存空间
irq_times dw 00h;中断计数
msg1 db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$' msg2 db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$'
msg3 db 0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$' data ends
stacks segment db 100 dup(?)stacks ends code segment
assume cs:code,ds:data,ss:stacks,es:data start:
;Enable Local Interrupt Input.386 cli
mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax
mov dx,ioport_cent+68h;设置 tpc 卡中9054芯片io口,使能中断
in ax,dx or ax,0900h out dx,ax
mov al,int_vect;保存原中断向量
mov ah,35h int 21h mov ax,es mov csreg,ax mov ipreg,bx
mov ax,cs;设置新中断向量 56
mov ds,ax
mov dx,offset int_proc mov al,int_vect mov ah,25h int 21h
in al, 21h;设置中断掩码
and al, irq_mask_2_7 out 21h, al in al, 0a1h
and al, irq_mask_9_15 out 0a1h, al mov ax,data mov ds,ax
mov dx,offset msg2 mov ah,09h int 21h
mov dx,offset msg3 mov ah,09h int 21h
mov irq_times,0ah sti loop1:
cmp irq_times,0;等待中断并判断中断10次后退出
jz exit mov ah,1 int 16h
jnz exit;按任意键退出
jmp loop1 exit: cli
mov bl, irq_mask_2_7;恢复中断掩码
not bl in al, 21h or al, bl out 21h, al
mov bl, irq_mask_9_15 not bl in al, 0a1h 57
or al, bl out 0a1h, al
mov dx,ipreg;恢复原中断向量
mov ax,csreg mov ds,ax mov ah,25h mov al,int_vect int 21h
mov dx,ioport_cent+68h;设置 tpc 卡中9054芯片io口,关闭中断
in ax,dx
and ax,0f7ffh out dx,ax mov ax,4c00h int 21h
int_proc proc far;中断处理程序
cli
push ax push dx push ds
dec irq_times
mov ax,data;Interrupt to do mov ds,ax
mov dx,offset msg1 mov ah,09h int 21h
mov al,20h;Send EOI out 0a0h,al out 20h,al pop ds pop dx pop ax sti iret
int_proc endp code ends
四、模/数转换器
一、实验目的
了解模/数转换的基本原理,掌握ADC0809的使用方法。
二、实验内容
1、实验电路原理图如图38。通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。
启动IN0开始转换: Out 0298 0 读取转换结果: In 0298
2、编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。
3、将JP3的1、2短接,使IN2处于双极性工作方式,并给IN1输入一个低频交流信号(幅度为±5V),编程采集这个信号数据并在屏幕上显示波形。
三、实验提示
1、ADC0809的IN0口地址为298H,IN1口地址为299H。
2、IN0单极性输入电压与转换后数字的关系为:
其中Ui为输入电压,UREF为参考电压,这里的参考电压为PC机的+5V电源。
3、一次A/D转换的程序可以为
MOV DX,口地址
OUT DX,AL ;启动转换
;延时
IN AL,DX ;读取转换结果放在AL中
四、参考流程图
五、参考程序1:AD_1.ASM ioport equ 0d400h-0280h io0809a equ ioport+298h code segment assume cs:code
start:mov dx,io0809a;启动A/D转换器
out dx,al
mov cx,0ffh;延时
delay:loop delay
in al,dx;从A/D转换器输入数据
mov bl,al;将AL保存到BL mov cl,4
shr al,cl;将AL右移四位
call disp;调显示子程序显示其高四位
mov al,bl and al,0fh
call disp;调显示子程序显示其低四位
mov ah,02
mov dl,20h;加回车符
int 21h mov dl,20h int 21h
push dx
mov ah,06h;判断是否有键按下
mov dl,0ffh int 21h pop dx
je start;若没有转START mov ah,4ch;退出
int 21h
disp proc near;显示子程序
mov dl,al
cmp dl,9;比较DL是否>9
jle ddd;若不大于则为'0'-'9',加30h为其ASCII码
add dl,7;否则为'A'-'F',再加7 ddd: add dl,30h;显示
mov ah,02 int 21h ret
disp endp code ends end start
五、串行通讯
一、实验目的
1、进一步了解串行通信的基本原理。
2、掌握串行接口芯片8250的工作原理和编程方法。
3、熟悉PC机串行口的基本连接方法
二、实验内容
1、PC机RS-232串口自发自收。
按照PC机串口自发自收的连接方法连线。编写PC机自发自收串行通信程序,要求:从键盘输入一个字符,将字符通过串口发送出去,再由此串口将字符接收回来并在屏幕上显示,实现自发自收。
2、两台PC机间RS-232串口通信。
按照PC机RS-232串口直接互连的方法连接两台PC机。编写PC机直接互连串行通信程序;要求:由甲机键盘键入字符经串口发送给乙机,再由乙机通过串口接收字符并显示在屏幕上。当键入感叹号“!”,结束收发过程。三.实验原理
1)本实验为异步通信:以字符为单位进行传送,每传送一个字符,以起始位作为开始标志,以停止位作为结束标志。
异步串行通信的工作过程是:传送开始后,接收设备不断地检测传输线是否有起始位到来,当接收到一系列的“1”(空闲或停止位)之后,检测到第一个“0”,说明起始位出现,就开始接收所规定的数据位、奇偶校验位及停止位。经过接收器处理,将停止位去掉,把数据位拼装成一字节数据,并且经奇偶校验无错误,才算是正确地接收到了一个字符。当一个字符接收完毕,接收设备又继续测试传输线,监视“0”电平的到来(下一个字符的开始),直到全部数据接收完毕。
帧 Dn„D0 D1 数据位 起 空闲位 始 位 奇 偶 校验位 停 止 位 空闲位
2)8250各部分功能说明
8250片内有10个寄存器,其中有几个是共用地址的,其识别由线路控制寄存器(LCR)的最高位DLAB来决定。各寄存器的地址和格式如下所示:.3)数据发送和接收:
四.程序清单 1.自发自收
DATA SEGMENT CHL
STACK1 SEGMENT STACK DW 100 DUP(0)STACK1 ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX;--------------INIT----------------DB 0AH,0DH,'$';换行字符串
DATA ENDS
MOV DX,3FBH;MOV AL,80H;DLAB=1
OUT DX,AL MOV AX,0CH;N=12 BAUD=9600bps MOV DX,3F8H;低位
MOV AL,AH INC DX OUT DX,AL OUT DX,AL MOV AL,03H;八位数据,1停止,无校验 MOV DX,3FBH;线路控制REG OUT DX,AL MOV AL,0;屏蔽全部中断 MOV DX,3F9H
OUT DX,AL WAIT1: MOV DX,3FDH;读线路状态寄存器
CHAR: PUSH AX
MOV DL,AL MOV AH,02H INT 21H MOV DX,OFFSET CHL;输出字符串换行 MOV AH,09H IN AL,DX TEST AL,1EH;判断是否有错 JNZ ERROR TEST AL,01H;判断是否收到 JNZ RECEIVE TEST AL,20H;判断发送端是否空 JZ WAIT1 MOV DL,0FFH;六号功能调用读入待发送数据 MOV AH,06H INT 21H JZ WAIT1 MOV DX,3F8H;写发送REG OUT DX,AL JMP WAIT1;返回 WAIT1;显示接收
INT 21H POP AX JMP WAIT1 ERROR: MOV DX,3FDH
RECEIVE:MOV DX,3F8H
IN AL,DX JNE CHAR;读数据接收寄存器
CMP AL,'!';判断是否结束;------------------------------MOV AH,4CH INT 21H CODE ENDS END START
IN AL,DX MOV DL,'?';对于错误显示'?" MOV AH,02H INT 21H JMP WAIT1 2.双机通信(1)发送端: CODE SEGMENT ASSUME CS:CODE START: MOV AL,80H;8250初始化,设DLAB=1 MOV DX,3FBH OUT DX,AL
MOV AX,30H MOV DX,3F8H OUT DX,AL;写入除数低字节 MOV AL,AH INC DX OUT DX,AL;写入除数高字节 MOV AL,0AH;7位数据,1位停止,奇校验 MOV DX,3FBH OUT DX,AL;写入线路控制寄存器
MOV AL,03H MOV DX,3FCH OUT DX,AL;写入Modem控制寄存器
MOV AL,0 MOV DX,3F9H OUT DX,AL;
WAIT1: MOV DX,3FDH;IN AL,DX TEST AL,1EH;JNZ ERROR
;TEST AL,01H;;JNZ SEND;
TEST AL,20H;JZ WAIT1
SEND: MOV AH,1 INT 21H;CMP AL,21H;JZ EXIT
MOV DX,3F8H;OUT DX,AL JMP WAIT1;
ERROR: MOV DX,3FDH;IN AL,DX MOV DL,'?';MOV AH,02H INT 21H JMP WAIT1
EXIT: MOV AH,4CH INT 21H CODE ENDS END START
写中断允许寄存器,屏蔽所有中断读线路状态寄存器 出错否 接收数据就绪否 发送 发送寄存器空否,不空,返回等待 读键盘 是'!'? 是,返回操作系统
不是,则发送 返回等待 出错则清除线路状态寄存器 显示'?' 26
;
(2)接收端:
CODE SEGMENT ASSUME CS:CODE START: MOV AL,80H;8250初始化 MOV DX,3FBH OUT DX,AL
MOV AX,30H;MOV DX,3F8H OUT DX,AL;MOV AL,AH INC DX MOV DX,3F9H OUT DX,AL;
MOV AL,0AH MOV DX,3FBH OUT DX,AL;
MOV AL,03H MOV DX,3FCH OUT DX,AL;
MOV AL,0 MOV DX,3F9H OUT DX,AL;
WAIT1: MOV DX,3FDH;IN AL,DX TEST AL,1EH;JNZ ERROR
TEST AL,01H;JNZ RECEIVE;
;TEST AL,20H;;JZ WAIT1 JMP WAIT1;
RECEIVE: MOV DX,3F8H;IN AL,DX
写除数 写入除数低字节 写入除数高字节 写入线路控制寄存器 写入Modem控制寄存器 写中断允许寄存器,屏蔽所有中断读线路状态寄存器 出错否 接收数据就绪否 转接收 发送寄存器空否,不空,返回等待 均返回等待 读接收数据 27
AND AL,01111111B;保留位数据 CMP AL,21H;是'!'? JNZ CHAR INT 21H CHAR: PUSH AX MOV DL,AL MOV AH,2;显示接受字符 INT 21H POP AX JMP WAIT1;返回等待
ERROR: MOV DX,3FDH;出错则清除线路状态寄存器 IN AL,DX MOV DL,'?';显示'?' MOV AH,02H INT 21H JMP WAIT1 CODE ENDS END START
MOV AH,4CH;返回操作系统
五.实验遇到的问题和解决方法
问题:当按下一个字符时,屏幕上会显示两个字符。其中一个不正确。解决方法:显示字符时,用6号功能代替2号功能。这样问题就得到了解决。
六、课程综合实验(抢答器)
一、实验目的
1、了解微机化竞赛抢答器的基本原理。
2、进一步学习使用并行接口。
二、实验内容
图5-4为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。在七段数码管 上将其组号(0~7)显示出来,并使喇叭响一下。从键盘上按空格键开始下一轮抢答,按其它键程序退出。
图 5-4
8255动态分配地址: 控制寄存器: 0C40BH
A口地址: 0C408H C口地址: 0C40AH
三.程序流程图和程序清单
DATA SEGMENT LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DATA ENDS
STACK1 SEGMENT STACK DW 100H DUP(0)STACK1 ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX;-------------------MOV DX,0C40BH MOV AL,89H OUT DX,AL;对8255进行初始化 L0: MOV DX,0C40AH IN AL,DX;读C口状态 CMP AL,0;如果为0则循环 JZ L0
MOV BL,0 L1: INC BL SHR AL,1;将AL逻辑右移 JNC L1 DEC BL MOV AL,BL;求出组号
MOV BX,OFFSET LIST;七段显示代码表的首址送BX AND AX,00FFH;屏蔽AX高字节,组号 ADD BX,AX;形成显示字符的地址 MOV AL,[BX];取出字符送AL MOV DX,0C408H OUT DX,AL;送到A口输出显示
MOV DL,7 MOV AH,2 INT 21H;响铃功能调用
MOV AH,01H INT 21H CMP AL,20H;当为空格时跳到CLOSE JZ CLOSE MOV AH,4CH INT 21H CLOSE: MOV AL,0 MOV DX,0C408H OUT DX,AL JMP L0
CODE ENDS END START 四.实验遇到的问题和解决方法
1.问题:读取C口状态后不知如何将其转换为相应的组号
解决方法:对AL进行逻辑右移,通过判断CF是否为1,来计算相应的组号(具体方法见程序)
2.问题:数码管始终显示‘7’
解决方法:调用响铃程序的位置出现错误。通过先进行组号显示,再调用响铃程序,问题得到了解决。
七、自主设计实验——LED显示
一、实验内容
1.按图连接好电路,将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V(选中),S0、dp接地(关闭)。编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
2.七段数码管的字型代码表如下表:
二、程序流程图
三、实验源程序 data segment ioport equ 0c400h-0280h io8255a equ ioport+288h io8255b equ ioport+28bh led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,0ah,'Input a num(0--9h):',0dh,0ah,'$' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,io8255b
;使8255的A口为输出方式
mov ax,80h out dx,al sss: mov dx,offset mesg1;显示提示信息
mov ah,09h int 21h mov ah,01
;从键盘接收字符
int 21h cmp al,'0'
;是否小于0 jl exit
;若是则退出
cmp al,'9'
;是否大于9 jg exit
;若是则退出
sub al,30h
;将所得字符的ASCII码减30H mov bx,offset led;bx为数码表的起始地址
xlat
;求出相应的段码
mov dx,io8255a
;从8255的A口输出
out dx,al jmp sss;转SSS exit: mov ah,4ch
;返回DOS int 21h code ends end start
四、总结
通过自主设计实验,提升了运用已经学过的理论知识与实践的联系的能力,复习巩固了芯片的使用方法。
八、参考文献
1.戴胜华,张凡,盛珣华.微机原理与接口技术[M].北京:北京交通大学出版社, 2008.2.Barry B.Brey.intel系列微处理器结构、编程和接口技术大全[M].北京:机械工程出版社,1998.35
第二篇:微机原理实验报告
学号: 学生姓名: 打印日期: 评分: 评语:
实验报告
COURSE PAPER 8255控制开关状态显示
学院 :机电工程与自动化学院
一、实验目的;
(本课程设计是在完成《微机原理与接口技术使用教程》知识后进行的一次综合性训练。通过本课程设计,既可以巩固对所学知识的理解和掌握,又可以培养解决实际问题的本领,也能够提高运用文字图表表达设计思想和对Proteus与Emu8086应用的能力。
二、实验要求;
(1)功能要求:设定8255的PA口为开关量输入,PB口为开关量输出,要求能随时将PA口的开关状态通过PB口的数码管显示出来,如开关为0000,则数码管显示为0;若开关为1111,则数码管显示为F。
(2)具体参数:将8255A的端口A设置为方式0并作为输入口,读取开关量,PB口设置为方式0作为输出口。并设定A、B、C口和控制口的地址为60H、62H、64H、66H。LED为共阴极连接方式。
(3)用Proteus画出实现上述功能的8086和8255及LED相关连接的硬件电路,编写相关程序,结合emu8086,完成仿真调试,给出硬件电路图、程序代码和仿真结果图。
三、实验说明;
利用前期实验建立组态控制 组态软件的操作界面和主要功能; 混料罐工程或交通灯工程工程组态
四、实验步骤;(1)硬件设计
8255A的四个端口地址为60H、62H、64H、66H。其二进制码分别为0110 0000H、0110 0010H、0110 0100H、0110 0110H。则可以判断,8255A的A0与A1端口应该与8086的A1和A2端口对应。8086的A7、A4、A3、A0为0,A6、A5为1时,8255A接受指令。为完成上述操作,可以使用138译码器。8255A的A端口作为输入口,连接四位开关;B端口作为输出口,连接一个共阴极的LED显示管。
(2)硬件电路图
(3)汇编语言设计 assume cs:code code segment start: MOV DX,066H MOV AL,90H OUT DX,AL
AA: MOV BX, OFFSET TABL MOV DX,060H IN AL,DX AND AL,0FH XLAT MOV DX,062H OUT DX,AL JMP AA
TABL: DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H
code ends end start(4)实验结果
五、实验心得;
通过对proteus及emu8086软件的应用,可以使我将从课堂与书本上学习到的知识,以模拟的方式,制作成成品。在本次课外项目中,我对于8255A的工作方式以及8086如何控制其他元器件输入输出数据有了清晰的认识。通过使用模拟软件,我有了更多的方式去深入了解课本上的知识。
第三篇:数码转换 实验报告 微机原理
实验九
数码转换
一、实验目的
1、掌握计算机常用数据编码之间的相互转换方法。
2、进一步熟悉DEBUG软件的使用方法。
二、实验内容
1.ACSII码转换为非压缩型BCD码
编写并调试正确的汇编语言源程序,使之实现:设从键盘输入一串十进制数,存入DATA1单元中,按回车停止键盘输入。将其转换成非压缩型(非组合型)BCD码后,再存入DATA2开始的单元中。若输入的不是十进制数,则相应单元中存放FFH。调试程序,用D命令检查执行结果。
2.BCD码转换为二进制码
编写并调试正确的汇编语言源程序,使之将一个16位存储单元中存放的4位BCD码DATA1,转换成二进制数存入DATA2字单元中。调试程序,用D命令检查执行结果。3.十六进制数转换为ASCII码
编写并调试正确的汇编语言源程序,使之将内存DATA1字单元中存放的4位十六进制数,转换为ASCⅡ码后分别存入DATA2为起始地址的4个单元中,低位数存在低地址的字节中,并在屏幕上显示出来。
三、实验预习
1.复习材料中有关计算机数据编码部分的内容。2.按要求编写程序。
四、实验步骤
1.编辑源文件,经汇编连接产生EXE文件。2.用DEBUG调试、检查、修改程序。
五、实验内容
1.ACSII码转换为非压缩型BCD码 STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(?)
;为堆栈段留出256个字节单位
STACK ENDS DATA SEGMENT PARA 'DATA';定义数据段
DATA1 DB 32
;缓冲区最大长度
DB ? DB 32 DUP(?)DATA2 DB 32 DUP(?)DATA ENDS CODE SEGMENT
;定义代码段 ASSUME SS:STACK ASSUME CS:CODE ASSUME DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,DATA1
;规定:DX存放输入字符串的缓冲区首地址 MOV AH,0AH INT 21H
;字符串输入 AL=键入的ASCII码 LEA SI,DATA1 LEA DI,DATA2 INC SI MOV CL,[SI] INC SI LP1: MOV AL,[SI] SUB AL,30H CMP AL,0 JL LP2 CMP AL,9 JG LP2 MOV BL,AL MOV [DI],BL INC DI INC SI DEC CL JMP LP1 LP2: MOV AL,0FFH MOV BL,AL MOV [DI],BL INC DI INC SI DEC CL CL=CL-1 JNZ LP1 LP3: MOV AH,4CH INT 21H CODE ENDS END START
;DI存放DATA2首地址
;取输入字符串长度
;指向第一个输入字符
;输入的字符存为ASCII码,将其转换成十进制数
;若AL<0(AL-0<0),跳转到LP2
;若AL>9(AL-9>0),跳转到LP2
;将AL->BL
;将结果存到DATA2开始的单元中
;若输入的不是十进制数,在相应的单元存放FFH
;以字母开头的十六进制数前面需加'0'
;将AL->BL
;CL=0,执行LP3中的语句
2.BCD码转换为二进制码
DATA
SEGMENT
DATA1 DW 2497H
DATA2 DW ?
DATA
ENDS
CODE
SEGMENT
ASSUME SS:STACK,CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR BX,BX
;累加单元清0(BX=0)
MOV SI,0AH
;设置乘数10
MOV CL,4
;指4位BCD码
MOV CH,3
;循环次数=3 MOV AX,DATA1
;取十进制数
LP:
ROL AX,CL
;取数字
MOV DI,AX
;保存当前AX值
AND AX,0FH
;屏蔽高位
ADD AX,BX
;累加
MUL SI
MOV BX,AX
MOV AX,DI
DEC CH
;循环次数减1
JNZ LP
;以上完成循环三次
ROL AX,CL
;取个位数字
AND AX,0FH
;屏蔽高位
ADD AX,BX
;进行累加,直接将最后的累加结果放到AX中
MOV DATA2,AX
MOV AH,4CH
INT 21H
CODE
ENDS
END START
3.十六进制数转换为ACSII码 STACK
SEGMENT
DB 256 DUP(?)
STACK
ENDS
DATA
SEGMENT
DATA1 DB 24H,06DH
DATA2 DB 4 DUP(?)
;存放ASCII码
JUMP DB 4 DUP(?)
;4位十六进制数分别存放在DATA3的4个字节中
DATA ENDS
CODE
SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA SI,DATA1
LEA DI,JUMP
MOV CL,2
;循环2次,取两次两位十六进制数
LP0:
MOV AL,[SI]
;取2位十六进制数
AND AL,0F0H
;低四位为零
ROR AL,4
;右移4位
相当于除以16
MOV [DI],AL
;高位数存放在高地址字节中
INC DI
MOV AL,[SI]
;取2位十六进制数
AND AL,0FH
;高四位为零
MOV [DI],AL
;低位数存放在低地址字节中
INC SI
INC DI
DEC CL
JNZ LP0
LEA SI,JUMP
LEA DI,DATA2
MOV CL,4
LP1:
MOV AL,[SI]
CMP AL,9
JG LP3
ADD AL,30H
JMP LP3
LP2:
ADD AL,37H
LP3:
MOV [DI],AL
INC DI
INC SI
DEC CL
JNZ LP1
MOV AH,09H
INT 21H
MOV DX,OFFSET DATA2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE
ENDS
END START
;SI=JUMP的首地址偏移量
;DI=DATA2的首地址偏移量
;因为是四位十六进制数,所以设置为循环4次
;取JUMP中的十六进制数
;若AL>9(AL-9>0),跳转到LP3
;0~9H+30H=ASCII
;A~FH+30H=ASCII
;将ASCII码依次存入DATA2中
六、实验习题与思考
1.编程实现:从键盘上输入两位十六进制数,转换成十进制数后显示在屏幕上。STACK SEGMENT
DB
256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB
5,?,2 DUP(?)
DATA2 DB
DUP(?)
DATA3 DB
DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME
SS:STACK,DS:DATA,CS:CODE
START:MOV
AX,DATA
MOV
DS,AX
LEA
DX,DATA1
MOV
AH,0AH
INT
21H
;输入字符串
LEA
SI,DATA1+2
LEA
DI,DATA2
MOV
CL,2
;将ASC码转换为十六进制数
LP1: MOV
AL,[SI]
SUB
AL,30H
CMP
AL,9
JA
LP2
MOV
[DI],AL
INC
DI
INC
SI
DEC
CL
JZ
LP3
JNZ
LP1
LP2: SUB
AL,7
MOV
[DI],AL
INC
DI
INC
SI
DEC
CL
JNZ
LP1
;将十六进制数转换成十进制数,并保存
LP3: LEA
DI,DATA2
MOV
AL,[DI]
MOV
BL,[DI+1]
MOV
CL,4
SHL
AL,CL
ADD
AL,BL
MOV
[DI],AL
LEA
SI,DATA3
XOR
AH,AH
MOV
CL,100
DIV
CL
;AH=AX%100,AL=AX/100
MOV
[SI],AL
;保存百位数
MOV
AL,AH
XOR
AH,AH
MOV
CL,10
DIV
CL
MOV
[SI+1],AL
;保存十位数
MOV
[SI+2],AH
;保存个位数
;屏幕显示十进制数
LP4: MOV
DL,[SI]
;取百位数送显
OR
DL,30H
MOV
AH,02H
INT
21H
MOV
DL,[SI+1]
;取十位数送显
OR
DL,30H
MOV
AH,02H
INT
21H
MOV
DL,[SI+2]
;取个位数送显
OR
DL,30H
MOV
AH,02H
INT
21H
MOV
AH,4CH
INT
21H
CODE ENDS
END
START
2.十进制数转换为七段码。
为了在七段显示器上显示十进制数,需要把十进制数转换为七段代码。转换可采用查表法。设需要转换的十进制数已存放在起始地址为DATA1区域中,七段代码转换表存放在起始地址为TABLE表中,转换结果存放到起始地址为DATA2区域。若待转换的数不是十进制数,则相应结果单元内容为00H。
STACK SEGMENT
DB
256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DB
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'A','B','C','$'
TABLE DB
00H,40H,01H,79H,02H,24H,03H,30H,04H,19H,05H,12H,06H,02H, 07H,78H,08H,00H,09H,18H,0AH,08H,0BH,03H,0CH,46H,0DH,21H,0EH,06H,0FH,0EH
;实际数据定义必须在同一行
DATA2 DB
DUP(0)
COUNT EQU
DATA ENDS CODE SEGMENT
ASSUME SS:STACK,DS:DATA,CS:CODE
START: MOV
AX,DATA
MOV
DS,AX
LEA
SI,DATA1
LEA
BX,DATA2
LEA
DI,TABLE
XOR
AH,AH
LP1: MOV
AL,[SI]
;外循环DATA1指向下一个
INC
SI
MOV
CX,16
;内循环TABLE 16次
LP2: CMP
[DI],AL
JE
LP3
ADD
DI,COUNT
;内循环TABLE指向下一组
DEC
CX
JNZ
LP2
MOV
BYTE PTR[BX],00H 若不是十进制数,则结果保存为00H
INC
BX
CMP
AL,'$'
;设置结束标志
JNZ
LP1
JZ
LP4
LP3: MOV
AL,[DI+1]
MOV
[BX],AL
;转换结果保存在DATA2中
INC
BX
LEA
DI,TABLE
CMP
CL,0
JNZ
LP1
LP4: MOV
AH,4CH
INT
21H
CODE ENDS
END START
第四篇:北京科技大学微机原理实验报告
微机原理及应用实验报告
学院: 班级: 学号: 姓名:
微机实验报告书(Ⅰ)学号:姓名:班级: 同组名单:实验日期:
实验题目:8253可编程定时器计数器
实验目标:掌握8253的基本工作原理和编程方法 实验步骤:
连接电路图
如图虚线连接电路,将计数器0设置为方式0,计数器初值为N(N<=0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。程序框图:
程序清单:
;*************************;;* 8253方式0计数器实验 *;;*************************;IOPORT
EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
AL,00010000B
;设置8253工作方式
MOV
DX,IO8253A
OUT
DX,AL
MOV
DX,IO8253B
;送计数初值为0FH
MOV
AL,0FH
OUT
DX,AL
LLL: IN
AL,DX
;读计数初值
CALL
DISP
;调显示子程序
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JZ
LLL
;跳转到LLL
MOV
AH,4CH
;退出
INT
21H
DISP PROC
NEAR
;显示子程序
PUSH
DX
AND
AL,0FH
;首先取低四位
MOV
DL,AL
CMP
DL,9
;判断是否<=9
JLE
NUM
;若是则为'0'-'9',ASCII码加30H
ADD
DL,7
;否则为'A'-'F',ASCII码加37H
NUM: ADD
DL,30H
MOV
AH,02H
;显示
INT
21H
MOV
DL,0DH
;加回车符
INT
21H
MOV
DL,0AH
;加换行符
INT
21H
POP
DX
RET
;子程序返回
DISP ENDP
CODE ENDS
END
START 运行结果:
每输入一个单脉冲,屏幕上的数值减1,从15减到0后(拨动16次后),检测到OUT0输出由低电平变为高电平。小结(体会与收获):
通过预习和实验,学会了 8253 芯片和微机接口原理和方法,掌握 8253 定时器/计数器的基本工作原理、工作方式和编程原理,熟悉了汇编代码的编写。实验中,连接电路,利用代码控制实验电路,深对了课本理论的理解。
由于是第一次实验,进程比较缓慢,所以仅进行了8253可编程定时器/计数器的一个实验,下次实验会熟练一些。
微机实验报告书(Ⅱ)
学号:姓名:班级: 同组名单:实验日期:
实验题目:1.8253可编程定时器计数器
2.8255可编程并行接口(方式0)3.七段数码管
实验目标:1.掌握8253的基本工作原理和编程方法
2.掌握8255方式0的工作原理及使用方法 3.掌握数码管显示数字的原理
实验步骤: 实验一:
连接电路图
按上图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。实验二:
连接电路图
1)实验电路如图,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
2)编程从8255C口输入数据,再从A口输出。实验三:
连接电路图
静态显示:按图连接好电路,将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V(选中), S0、dp接地(关闭)。编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。程序框图: 实验一:
实验二:
实验三:
程序清单: 实验一:
;*******************;* 8253分频 *;******************* IOPORT EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
IO8253C EQU
IOPORT+281H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
DX,IO8253A;向8253写控制字
MOV
AL,36H
;工作方式
OUT
DX,AL
MOV
AX,1000
;写入循环计数初值1000
MOV
DX,IO8253B
OUT
DX,AL
;先写入低字节
MOV
AL,AH
OUT
DX,AL
;后写入高字节
MOV
DX,IO8253A
MOV
AL,76H
;设工作方式
OUT
DX,AL
MOV
AX,1000
;写入循环计数初值1000
MOV
DX,IO8253C
OUT
DX,AL
;先写低字节
MOV
AL,AH
OUT
DX,AL
;后写高字节
MOV
AH,4CH
;程序退出
INT
21H
CODE ENDS
END
START
实验二:
;*************************;;* 8255A的基本输入输出 *;;*************************;IOPORT EQU 0C800H‐280H IO8255A EQU IOPORT+288H IO8255B EQU IOPORT+ 28BH IO8255C EQU IOPORT+28AH CODE SEGMENT ASSUME CS:CODE START: MOV DX,IO8255B;对 8255 进行设定,A 输出,C 输入
MOV AL,10001001B
OUT DX,AL INPUT: MOV DX,IO8255C;从 C 输入
IN AL,DX
MOV DX,IO8255A;从 A 输出
OUT DX,AL
MOV DL,0FFH;判断是否有按键
MOV AH,06H
INT 21H
JZ INPUT;若无,则继续 C 输入,A 输出
MOV AH,4CH;否则,返回 DOS
INT 21H CODE ENDS END START 实验三:
;************************************;;*键盘输入数据(0-9)控制LED数码管显示*;;************************************;
DATA
SEGMENT
IOPORT
EQU
0C800H-280H IO8255A
EQU
IOPORT+288H IO8255B
EQU
IOPORT+28BH IO8255C
EQU
IOPORT+28AH
LED
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
MESG1
DB
0DH,0AH,'Input a num(0--9),other key is exit:',0DH,0AH,'$' DATA
ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:
MOV
AX,DATA
MOV
DS,AX
MOV
DX,IO8255B
;使 8255 的A口为输出方式
MOV
AX,10000000B
OUT
DX,AL
SSS:
MOV
DX,OFFSET MESG1
;显示提示信息
MOV
AH,09H
INT
21H
MOV
AH,01
;从键盘接收字符
INT
21H
CMP
AL,30H
;是否小于 0
JL
EXIT
;若是则退出
CMP
AL,39H
;是否大于9
JG
EXIT
;若是则退出
SUB
AL,30H
;将所得字符的 ASCII 码减 30H
MOV
BX,OFFSET LED
;BX为数码表的起始地址
XLAT
;求出相应的段码
MOV
DX,IO8255A
;从 8255 的A口输出
OUT
DX,AL
JMP
SSS
;转 SSS EXIT:
MOV
AH,4CH
;返回
INT
21H CODE
ENDS
END
START;
运行结果: 实验一:
8253通道0和通道1均工作在方式3,计数初值均为1000。通道0的时钟输入为1MHz标准脉冲,产生1000Hz的方波;通道1以通道0输出的1000Hz方波脉冲为输入,产生1Hz的方波。用逻辑笔发现,OUT1 输出电平呈规律性高低变化(显示灯闪烁),时间间隔为 1s,说明输出频率为 1Hz,实现计时器功能。实验二:
当逻辑开关K0~K7中的一个或几个打开时,对应的LED灯就会亮起来,即利用8255A实现了基本的输入输出控制。实验三:
静态显示:当从键盘输入0~9任一数字时,七段数码管上便 会显示相应的数字,按下其他按键则退出程序。小结(体会和收获):
通过本次实验,进一步了解了8253可编程定时器/计数器;巩固了可编程并行接口8255的基本知识点,了解了该芯片的应用。通过编程实现,熟悉了8255方式控制字,了解了方式0和基本工作原理。通过这三次实验的学习,对于可编程接口芯片有了更深的认识,掌握了基本的微机接口方法。
在实验过程中要细心,当编译、链接或者运行的时候遇到错误的时候,要仔细检查程序的输入是否正确,很容易输错字母数字。
微机实验报告书(Ⅲ)
学号:姓名:班级: 同组名单:实验日期: 实验题目:步进电机控制实验
实验目标:1.了解步进电机控制的基本原理
2.掌握控制步进电机转动的编程方法
实验步骤:
连接电路图
1)按图14连接线路,利用8255输出脉冲序列,开关K0~K6控制步进电机转速,K7控制步进电机转向。8255 CS接288H~28FH。PA0~PA3接BA~BD;PC0~PC7接K0~K7。
2)编程:当K0~K6中某一开关为“1”(向上拨)时步进电机启动。K7向上拨电机正转,向下拨电机反转。程序框图:
程序清单:
;*******************************;;*
步进电机
*;;*******************************;
DATA
SEGMENT
IOPORT
EQU
0E400H-280H
IO8255A
EQU
IOPORT+288H
;8255A 输出端口
IO8255B
EQU
IOPORT+ 28BH
;8255B 控制端口
IO8255C
EQU
IOPORT+ 28AH
;8255C 输入端口
BUF
DB
0
MES
DB
'K0-K6 ARE SPEED CONTROL',0AH,0DH
DB
'K6 IS THE LOWEST SPEED ',0AH,0DH
DB
'K0 IS THE HIGHEST SPEED',0AH,0DH
DB
'K7 IS THE DIRECTION CONTROL',0AH,0DH,'$'
DATA
ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,CS
MOV
DS,AX
MOV
AX,DATA
MOV
DS,AX
MOV
DX,OFFSET MES
MOV
AH,09
INT
21H
MOV
DX,IO8255B
MOV
AL, 10001001B
OUT
DX,AL
;8255 C输入, A 输出
MOV
BUF,33H
OUT1:
MOV
AL,BUF
MOV
DX,IO8255A
OUT
DX,AL
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JE
IN1
MOV
AH,4CH
INT
21H
IN1:
MOV
DX,IO8255C
IN
AL,DX
;输入开关状态
TEST
AL,01H
JNZ
K0
TEST
AL,02H
JNZ
K1
TEST
AL,04H
JNZ
K2
TEST
AL,08H
JNZ
K3
TEST
AL,10H
JNZ
K4
TEST
AL,20H
JNZ
TEST
JNZ
STOP:
MOV
MOV
JMP
K0:
MOV
SAM:
TEST
JZ
JMP
K1:
MOV
JMP
SAM
K2:
MOV
JMP
K3:
MOV
JMP
K4:
MOV
JMP
K5:
MOV
JMP
K6:
MOV
JMP
SAM
ZX0:
CALL
MOV
ROR
MOV
JMP
NX0:
CALL
MOV
ROL
MOV
JMP
DELAY
PROC
DELAY1:
MOV
DELAY2:
LOOP
K5
AL,40H K6
DX,IO8255C AL,0FFH
OUT1
BL,40H
AL,80H ZX0 NX0
BL,50H
BL,70H
SAM
BL,80H SAM
BL,0A0H SAM
BL,0C0H SAM
BL,0FFH
DELAY
AL,BUF
AL,1
BUF,AL OUT1
DELAY
AL,BUF
AL,1
BUF,AL OUT1
NEAR
CX,0FFFFH
DELAY2
DEC
BL
JNZ
DELAY1
RET
DELAY
ENDP
CODE
ENDS
END
START 运行结果:
当K0~K6中任意一开关向上拨时步进电机启动,且K1速度最快,K6速度最慢;当K7向上拨电机正转,向下拨电机反转。当键盘中有任意键输入的时候则程序终止。小结(收获与体会):
实验和理论是相互检验,相互补充和相互促进的,在实际动手动脑运用理论知识的时候,能更深入地领会概念,熟练运用,在此基础上方能进行创新和自由发挥。通过本次实验,我了解了步进电机控制的基本原理,掌握了控制步进电机转动的编程方法。更加深入地了解了微机原理这门课程。
第五篇:北京理工大学微机原理实验报告_8259A
实验一8259中断控制器实验
一、实验内容
用单脉冲发生器的输出脉冲为中断源,每按一次产生一次中断申请,点亮或熄灭发光二极管。二,实验目的
(1)掌握8259的工作原理。
(2)掌握编写中断服务程序的方法。(3)掌握初始化中断向量的方法。三,实验步骤(1)连线
1.单脉冲发生器输出P+与8259的IR0相连; 2.8259的片选CS8259与CS0相连; 3.8259的INT与8086的INT相连; 4.8259的INTA与8086的INTA相连; 5.CS273与CS1相连;
6.00与LED0相连,01与LED1相连,依次将CS273接口与LED相连;其它线均已连好如下图:
DDBUSDD0VccDD1DD2DD3DD4DD5DD6DD7CS825913274LS32VccINTINTAVccIORDIOWRA***2161726D0D1D2D3D4D5D6D7A0CSRDWRSP/ENINTINTA8259IR0IR1IR2IR3IR4IR5IR6IR7***32425IR0IR1IR2IR3IR4IR5IR6IR7CAS0CAS1CAS2121314(2)编辑程序,编译链接后,单步运行,调试程序。
(3)调试通过后,在中断服务程序的NOP处设置断点,运行程序,当接收到中断请求后,程序停在中断服务程序内的断点处,观察寄存器AX的值。四,实验源程序如下
CODE SEGMENT PUBLIC ASSUME CS:CODE ORG 100H START: MOV DX,4A0H
;写ICW1,单片8259A,要写0CW4 MOV AX,13H
OUT DX,AX MOV DX,4A2H;写ICW2 MOV AX,80H
;IR0的中断向量码为80H OUT DX,AX MOV AX,01
OUT DX,AX;一般嵌套,非缓冲方式,非自动EOI MOV AX,0;写OCW1 OUT DX,AX;允许中断
;中断向量存放在(0000H:0200H)开始的四个单元里 MOV AX,0
MOV DS,AX MOV SI,200H
;中断类型号为80H MOV AX,OFFSET HINT;中断服务程序的入口地址 MOV DS:[SI],AX ADD SI,2 MOV AX,CS MOV DS:[SI],AX STI
;开中断,设置IF=1 JMP $
;原地跳转
HINT:
;中断服务程序 XOR CX,0FFH;CX取反
MOV DX,4B0H;CS273接口的地址,与8个LED灯相连 MOV AX,CX;输出高低电平控制LED灯的亮灭 OUT DX,AX MOV DX,4A0H;OCW2的地址
MOV AX,20H;一般EOI命令,全嵌套方式 OUT DX,AX IRET;中断返回
CODE ENDS END START 五,实验思考题 1. 将P0连线连接到IR1—IR7任意一个;重新编写程序。
将P0接到了IR1,在原程序的基础上,把写ICW2的控制字改为81H,再把中断向量的入口地址改为0204H即可。程序如下:
CODE SEGMENT PUBLIC ASSUME CS:CODE ORG 100H START: MOV DX,4A0H
;写ICW1,单片8259A,要写ocw4 MOV AX,13H
OUT DX,AX MOV DX,4A2H;写ICW2 MOV AX,81H
;IR1的中断向量码为81H OUT DX,AX MOV AX,01
OUT DX,AX;一般嵌套,非缓冲方式,非自动EOI MOV AX,0;写OCW1 OUT DX,AX;允许中断
;中断向量存放在(0000H:0204H)开始的四个单元里 MOV AX,0
MOV DS,AX MOV SI,204H
;中断类型号为81H MOV AX,OFFSET HINT;中断服务程序的入口地址 MOV DS:[SI],AX ADD SI,2 MOV AX,CS MOV DS:[SI],AX STI
;开中断,设置IF=1 JMP $
;原地跳转
HINT:
;中断服务程序
XOR CX,0FFH;CX取反
MOV DX,4B0H;CS273的地址
MOV AX,CX;输出高低电平控制LED灯的亮灭 OUT DX,AX
MOV DX,4A0H;OCW2的地址
MOV AX,20H;一般EOI命令,全嵌套方式 OUT DX,AX IRET;中断返回 CODE ENDS END START 实验现象:运行程序,触发脉冲发生器产生中断请求,相应二极管点亮。2. 设置OCW1,屏蔽某个中断请求,运行程序观察现象。
将IR0重新接入LED0,设置OCW1为01H,屏蔽中断IR0,则IR0的中断无法得到响应。程序如下:
CODE SEGMENT PUBLIC ASSUME CS:CODE ORG 100H START: MOV DX,4A0H
;ICW1的地址,写初始化命令字ICW1 MOV AX,13H;上升沿触发,单片8259,要写ICW4 OUT DX,AX MOV DX,4A2H;ICW2的地址,写中断向量码ICW2 MOV AX,80H
;IR0的中断向量码为80H OUT DX,AX MOV AX,01
;写中断结束控制字ICW4 OUT DX,AX;一般嵌套,非缓冲方式,非自动EOI MOV AX,01H
;写中断屏蔽字OCW1 OUT DX,AX;屏蔽IR0中断
;中断向量存放在(0000H:0200H)开始的四个单元里 MOV AX,0
MOV DS,AX MOV SI,200H
;中断类型号为80H MOV AX,OFFSET HINT;中断服务程序的入口地址 MOV DS:[SI],AX ADD SI,2 MOV AX,CS MOV DS:[SI],AX STI
;开中断,设置IF=1 JMP $
;原地跳转
HINT:
;中断服务程序
XOR CX,0FFH;CX取反
MOV DX,4B0H;CS273的地址
MOV AX,CX;输出高低电平控制LED灯的亮灭 OUT DX,AX
MOV DX,4A0H;OCW2的地址
MOV AX,20H;一般EOI命令,全嵌套方式 OUT DX,AX IRET
;中断返回
CODE ENDS END START 实验现象:
每按单脉冲发生器一次产生一次中断申请,但连接的发光二极管一直不亮。3.设置OCW2,了解中断结束方式与设置优先权。将IR0和IR1都连接到P+上,分别连接LED0和LED1到00和01。OCW2将 E0OCW2一般EOI命令,将IR0设置为最低中断优先级。程序如下:
CODE
SEGMENT PUBLIC ASSUME CS:CODE ORG 100H START: MOV DX,4A0H
;ICW1的地址 MOV AX,13H
;上升沿触发,单片8259,要写ICW4 OUT DX,AX MOV DX,4A2H;ICW2的地址 MOV AX,80H;中断向量码为80H,低3位自动写入 OUT DX,AX MOV AX,01
;写ICW4 OUT DX,AX;一般嵌套,非缓冲方式,非自动EOI MOV AX,0
;写OCW1 OUT DX,AX;允许所有中断
;IR0的中断向量存放在(0000H:0200H)开始的四个单元里 MOV
AX,0
MOV
DS,AX MOV
SI,200H MOV
AX,OFFSET HINT1 MOV
DS:[SI],AX ADD
SI,2 MOV
AX,CS MOV
DS:[SI],AX STI
;开中断,设置IF=1;IR1的中断向量存放在(0000H:0204H)开始的四个单元里 MOV
AX,0
MOV
DS,AX MOV
SI,204H MOV
AX,OFFSET HINT2 MOV
DS:[SI],AX ADD SI,2 MOV
AX,CS MOV
DS:[SI],AX JMP $
;原地跳转
HINT1:;中断服务程序1 XOR CX,0F0H;CX高4位取反 MOV DX,4B0H;CS273的地址
MOV AX,CX;输出高低电平控制LED灯的亮灭 OUT DX,AX MOV DX,4A0H;OCW2的地址
MOV AX,E0H;一般EOI命令,IR0优先级最低 OUT DX,AX IRET
;中断返回
HINT2:
;中断服务程序2 XOR CX,00FH;CX低4位取反 MOV DX,4B0H;CS273的地址
MOV AX,CX;输出高低电平控制LED灯的亮灭 OUT DX,AX MOV DX,4A0H;OCW2的地址
MOV AX,E0H;一般EOI命令,IR0优先级最低 OUT DX,AX IRET
;中断返回 CODE ENDS END START 实验现象:CS273的00与LED0相连,01与LED1相连,02与LED2相连,依次下去,直至07与LED7相连。每按单脉冲发生器一次产生一次中断申请,由于IR0的优先级比IR1低,故先响应IR1,后响应IR0,观察到低4位的LED灯先点亮或熄灭,高4位的LED灯后点亮或熄灭。六,实验心得
实验让我对8259A的内部寄存器的功能有了更深的认识,掌握了8259A的初始化步骤及其工作方式的选择,以及中断服务程序的编写。使用实验箱和编译软件,使我们在编程和动手操作方面都有了很大的提高,软硬件的结合,使我们更加透彻的理解了所学知识。