微机原理及应用实验指导书汇编语言资料.docx
《微机原理及应用实验指导书汇编语言资料.docx》由会员分享,可在线阅读,更多相关《微机原理及应用实验指导书汇编语言资料.docx(25页珍藏版)》请在冰豆网上搜索。
微机原理及应用实验指导书汇编语言资料
实验一 8251A串行通讯
一、实验目的
1.了解串行通讯的基本原理
2.掌握串行接口芯片 8251的工作原理和编程方法
二、实验内容
1、按图4连接好电路,(8251插通用插座)其中8253计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。
2、编程:
从键盘输入一个字符,将其ASCII码加 1 后发送出去,再接收回来在屏幕上显示,实现自发自收。
三、硬件接线图与程序流程图
硬件连接图:
流程图:
四、 实验源程序
DATA SEGMENT
STRING DB 'PLEASE INPUT A CHARACTER:
',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?
)
STACK ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA,SS:
STACK
START:
MOV AX,DATA
MOV DS,AX
MOV DX,0283H
MOV AL,16H 00010110
OUT DX,AL
MOVDX,0280H; 设置8253A计数器0的初值
MOV AL,34H;
OUT DX,AL
MOVDX,02B9H;初始化8251
MOV AL,40H
CALL OUT1
MOV AL,4EH;01001110方式控制字
CALL OUT1
MOV AL,27H;00100111向8251命令控制字,允许其发送和接收
CALL OUT1
MOV DX,SEG STRING
MOV DS,DX
MOV DX,OFFSET STRING
MOV AH,09H
INT 21H
WAIT1:
MOV DX,02B9H
IN AL,DX
TESTAL,01H;发送是否准备好
JZ WAIT1
MOV AH,01H
INT 21H
CMP AL,1BH
JZ EXIT
INC AL
MOV DX,02B8H
OUT DX,AL;发送
MOV CX,0040H
LOP1:
LOOP LOP1
NEXT:
MOV DX,02B9H
IN AL,DX
TEST AL,02H;检查接收是否准备好
JZ NEXT
MOV DX,02B8H
IN AL,DX;准备好,接收
MOV DL,AL
MOV AH,02H
INT 21H
JMP WAIT1
EXIT:
MOV AH,4CH
INT 21H
OUT1 PROC NEAR;向端口输出一字节的子程序
OUT DX,AL
PUSH CX
MOV CX,0040H
LOP2:
LOOP LOP2
POP CX
RET
OUT1 ENDP
CODE ENDS
END START
五、 实验结果
运行程序,屏幕显示提示输入,输入一个字符后同时显示这个字符的ASCII码值加一的ASCII码所代表的字符,例如输入1,显示2.
六、 实验总结
本次试验主要是对串行接口芯片8251的理解与运用。
模拟的是两台计算机之间的通信,所以适合使用异步通信方式。
通过这次实验,我学习了串口通信的相关知识,也学习了8251芯片的使用方法。
作为串行通信接口,时序是非常重要的,输入输出之间的时间差必须控制得合适,否则就不能正常收发,这可以通过软件编程实现,当时序不符合时,可插入等待时间,即软件延时来解决。
实验完成后对8251的工作原理有了更加深入的理解,也对异步通信和同步通信的区别与特点有了更加生动的认识。
实验二 8255可编程并行接口(方式0)
一、实验目的
掌握8255方式0的工作原理及使用方法
2、实验内容
(1)实验电路如图6,8255C口接逻辑电平开关K0—K7,A口接LED显示电路L0—L7
(2)编程从8255C口输入数据,再从A口输出数据
三、源程序:
DATA SEGMENT
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?
)
STACK ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA,SS:
STACK
START:
MOV AX,DATA
MOV DS,AX
MOV DX,28BH;8255初始化,10001001,C口输入,A口输出
MOV AL,89H
OUT DX,AL
LOOP1:
MOVDX,28AH;C口输入
INAL,DX
MOVDX,288H;A口输出
OUTDX,AL
MOVAL,01H
JNT16H
JNZEXIT;ZF=0说明有按键输入,故退出
JMPLOOP1
EXIT:
MOVAX,4COOH
INT21H
CODEENDS
ENDSTART
4、实验结果
拨动K0—K7,对应的L0-L7亮,有按键输入则退出
5、实验总结
8255芯片需要设置好控制字,然后进行读写控制操作。
实验三 8253可编程定时器/计数器
一、实验目的
掌握8253的基本工作原理和编程方法
二、实验内容
按图7虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
按图8连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。
三、编程提示
1、8253控制寄存器地址283H
计数器0地址280H
计数器1地址281H
CLK0连接时钟1MHZ
2、参考流程图
四、实验代码
1、图7电路的实验代码
CODESEGMENT;段定义开始(CODE段)
ASSUMECS:
CODE;规定CODE为代码段
START:
MOVAL,10H;设置控制字00010000(计数器0,方式0,写两个字节,二进制计数)
MOVDX,283H;把控制寄存器地址放在DX寄存器中
OUTDX,AL;将AL的值送入DX端口
MOVDX,280H;把计数器0地址放在DX寄存器中
MOVAL,0FH;将0FH存入AL寄存器
OUTDX,AL;将此时AL的值送入DX端口
LP1:
INAL,DX;从DX端口读入8位,放在AL寄存器中
CALLDISP;调用DISP
PUSHDX;将DX内容保存到堆栈段
MOVAH,06H;将06H存入AH,为了下句调用21中断
MOVDL,0FFH;将0FFH存入DL
INT21H;调用21中断
POPDX;将DX的内容推出栈段
JZLP1;如果DX的内容是0,就跳转到LP1
MOVAH,4CH;将4CH存入AH,为了下句调用21中断
INT21H;调用21中断
DISPPROCNEAR;定义一个名为DISP的子程序
PUSHDX;把DX的内容保存到堆栈段中
ANDAL,0FH;将AL寄存器的内容与0FH进行“与”运算,再把结果存入AL中
MOVDL,AL;将AL的值送入DL寄存器
CMPDL,9;比较DL中的值与9的大小
JLENUM;如果DL的值小于或等于9时,则跳转到NUM
ADDDL,7;将DL的值与7进行相加后,再送入DL中
NUM:
ADDDL,30H;将DL的值与30H进行相加后,再送入DL中
MOVAH,02H;将02H存入AH
INT21H;调用DOS21中断
MOVDL,0DH;结合“MOVAH,02H”就是说输出0DH
INT21H;调用中断指令
MOVDL,0AH;结合“MOVAH,02H”就是说输出0AH
INT21H;调用DOS21中断
POPDX;将DX的内容推出栈段
RET;子程序在功能完成后返回调用程序继续执行
DISPENDP;子程序结束
CODEENDS;代码段结束
ENDSTART;程序结束
2、图8电路的实验代码
CODESEGMENT;段定义开始(CODE段)
ASSUMECS:
CODE;规定CODE为代码段
START:
MOVDX,283H;把控制寄存器地址放在DX寄存器中
MOVAL,36H;设置控制字00110110(计数器0,方式3,写两个字节,二进制计数)
OUTDX,AL;将AL的值送入DX端口
MOVAX,1000H;该语句是立即寻址方式,就是把1000H这个数赋给AX
MOVDX,280H;把计数器0地址放在DX寄存器中
OUTDX,AL;将AL的值送入DX端口
MOVAL,AH;将AX的高8位存入AL寄存器中
OUTDX,AL;将此时AL的值送入DX端口
MOVDX,283H;把端口地址放在DX寄存器中
MOVAL,76H;设置控制字01110110(计数器1,方式3,写两个字节,二进制计数)
OUTDX,AL;将AL的值送入DX端口
MOVAX,1000H;把1000H赋给AX
MOVDX,281H;把端口地址放在DX寄存器中
OUTDX,AL;将AX的低8位送入DX端口
MOVAL,AH;将AX的高8位存入AL寄存器中
OUTDX,AL;将AL的值送入DX端口
MOVAH,4CH;将4CH存入AH
INT21H;调用DOS21中断
CODEENDS;代码段结束
ENDSTART;程序结束
五、实验总结
通过实验,学会8253芯片和微机接口原理和方法,掌握8253定时器/计数器的基本工作原理、工作方式和编程原理,熟悉汇编代码的编写。
实验中,连接电路,利用代码控制实验电路,深对课本理论的理解。
实验四 七段数码管
1、实验目的
掌握数码管显示数字的原理
2、实验内容
1. 静态显示:
按图 10(A)连接好电路,将8255的A口PA0-PA6分别与七段数码管的断码驱动输入端A-G相连,位码驱动输入端S1接+5V(选中),S0、DP接地(关闭)。
编程从键盘输入一位十进制数字(0-9),在七段数码管上显示出来。
2.动态显示:
按图10(B)连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255C口的PC1,PC0。
编程在两个数码管上显示“56”
3、流程图:
3、源程序
静态显示:
DATA SEGMENT
IOPORT EQU 0C800H-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 AL,80H;10000000B,控制字PA以方式0输出
OUT DX,AL
ZBY:
MOV DX,OFFSET MESG1 显示提示信息
MOV AH,09H INT 21H
MOV AH,01 ;从键盘接收字符 INT 21H
CMP AL,'0';是否小于0
JL EXIT ;如若小于0,则跳转到EXIT退出程序
CMP AL,'9' ;是否大于9
JG EXIT;如若大于9,则跳转到EXIT退出程序
SUB AL,30H ;将所得字符的ASCII码减30H,数字键ASCII码同数值转换
MOV BX,OFFSET LED;BX为数码表的起始地址
XLAT;求出相应的段码
MOV DX,IO8255A ;从8255的A口输出
OUT DX,AL
JMP ZBY ;转ZBY
EXIT:
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
动态显示:
DATA SEGMENT
IOPORT EQU 0C800H-0280H
IO8255A EQU IOPORT+28AH
IO8255B EQU IOPORT+28BH
IO8255C EQU IOPORT+288H
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 段码
BUFFER1 DB 5,6 ;存放要显示的个位和十位
BZ DW ;位码
DATA ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,IO8255B;将8255设为A口输出
MOV AL,80H ;10000000B,控制字PA以方式0输出
OUT DX,AL
MOV DI,OFFSET BUFFER1;设DI为显示缓冲区
LOOP2:
MOV BH,02
ZBY:
MOV BYTE PTR BZ,BH
PUSH DI
DEC DI
ADD DI, BZ
MOV BL,[DI];BL为要显示的数
POP DI
MOV AL,0
MOV DX,IO8255A
OUT DX,AL
MOV CX,3000
DELAY:
LOOP DELAY 延时
MOV BH,BYTE PTR BZ
SHR BH,1
JNZ ZBY
MOV DX,0FFH
MOV AH,06
INT 21H
JE LOOP2 ;有键按下则退出
MOV DX,IO8255A
MOV AL,0 ;关掉数码管显示 OUT DX,AL
MOV AH,4CH;返回
INT 21H
CODE ENDS
END START
四、运行结果:
静态显示:
在键盘上输入一个0-9的任意数字,会显示在数码管上
动态显示:
在程序中写入6,5,读取顺序是第一位是个位,第二位是十位,数码管上显示56.
5、实验总结
静态显示是从键盘获取一个数值,然后通过程序比较得出键盘输入的数字量,由PA端口输出到数码管上。
而动态显示是将两个数字写入程序中,由程序读取数字然后按位输出到数码管上显示。
原理说得简单,但是程序本身个人感觉还是相当复杂的,尤其动态显示,程序如何读取已输入的数字,以及读取数字的顺序都会影响到数码管的显示。
静态显示过程中,我们碰到数码管一直显示8的状态,这并不是预期的效果。
后来发现,由于在程序中用符号定义伪指令EQU将所要用到的算口地址用“IO8255A”定义,但在写程序的过程中又写进去了十六进制实际地址,导致出现问题,经过很长时间的调试方才解决。
实验五竞赛抢答器
一、实验目的
1、了解微机化竞赛抢答器的基本原理。
2、进一步学习使用并行接口。
二、实验内容
图12为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。
在七段数码管上将其组号(0~7)显示出来,并使微机扬声器响一下
电路图:
流程图:
3、源程序
DATA SEGMENT
IO8255A EQU 28AH
IO8255B EQU 28BH
IO8255C EQU 288H
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;数码表
DATA ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,IO8255B ;设8255为A口输出,C口输入
MOV AX,89H OUT DX,AL
MOV BX,OFFSET LED ;使BX指向段码管首址 SSS:
MOV DX,IO8255A
IN AL,DX ;从8255的C口输入数据
OR AL,AL ;比较是否为0
JE SSS ;若为0,则表明无键按下,转SSS
MOV CL,0FFH ;CL作计数器,初值为-1
RR:
SHR AL,1
INC CL
JNC RR
MOV AL,CL
XLAT
MOV DX,IO8255C
OUT DX,AL
MOV DL,7 ;响铃 ASCII码为07
MOV AH,2 INT 21H
WAI:
MOV AH,1
INT 21H
CMP AL,20H ;是否为空格
JNE EEE ;不是,转EEE
MOV AL,0 ;是,关灭灯
MOV DX,IO8255C
OUT DX,AL
JMP SSS
EEE:
MOV AH,4CH ;返回
INT 21H
CODE ENDS
END START
4、实验现象
逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。
在七段数码管上将其组号(0~7)显示出来,并使微机扬声器响一下。
五、实验总结
通过此次实验,首先我懂得了有关竞赛抢答器的知识,我们了解到,即使书本上的知识掌握得再好,在将它付诸实践时,还是会碰到各种各样的问题。
这次课程设计就是一次对自己所学知识的总结与综合运用,使我们对这微机原理这门课程有了更深的了解同时也明白了实验不单是搞懂软件方面内容,也要注重硬件的配合及原理。
这次实验虽然程序不是自己编写,但我至少弄懂了大部分,收获良多。
实验六步进电机控制实验
1、实验目的
(1)了解步进电机控制的基本原理
(2)掌握控制步进电机转动的编程方法
2、实验内容
1、按图14连接线路,利用8255输出脉冲序列,开关K0-K6控制步进电机转速,K7控制步进电机转向。
8255 CS接288H-28FH。
PA0-PA3接BA-BD;PC0-PC7接KO-K7。
2、 编程:
当K0-K7中的某一个开关为“1”是步进电机启动。
K7向上拨电机正传,向下拨电机反转。
实验原理图:
流程图:
3、源程序
DATA SEGMENT
P55A EQU 288H ; 定义P55A为8255A的端口地址
P55C EQU 28AH ; 定义P55C为8255C的端口地址
P55CTL EQU 28BH ; 定义P55CTL为8255控制端口地址
BUF DB 0 ;定义一个字节数据(用来存放开关状态)
MES DB 'K0-K6 ARE SPEED CONTYOL',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;程序的初始化,给DS,CS赋值
MOV DX,OFFSET MES
MOV AH,09
INT 21H;调用DOS功能,显示字符串
MOV DX,P55CTL
MOV AL,90H
OUT DX,AL;8255 A 初始化
MOV BUF,33H;BUF初始化为00110011B
OUT1:
MOV AL,BUF;将BUF值置入AL寄存器并输出
MOV DX,P55C
OUT DX,AL
PUSH DX
MOV AH,06H
MOV DL,0FFH
INT 21H;判断是否有键按下
POP DX