第一篇:模拟电梯的设计与实现实验报告(微机原理)
2011年9月
目 录
一 理论部分..............................................................................................................................................2
1课题要求与内容................................................................................................................2 2 系统方案设计...................................................................................................................3 3 系统硬件设计...................................................................................................................3 4 系统软件设计...................................................................................................................5 二
实践部分............................................................................................................................................5 系统硬件原理简介...........................................................................................................6 2 系统硬件调试中出现的问题及解决措施.......................................................................6 3 系统软件...........................................................................................................................6 3.1 软件设计........................................................................................................................6 3.2软件调试中出现的问题及解决措施......................................................................................6 三
附录...................................................................................................................................................10
一、理论部分
理论设计课题名称:模拟电梯的设计与实现
1课题要求与内容
1.1设计基本要求
用键盘、按钮、发光二极管和 LED显示单元来模拟电梯工作过程。楼层设为 8层,用键盘键入希望停的楼层,8 个 发光二极管显示希望停的楼层,LED指示电梯当前所在楼层,按钮用来启、停电梯。电梯正常运行时以每 2 秒1层的速度上升或下降。并在到达相关楼层时发错声音提示。1.2提高要求
设计几个按钮,模拟更多的电梯运行功能,如: 直达按钮。若按此按钮,电梯按直达方式运行,即对运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层; 急停按钮。电梯运行中,若按此按钮,则电梯立即停在下一到达的楼层。
2.实验内容
电梯工作按以下方式运行:
2.1假设当前电梯停在某层(LED显示相应楼层,8个发光二极管全灭)。键入数字键,如键入的数字与当前电梯停靠层相同,则什么也不做,若不同则相应楼层的发光二极管亮;电梯自动判别上升或下降(在运行过程中用八段码来显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应 LED 灭)。
2.2假设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED 指示希望抵达的楼层),若键入新的希望停靠的楼层数字(相应的 LED 亮),则对同方向(上升或下降)未到的楼层能停靠,对其它情况则先停靠原先希望停的楼层,然后继续运行)。
如下几例:
1)设电梯当前在 2层,向上运行,LED指示希望在4层停,此时若键入3,则电梯将在3楼停,然后继续运行至4层停;
2)同上情况,若键入的不是 3而是5,则电梯将先停在4层,然后运行至5层停;
同上情况,若键入的不是 3(或5),而是1,则电梯先停在4层,然后运行至1
层停。系统方案设计
本设计主要是利用微机应用实验平台来模拟电梯的运行,用到了平台上的一个非编码键盘、LED显示器、八段数码管等模块。
有8个楼层,需要用8个按键模拟电梯中的请求按钮,用5个按键模拟8个楼层每层向上请求的按钮,再用8个模拟8个楼层每层向下请求的按钮。非编码键盘有16个键,可以用1-8号键模拟电梯内的按钮,用8-0号键模拟每层向上请求的按纽,A-H模拟每层向下请求的按纽。
当电梯静止状态时,无论外部哪一层有请求,电梯都由静止状态转入向上或向下运行的状态,直到到达请求的楼层;当电梯处于向上运行的状态时,此时高于该楼层向上的请求和内部请求级别最高,其次是所有楼层向下的请求,再次是低于该楼层向上的请求;当电梯处于向下运行的状态时则情况相反。
由于中断级别在随着电梯所处楼层的不同而变化,而且中断源比较多。所以用每一个中断源直接和中断控制器相连,需要用到多个8259A级联,很不方便。为解决这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一个变量用低8位,每一位代表一层。例如,REQ_U为 00000110B,这代表在2层和3层有向上的请求。8253定时器每隔20ms产生一次中断,中断程序便去执行扫描键盘,当扫描到有电梯内部或者外部按键时,将请求存储到变量中。每到一个状态时再检查请求变量REQ_U、REQ_D和REQ_IN的值,根据电梯的运行方向和变量中的请求,来决定电梯下一步的运行。
设电梯的当前楼层为floor(floor=1~8),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。LED输出REQ_IN的值显示电梯内已经请求的楼层。系统硬件的设计
由于采用了PC机资源和微机实验平台,不需要其他的硬件电路。利用了微机平台上的8254定时/计数器、8255并行接口单元、LED单元、非编码键盘、数码管显示单元等等。系统结构框图,如图1所示。
图1 系统结构框图
主要的模块如下:
1.可编程定时/计数器8254 定时/计数器8254主要是用于定时20ms,触发中断进行键盘扫描。电路连线是CLOCK0接Q6,分频后频率为46875Hz,OUT0接中断IRQ2,每20ms中断一次,GATE0接5v。计数器的初值应该是3A9H。2.8255并行接口单元 8255主要是用于键盘的扫描和发光二极管的数据输出。所以用8255A口的低8位接8个发光二极管,B口低4位接非编码键盘的列线,高4位接键盘的行线。
3.LED显示系统
虽然只用了1格LED显示器,但为了数字更新更方便,主程序更加简单,故此系统选用动态显示方式。由于系统的软件部分的运行时的核心程序是一直循环的,因此显示程序也是在循环过程中一直被调用,从而实时地被显示出来。4.非编码键盘
本系统采用的是行反转法来扫描键盘的,调用键盘扫描的程序TESTKEY后,程序中的变量KEY的值就是按下的键的值,如果KEY为0FFH则表示无键盘输入,为0~15 则按照上往下从左往右的顺序分别代表每一个按键按下的信息。不过此扫描程序没有考虑到多个按键同时按下的情况。又因为模拟电梯的按
键一般不会有两个按键同时按下的情况,所以,多个按键的情况可以不予考虑。系统软件设计
本设计的软件设计的思路:通过软件编程使8254输出定时信号申请中断,在中断服务程序中扫描键盘,如果有按键,修改相应的变量位,并输出内部请求变量REQ_IN到发光二极管显示当前的内部请求楼层。在主程序中,查询变量的值,根据电梯调度算法运行电梯。1.主要设计模块 程序主要包括以下主要模块:键盘扫描程序、LED显示程序、电梯调度算法。
1)键盘扫描程序:采用的是行反转法来扫描键盘的,相应的程序设计请参考实验指导书上实验3中的相关介绍。
2)LED显示程序:本设计只用到了一个LED,只要将floor转换为相应的段码。先输出位码,再输出段码,循环输出就可以动态显示。为了循环的显示,将LED显示程序放在中断服务程序中。
3)电梯调度算法:在设计时将电梯一次从下到上视为一次运行(注意不一定从底层到顶层),同理,电梯一次从上到下也视为一次运行(注意不一定从顶层到底层)。
当电梯向上运行时:
a)位于当前层以下的向上请求都被忽略留到下次向上运行时处理。b)位于当前层以上的向上请求都被记录留到此次运行处理。
c)无论哪层的向下请求都被忽略留到下次向下运行时处理。
当电梯向下运行时:
a)位于当前层以上的向下请求都被忽略留到下次向下运行时处理。
b)位于当前层以下的向下请求都被记录留到此次运行处理。
c)无论哪层的向上请求都被忽略留到下次向上运行时处理。
二
实践部分 系统硬件原理简介
8255可编程外围接口芯片
8255有3个8为并行I/O口,8255有三通道3种工作方式的可编程并行接口芯片,其可以作为单片机与多种外围接口设备连接时的中间接口电路。8255作为主机与外围设备的芯片连接,必须提供与主机相连的3个总线接口:数据线、地址线、控制线接口。同时必须具有与外设连接的接口ABC口。其必须具有逻辑可控部分,8255内部的结构分为3个部分:与CPU连接部分、与外设连接部分、可口部分。
(1)8254定时/计数器的性能:有3个独立的16位计数器;(2)每个计数器可二进制或十六进制计数;(3)每个可编程计数器有6种不同的工作方式
(4)8254允许的最高的频率是10MHz,计数脉冲可以是有规律的时钟信号,也可是随机信号。系统硬件调试中出现的问题及解决措施
线路连接错误,无法实现预期功能,解决措施:仔细检查电路,查找错误并改正。在接线的时候8254的GATE0没有接5V电源,导致相关芯片无法工作,经细心排查,将错误找错并改正。
有一次调试时试验箱的电源没开就运行软件关联进行调试,结果认为是某个芯片坏了,后来才发现时低级错误。解决措施:重启电脑,打开试验箱电源,重新运行。
另一次,8255的A口语8个发光二极管连接时端口的连接顺序不小心连反了,结果实现不了预期功能,经同学帮助排查才最终找到错误并将其改正过来。3 系统软件
西安唐都TD-CMA 计算机组成原理与系统结构教学实验系统
3.1 软件设计
程序流程图
1)主程序框图如图2
1)主程序框图如图2
开始系统初始化查询电梯请求变量电梯运行
图2 主程序框图
2)中断服务程序框图如图3
中断保护现场LED输出显示floor键盘扫描有键按下?是修改请求变量否点亮相应的发光二极管恢复现场中断返回
图3 中断服务程序框图
3)电梯算法流程图如图4 其中,dir代表电梯的运行方向,0代表电梯向上运行,1代表向下运动。设REQ_U(n)代表第n层向上的请求,同样,REQ_D(n)代表第n层向下的请求,REQ_IN(n)代表第n层内部的请求。求next的方法为:电梯向上时,next为内部请求的最小值和向上请求的大于floor的最小值之间的小者。电梯向下时,next为内部请求的最大值和向下请求中小于floor的最大值之间的大者。没有满足要求的时返回0。
查询请求变量N有请求?YYdir=0?Ndir=1Y求next求nextdir=0next=0?Nfloor++Ynext=0?Nfloor--延时延时求nextNN求nextfloor=next?Y清除请求变量相应位并延时floor=next?Y清除请求变量相应位并延时
图4 电梯算法流程图 3.2软件调试中出现的问题及解决措施
程序编写的时候,指令写错,导致软件调试出现问题,解决措施:认真阅读程序,把错误找出并改正。
实验仪器的电源没打开就开始运行程序,结果造成死机,解决措施:重新正确运行。
相关参数设计错误导致流水灯与声音无法同时满足实验要求。解决措施:经过老师指出,发现是相关的指令与参数错误所致,经同学帮助,将其改正。
三
附录:参考程序清单
INTR_IVADD
EQU
01C8H
;INTR对应的中断矢量地址
INTR_OCW1
EQU
0A1H
;INTR对应PC机内部8259的OCW1地址
INTR_OCW2
EQU
0A0H
;INTR对应PC机内部8259的OCW2地址
INTR_IM
EQU
0FBH
;INTR对应的中断屏蔽字
IOY1
EQU
3040H
;片选IOY0对应的端口始地址 MY8254_COUNT0 EQU
IOY1+00H*4
;8254计数器0端口地址 MY8254_COUNT1 EQU
IOY1+01H*4
;8254计数器1端口地址 MY8254_COUNT2 EQU
IOY1+02H*4
;8254计数器2端口地址 MY8254_MODE
EQU
IOY1+03H*4
;8254控制寄存器端口地址
IOY2
EQU
3080H
;片选IOY0对应的端口始地址
IOY0
EQU
3000H
;片选IOY0对应的端口始地址
MY8255_A
EQU
IOY0+00H*4
;8255的A口地址 MY8255_B
EQU
IOY0+01H*4
;8255的B口地址 MY8255_C
EQU
IOY0+02H*4
;8255的C口地址
MY8255_MODE EQU
IOY0+03H*4
;8255的控制寄存器地址
STACK1 SEGMENT STACK
DW 256 DUP(?)STACK1 ENDS
DATA
SEGMENT;DTABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H DTABLE DB
06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
NOW_FLOOR
DB 01H-01H
;定义数据变量 DIR
DB 1 TARGET_FLOOR DB 01H-01H
;02H为初始层,出事情况当前层和目标层一样
F_FLOOR
DB 1
;按键有效,空闲
CS_BAK
DW ?
;保存INTR原中断处理程序入口段地址的变量
IP_BAK
DW ?
;保存INTR原中断处理程序入口偏移
地址的变量
IM_BAK
DB ?
;保存INTR原中断屏蔽字的变量 STR1
DB 'COUNT: $'
;显示的字符串
FREQ_LIST DW 371,495,495,495,624,556,495,556,624
;频率表
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416,371
DW 495,833,742,624,624,495,556,495,556,833
DW 742,624,624,742,833,990,742,624,624,495
DW 556,495,556,624,495,416,416,371,495,0 TIME_LIST DB
4, 6, 2, 4, 4, 6, 2, 4, 4
;时间表
DB
6, 2, 4, 4, 12, 1, 3, 6, 2
DB
4, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB
12, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB
6, 2, 4, 4, 12, 4, 6, 2, 4, 4
DB
6, 2, 4, 4, 6, 2, 4, 4, 12
DATA
ENDS
;键值表,0~F对应的7段数码管的段位值
CODE
SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
;初始化中断处理
CLI
MOV AX,0000H
;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX
;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX
;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX
;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX
;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1
;设置中断屏蔽寄存器,打开INTR的屏蔽位
IN AL,DX
MOV IM_BAK,AL
;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
STI
;初始化8254
MOV DX,MY8254_MODE
MOV AL,0B6H
OUT DX,AL
MOV DX,MY8254_COUNT2
MOV AL,00H
OUT DX,AL
MOV AL,48H
OUT DX,AL
MOV DX,MY8254_MODE
MOV AL,76H
OUT DX,AL
MOV DX,MY8254_COUNT1
MOV AL,0C8H
OUT DX,AL
MOV AL,00H
OUT DX,AL
;初始化8255
MOV DX,MY8255_MODE
MOV AL,81H
位输入
OUT DX,AL
MOV DX,IOY2
默认为全灭
MOV AL,0
OUT DX,AL
;初始化8254工作方式
;计数器2,方式3
;装入计数初值
;18432分频
;初始化8254工作方式
;计数器1,方式3
;装入计数初值
;100分频
;初始化8255工作方式
;方式0,A口、B口输出,C口低
4;用IO-32输出控制8个LED,刚开始11
MOV DX,MY8255_MODE
MOV AL,00001110B
;PC7=0
OUT DX,AL
MOV AL,NOW_FLOOR
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
;将键值作为偏移和键值基地址相加得到相应的键值
MOV DX,MY8255_B
OUT DX,AL
BEGIN:
CALL CCSCAN
;扫描按键
JNZ PLAY
;有键按下则跳置GETKEY1
MOV AH,1
;判断PC键盘是否有按键按下
INT 16H
JZ
BEGIN
;无按键则跳回继续循环,有则退出
;退出程序前的一个“太子换狸猫” QUIT: CLI
MOV AX,0000H
;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK
;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK
;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1
;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H
;返回到DOS
INT 21H
GETKEY1:
CALL DALLY
CALL DALLY
CALL CCSCAN
;再次扫描按键
JNZ GETKEY2
;有键按下则跳置GETKEY2
JMP BEGIN
;否则跳回开始继续循环
PLAY:
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
MOV SI,OFFSET FREQ_LIST
MOV DI,OFFSET TIME_LIST
MOV DX,0FH
1.0416667M = 0FE502H
MOV AX,0E502H
DIV WORD PTR [SI]
输出频率
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
CALL DALLY
ADD SI,2
INC DI
;判断是否到曲末?
JE GETKEY1 GETKEY2: CALL DALLY1
MOV DX,MY8254_MODE
0
MOV AL,10H
OUT DX,AL
MOV CH,0FEH
MOV CL,00H
COLUM: MOV AL,CH
;初始化8254工作方式
;定时器0、方式3
;装入频率表起始地址
;装入时间表起始地址
;输入时钟为1.0416667MHz,;取出频率值计算计数初值,0F4240H /
;装入计数初值
;取出演奏相对时间,调用延时子程序
;退出时设置8254为方式2,OUT0置
;设置当前检测的是第几列
;选取一列,将X1~X4中一个置0 13
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
;读Y1~Y4,用于判断是哪一行按键闭合
IN
AL,DX
L1:
TEST AL,01H
;是否为第1行
JNZ L2
;不是则继续判断
MOV AL,00H
;设置第1行第1列的对应的键值
JMP KCODE
L2:
TEST AL,02H
JNZ L3
MOV AL,04H
JMP KCODE
L3:
TEST AL,04H
JNZ L4
MOV AL,08H
JMP KCODE
L4:
TEST AL,08H
JNZ NEXT
MOV AL,0CH
KCODE: ADD AL,CL
按键值
CMP F_FLOOR,1
JNZ KON2
CALL PUTBUF
KON2:
PUSH AX KON:
CALL CCSCAN
JNZ KON
POP AX
NEXT: INC CL
MOV AL,CH
TEST AL,08H
JZ
KERR
ROL AL,1
;是否为第2行
;不是则继续判断
;设置第2行第1列的对应的键值
;是否为第3行
;不是则继续判断
;设置第3行第1列的对应的键值
;是否为第4行
;不是则继续判断
;设置第4行第1列的对应的键值
;将第1列的值加上当前列数,确定
;保存按键值
;扫描按键,判断按键是否弹起
;未弹起则继续循环等待弹起
;当前检测的列数递增
;检测是否扫描到第4列
;是则跳回到开始处
;没检测到第4列则准备检测下一列
MOV CH,AL
JMP COLUM KERR: JMP BEGIN
MYISR PROC NEAR
;中断处理程序MYISR
PUSH AX
MOV AL,DIR
CMP AL,0
JZ
DOWN
CMP AL,2
JZ
UP
JMP OVER
DOWN:
MOV AL,NOW_FLOOR
DEC AL
MOV NOW_FLOOR,AL
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
MOV DX,MY8255_B
OUT DX,AL
JMP BIJIAO UP:
MOV AL,NOW_FLOOR
INC AL
MOV NOW_FLOOR,AL
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
MOV DX,MY8255_B
OUT DX,AL
BIJIAO:
MOV AL,NOW_FLOOR
MOV AH,TARGET_FLOOR
CMP AH,AL
JZ
GUANBI
JMP OVER GUANBI:
MOV DX,MY8255_MODE
MOV AL,00001110B
;PC7=0
OUT DX,AL
MOV DIR,1H
MOV AL,0
MOV DX,IOY2
示目标楼层
OUT DX,AL
MOV F_FLOOR,1
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
MOV SI,OFFSET FREQ_LIST
MOV DI,OFFSET TIME_LIST
MOV DX,0FH
1.0416667M = 0FE502H
MOV AX,0E502H
DIV WORD PTR [SI]
0F4240H / 输出频率
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
序
CALL DALLY
ADD SI,2
INC DI
CALL DALLY1
MOV DX,MY8254_MODE 置0
MOV AL,10H
OUT DX,AL
OVER: MOV DX,INTR_OCW2
令
MOV AL,20H
;用IO-32输出控制8个LED,显
;置1,恢复按键有效
;初始化8254工作方式
;定时器0、方式3
;装入频率表起始地址
;装入时间表起始地址
;输入时钟为1.0416667MHz,;取出频率值计算计数初值,;装入计数初值
;取出演奏相对时间,调用延时子程
;退出时设置8254为方式2,OUT0
;向PC机内部8259发送中断结束命16
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP AX
IRET
MYISR ENDP
CCSCAN PROC NEAR
MOV AL,00H
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN
AL,DX
NOT AL
AND AL,0FH
RET CCSCAN ENDP
PUTBUF PROC NEAR
层
MOV F_FLOOR,0
MOV TARGET_FLOOR,AL
MOV AH,NOW_FLOOR
CMP AH,AL
JNZ PANDUAN
JMP ENDD
PANDUAN:
CMP AL,AH
JB XIAOYU
MOV DIR,2
JMP CHULI XIAOYU:
MOV DIR,0
CHULI:;显示目标楼层的灯
MOV CL,AL
;扫描是否有按键闭合子程序
;将4列全选通,X1~X4置0
;读Y1~Y4
;取出Y1~Y4的反值
;保存键值子程序,AL即为目标楼
;置0,按键失效
;0-7对应1-8层,和当前楼层比较,;不同层就处理,同层不处理
MOV AL,01H
SHL AL,CL
MOV DX,IOY2
;用IO-32输出控制8个LED,显示目标楼层
OUT DX,AL
MOV DX,MY8255_MODE
MOV AL,00001111B
;PC7=1,启动定期是2s定时
OUT DX,AL
ENDD:
PUTBUF ENDP
DALLY PROC NEAR
PUSH CX
MOV CX,00FFH D1:
MOV AX,00FFH D2:
DEC AX
JNZ D2
LOOP D1
POP CX
RET DALLY ENDP
DALLY1 PROC
D00:
MOV CX,200H D10:
MOV AX,0FFFFH D20:
DEC AX
JNZ D20
LOOP D10
DEC DL
JNZ D00
RET DALLY1 ENDP
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向上拨电机正转,向下拨电机反转。当键盘中有任意键输入的时候则程序终止。小结(收获与体会):
实验和理论是相互检验,相互补充和相互促进的,在实际动手动脑运用理论知识的时候,能更深入地领会概念,熟练运用,在此基础上方能进行创新和自由发挥。通过本次实验,我了解了步进电机控制的基本原理,掌握了控制步进电机转动的编程方法。更加深入地了解了微机原理这门课程。
第三篇:微机原理实验报告
学号: 学生姓名: 打印日期: 评分: 评语:
实验报告
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如何控制其他元器件输入输出数据有了清晰的认识。通过使用模拟软件,我有了更多的方式去深入了解课本上的知识。
第四篇:北京交通大学微机原理实验报告(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
第五篇:微机原理与接口技术 实验报告一
评
阅
微机原理与接口技术
实验报告一
姓名
匡越
学号
1715211016
时间
地点
实验题目
一、实验目的1.熟悉Keil软件使用
2.熟悉MCS-51指令
3.学习简单程序的调试方法
二、实验说明
通过实验了解单片机内部存储器的结构和分配及读写存储器的方法,熟悉MCS-51指令同时,学习单片机程序编程、调试方法。
三、实验内容及步骤
1.启动PC机,打开Keil软件,软件设置为模拟调试状态。在所建的项目文件中输入源程序1,进行编译,如有错误按提示找到该行并纠错,重新编译直到通过。
2.编译无误后,打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化并将观察到的结果记录到预习报告。
3.新建另一个项目输入源文件2,打开CPU窗口,选择单步或跟踪执行方式运行程序,观察存储块数据变化情况记录到预习报告。点击复位按钮,改变存储块数据,点击全速执行快捷按钮,点击暂停按钮,观察存储块数据变化情况,记录到预习报告。点击复位按钮,改变存储块数据,分别LOOP、LOOP1设置断点,点击全速执行快捷按钮,在断点处观察寄存器及存储块数据变化情况。
WAVE软件使用方法参考其帮助文件。
四、实验程序流程框图、实验程序
1、源程序1
ORG
0000H
AJMP
MAIN
ORG
0030H
MAIN:
MOV
R0,#30H;
(R0)=
(00H)=
MOV
A,#40H;
(A)=
MOV
R6,A;
(A)=,(R6)=
MOV
A,@R0;
(R0)=
(A)=
MOV
40H,A;
(A)=
(40H)=
MOV
30H,40H;
(30H)=
(40H)=
MOV
R1,#40H;
(R1)=
MOV
@R1,#0AAH;(R1)=
(40H)=
MOV
SP,#60H;
(SP)=
PUSH
ACC;
(SP)=
(61H)=
PUSH
30H;
(SP)=
(62H)=
MOV
A,#0FFH;
(SP)=
(A)=
MOV
30H,#30H;
(SP)=
(30H)=
POP
ACC;
(SP)=
(A)=
POP
30H;
(SP)=
(30H)=
ADD
A,30H;
(30H)=
(A)=
Cy=
SUBB
A,#10;
(A)=
Cy=
MOV
R4,#00100100B;
(R4)=
H
MOV
A,#39H;
(A)
=
ADD
A,R4;
(A)
=
(R4=)
DA
A;
(A)
=
Cy=
MOV
28H,#55H;(28H)
=
Cy=
MOV
C,40H;
(PSW)
=
Cy=
MOV
26H,#00H;(26H)
=
Cy=
MOV
30H,C;
(30H)
=
(26H.1)
=
SJMP
$
j点击project,选择下拉式菜单中的New
project;
k选择所要的单片机,这里我们选择常用的Ateml
公司的AT89C51;
l新建一个File,输入源程序;
m将新建文件保存为text.asm的格式;
n鼠标在屏幕左边的Source
Group1
文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。选“Add
File
to
Group
‘Source
Group
1’”弹出文件窗口,选择刚刚保存的文件;
o对程序进行编译运行;
使程序一得:
ORG
0000H
AJMP
MAIN
ORG
0030H
MAIN:
MOV
R0,#30H
;
(R0)=
0x30
(00H)=
0x0000
MOV
A,#40H
;
(A)=
0x40
MOV
R6,A
;
(A)=
0x40,(R6)=
0x40
MOV
A,@R0
;
(R0)=
0x30
(A)=
0x16
MOV
40H,A
;
(A)=0x16
(40H)=
0x0040
MOV
30H,40H
;
(30H)=
0x0030
(40H)=
0x0040
MOV
R1,#40H
;
(R1)=
0x40
MOV
@R1,#0AAH;(R1)=
0x40
(40H)=
0x0040
MOV
SP,#60H;
(SP)=
0x60
PUSH
ACC;
(SP)=
0x61
(61H)=
0x0061
PUSH
30H;
(SP)=
0x62
(62H)=
0x0062
MOV
A,#0FFH;
(SP)=
0x62
(A)=
0xff
MOV
30H,#30H;
(SP)=
0x62
(30H)=
0x0030
POP
ACC;
(SP)=
0x61
(A)=
0x16
POP
30H;
(SP)=
0x60
(30H)=
0x0030
ADD
A,30H;
(30H)=
0x0030
(A)=
0x2a
Cy=
0
SUBB
A,#10;
(A)=
0x20
Cy=
0
MOV
R4,#00100100B;
(R4)=
0x24
H
MOV
A,#39H;
(A)
=
0x39
ADD
A,R4;
(A)
=
0x5d
(R4=)
0x24
DA
A;
(A)
=
0x63
Cy=
0
MOV
28H,#55H;(28H)
=
0x0028
Cy=
0
MOV
C,40H;
(PSW)
=
0x80
Cy=
MOV
26H,#00H;(26H)
=
0x0026
Cy=
MOV
30H,C;
(30H)
=
0x0030
(26H.1)
=
0
SJMP
$
2、源程序2
设(30H)=4,(31H)=1,(32H)=3,(33H)=5,(34H)=2,(35H)=6
ORG
0000H
AJMP
MAIN
ORG
0030H
MAIN:
MOV
R0,#30H;30H→R0
MOV
R2,#6;6→R2
SORT:
MOV
A,R0;30H→A
MOV
R1,A;30H→R1
MOV
A,R2;6→A
MOV
R5,A;6→R5
CLR
F0;
状态标志位清零
DEC
R5;寄存器R5减一
MOV
A,@R1;R1→A
LOOP:
MOV
R3,A;A→R3
INC
R1
;寄存器R1增1
CLR
C
;进位标志位清零
MOV
A,@R1;31H→A
SUBB
A,R3;累加器内容减去寄存器内容
JNC
LOOP1;仅为标志位为1,则进行LOOP1
;以下代码完成数据交换
SETB
F0;状态标志位置1
MOV
A,@R1;31H→A
XCH
A,R3;将A于与R3的数据交换
MOV
@R1,A;将4赋值给寄存器R1(31H)
DEC
R1;寄存器减一
MOV
A,R3;1→A
MOV
@R1,A;将1赋值给寄存器R1(30H)
INC
R1;寄存器R1增一
LOOP1:
MOV
A,@R1;4→A
DJNZ
R5,LOOP;寄存器R5减一,不为零则回到LOOP
JB
F0,SORT;状态标志位为零,则回到SORT
SJMP
$