一. 实验要求
将两个多位十进制数相减,要求被减数,减数均以ASCII码形式按顺序存放在以 DATAI和DATA2为首的5个内存单元中(低位在前),结果送回DATAI处。 二、实验目的
1.学习数据传送和算术运算指令的用法。
2.熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,38H ;第一个数据(作为被减数) DATA2 DB 36H,35H,30H,38H,32H ;第二个数据(作为减数)
MES1 DB '-','$' MES2 DB '=','$' DATA ENDS
STACK SEGMENT ;堆栈段 STA DB 20 DUP() TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV SI,OFFSET DATA1 MOV BX,05
CALL DISPL ;显示被减数 MOV AH,09H LEA DX,MES1 INT 21H
MOV SI,OFFSET DATA2
MOV BX,05 ;显示减数 CALL DISPL MOV AH,09H LEA DX,MES2
INT 21H
MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2
CALL SUBA ;减法运算 MOV SI,OFFSET DATA1
MOV BX,05 ;显示结果 CALL DISPL MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H INT 21H MOV AX,4C00H INT 21HDISPL PROC NEAR ;DSI: MOV AH,02 MOV DL,[SI+BX-1] ; INT 21H DEC BX ; JNZ DSI RET DISPL ENDP SUBA PROC NEAR MOV DX,SI MOV BP,DI
显示子功能 显示字符串中一字符修改偏移量 MOV BX,05
SU1: SUB BYTE PTR[SI+BX-1],30H SUB BYTE PTR[DI+BX-1],30H
DEC BX ;将ASCII 码表示的数字串 JNZ SU1 ;转化为十六进制的数字串 MOV SI,DX MOV DI,BP MOV CX,05 ; CLC ;SU2: MOV AL,[SI] MOV BL,[DI] SBB AL,BL ; AAS ; MOV [SI],AL ; INC SI INC DI ; LOOP SU2 ; MOV SI,DX MOV DI,BP MOV BX,05SU3: ADD BYTE PTR [SI+BX-1],30H ADD BYTE PTR [DI+BX-1],30H DEC BX ; JNZ SU3 RET SUBA ENDP CODE ENDS
包括进位,共5位 清进单位
带进位相减
非组合BCD码的减法调整 结果送被减数区
指向下一位 循环
十六进制的数字串转化ASCII码表示的数字串 END START
实验二 两个数相乘的实验
一. 实验要求
实现十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,算式结果 在屏幕上显示出来。 二.
实验目的
掌握乘法指令和循环指令的用法。
DATA SEGMENT
DATA1 DB 32H,39H,30H,35H,34H DATA2 DB 34H MES1 DB '*','$' MES2 DB '=','$' RESULT DB 6 DUP (00H) DATA ENDS STACK SEGMENT STA DB 20 DUP () TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP LEA SI,DATA1 MOV BX,05H L1: MOV AH,02H MOV DL,[SI+BX-1] INT 21H DEC BX JNZ L1 MOV AH,09H LEA DX,MES1
INT 21H LEA SI,DATA2 MOV AH,02H MOV DL,[SI] INT 21H MOV AH,09H LEA DX,MES2 INT 21H MOV SI,OFFSET DATA2 ; MOV BL,[SI] ; AND BL,00001111B ; MOV SI,OFFSET DATA1 MOV DI,OFFSET RESULT MOV CX,05LOOP1: MOV AL,[SI] AND AL,00001111B ; INC SI ; MUL BL ; AAM ;AAM ADD AL,[DI] ; AAA ;AAA MOV [DI],AL INC DI ; MOV [DI],AH LOOP LOOP1 ; MOV CX,06 MOV SI,DI
显示算式 乘数DATA2→BL
屏蔽高4位,ASCII码转化为十六进制数
取被乘数DATA1,ASCII变十六进制数 指向被乘数1的下一字符单元 相乘 调整
结果低位与前次计算的进位相加 调整
结果送存到下一单元
计算结果高位进位送存
DISPL: MOV AH,02 MOV DL,[SI] ADD DL,30H INT 21H DEC SI
LOOP DISPL ;显示结果 MOV AX,4C00H INT 21H ;结束 CODE ENDS
END START
实验三 BCD码相乘的实验
一.
实验要求
实现BCD码的乘法,要求被乘数和乘数以组合的BCD码形式存放,各占一个内
存单元,乘积存入在另外两个内存单元中,由于没有组合的BCD码乘法指令,程序中采用 将乘数1作为计算器,累加另一个乘数的方法得到计算结果。 二.
实验目的
掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算。
DATA
SEGMENT
FIRST DB 99H SECOND DB 25H THIRD DB 2 DUP() MES1 MES2 DATA
DB '*','$' DB '=','$' ENDS
STACK SEGMENT PARA STACK 'STACK'
STAPN DB 100 DUP() TOP EQU LENGTH STAPN STACK ENDS CODE
SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV BL,FIRST ;
MOV CL,SECOND ; MOV DX,0 ;
MOV AL,BL
AGAIN: OR AL,AL JZ DONE ; MOV AL,DL ADD AL,CL
DAA ; MOV DL,AL MOV AL,DH ADC AL,0
DAA ; MOV DH,AL MOV AL,BL
DEC AL
被乘数送BL 乘数送CL
部分积清0 被乘数减到0则转结果显示 乘数于部分积低位相加后调整往部分积高位送进位后调整
DAS ;组合BCD码减法调整 MOV BL,AL JMP AGAIN
DONE: LEA BX,THIRD
MOV [BX],DX LEA SI,FIRST CALL
DIS
XOR AX,AX MOV AH,09H LEA INT LEA CALL
DX,MES1 ;* 21H SI,SECOND DIS
XOR AX,AX LEA
DX,MES2 ;=
MOV AH,09H INT LEA INC CALL DEC SI CALL
DIS DIS
21H SI,THIRD SI
MOV AX,4C00H ;返回DOS INT 21H
DIS PROC NEAR ;显示子程序
MOV AL,[SI] MOV CL,04H
SHR AL,CL ADD AL,30H MOV DL,AL MOV AH,02H INT 21H MOV AL,[SI] AND AL,0FH ADD AL,30H MOV DL,AL MOV AH,02H INT 21H RET DIS ENDP
ENDS
CODE
END START
实验一 双色灯实验
一、实验要求
编写程序,以8255为输出口,控制四个双色灯按要求发光。 二、实验目的
1.学习单板方式下扩展简单I/O接口的方法以双色灯的使用。 2.进一步学习微处理器的编程技术。 三、实验电路连线
8255的CS片选接至适配板上138译码处的200H~207H插孔。 四、实验说明
1、 因为本实验是模拟交通灯控制实验,所以要先了解实际交通灯的变化规律。假设一 个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1南北绿灯通 车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,
东西仍然红灯。再转状态,东西绿灯通车,南北灯灯。过一段时间转状态4,东西绿灯闪几 次转亮黄灯,延时几秒,南北仍然红灯。最后循环至状态1。
2、 双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当 红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平 时,绿灯亮;两端都加高电平时,黄灯亮。
;实验一 双色灯实验
D1 EQU 10H D2 EQU 200H DATA SEGMENT PB DB DATA ENDS
STACK SEGMENT STACK STA DW 50 DUP() TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:
PUSH CS POP DS
MOV DX,203H ; MOV AL,80H OUT DX,AL MOV DX,200H MOV AL,0ffh
OUT DX,AL ; MOV DX,200H MOV AL,0F0H
OUT DX,AL ; MOV BX,7fH CALL DLY
BG: MOV AL,01011010B ; OUT DX,AL
设置为全输出 清LED 全红 南北绿,东西红 MOV BX,D2 CALL DLY MOV CX,03H
XH1: AND AL,0F5H ;绿灭黄亮 OUT DX,AL MOV BX,D1 CALL DLY OR AL,0aH ; OUT DX,AL MOV BX,D1 CALL DLY LOOP XH1 OR AL,0a0H ; OUT DX,AL MOV BX,D1 CALL DLY MOV BX,D1 CALL DLY MOV AL,B ; OUT DX,AL MOV BX,D2 CALL DLY MOV CX,03XH2: AND AL,0FaH OUT DX,AL MOV BX,D1 CALL DLY
绿亮
南北黄
南北红,东西绿
OR AL,05H OUT DX,AL MOV BX,D1 CALL DLY LOOP XH2 OR AL,50H OUT DX,AL MOV BX,D1 CALL DLY MOV BX,D1 CALL DLY JMP BG DLY PROC NEAR PUSH CX DDD: MOV CX,2ffH CCC: LOOP CCC DEC BX CMP BX,0 JNE DDD POP CX RET
DLY ENDP CODE ENDS END START
实验二 开关状态显示实验
一、实验要求
编写程序,设定8255的PA口为开关量输入,PB口为开关量输出,要求能随时将PA
口的开关状态通过PB口的发光二极管显示出来。 二、实验目的
学习使用8255各个口的不同工作方式 三、实验电路连接
将K1~K8用连接至8255的PB0~PB7,将DL1~DL8用连线连至8255的PC0~PC7, 8255CS连至译码处的200~207插孔。 四、实验说明
本实验要求8255工作方式0,PB口设置为输入,PC口设置为输出,输入量为开关量, 通过8255可实时显示在LED灯上。按下HALT或RST键则返回监控。
;实验二 开关状态显示实验 STACK SEGMENT STACK
STA DW 50 DUP() TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,SS:STACK START:
MOV DX,203H ;设置为b口输入,c口输出 MOV AL,92H
OUT DX,AL
BG: MOV DX,201H ;将b口状态从c口输出
IN AL,DX MOV DX,202h OUT DX,AL JMP BG CODE ENDS
END START
实验五 A/D转换实验
一、实验要求
编程用查询方式采样电位器输入电压,并将采样到的结果实时地通过8279显示在 数码管上。(只须显示一位即可。用0~F表示0~+5V电压)。 二.实验目的
1.掌握A/D芯片AD0809的转换性能及编程方法。
2.学习A/D芯片与其他芯片(如8279)接口的方法,初步建立系统的概念。 三.实验电路及连线
CS79接译码处210~217这个插孔。A/D的CS插译码处208~20F这个插孔,0809的IN0 接至电位器W1的中心抽头插孔。
注意:电位器W1两边的两个插孔已经分别接好电源+5V和地,请不要再接,以防接
错,出现短路。 四、实验说明
本实验中所用A/D转换芯片为逐次逼近型,精度为8位每转换一次约100微钞,所以 程序若为查询式,则在启动后要加适应延时。另外,0809芯片提供转换完成信号(EOC), 利用此信号可实现中断采集。有兴趣者可自行编制程序。
Z8279 EQU 212H D8279 EQU 210H
LEDMOD EQU 00 ;左边输入,八位显示外部译码八位显示 LEDFEQ EQU 38H ;扫描频率 CODE SEGMENT
ASSUME CS:CODE,DS:code START: push cs pop ds call delay MOV DX,Z8279 MOV AL,LEDMOD OUT DX,AL MOV AL,LEDFEQ OUT DX,AL
MOV CX,06H
XZ: MOV DX,D8279 MOV AL,00H OUT DX,AL LOOP XZ
MOV DX,D8279 MOV AL,5eH OUT DX,AL MOV DX,D8279 MOV AL,77H
OUT DX,AL ;
以上为写(AD ) NOP
bg: mov dx,208h
mov al,0 out dx,al call delay in al,dx
mov cl,04h ror al,cl
and al,0fh
push ax mov dx,z8279
mov al,81h out dx,al pop ax LEA BX,LED XLAT
MOV DX,D8279 ;将AL中内容写到数码管上 OUT DX,AL call delay jmp bg
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H DB 5EH,79H,71H delay proc near
push cx mov cx,01f00h
loop $ pop cx
ret delay endp
CODE ENDS
END START
实验六 D/A转换实验
一、实验要求
编写程序,使D/A转换模块循环输出三角波和锯齿波。 二、实验目的
1.掌握DAC0832芯片的性能、使用方法及对应硬件电路。 2.了解D/A转换的基本原理。 三、实验电路连线
DAC0832的片选CS孔接译码处208-20F插孔(注:0832旁的短路帽应下插,做51实验时应上插)。 四、实验说明
D/A转换是量转化成模拟量的过程,本实验输出为模拟电压信号,本次实验生成的波形 较为简单,有兴趣者可试编程序生成各种波形,如方波,正弦波等,也可与键盘显示模块结 合起来,构成一个简单的波形发生器,通过键盘输入各种参数,如频率,振幅(小于+5V), 方波的占空比等。
CODE SEGMENT
ASSUME CS:CODE,DS:code,SS:code START: push cs pop ds BG: NOP
MOV DX,208H ;锯齿波 MOV AL,00H MOV CX,07ffH
BB:
OUT DX,AL
ADD AL,01 CMP AL,00H JNZ BB LOOP BB NOP
MOV AL,00H MOV CX,07ffH
EE:
OUT DX,AL FF:
OUT DX,AL
SUB AL,01H CMP AL,00H JNE FF LOOP EE ADD AL,01H CMP AL,0FFH JNE EE
JMP BG
CODE ENDS
END START
实验九 步进电机驱动实验
一、实验要求
利用8255的PC口PC-PC3轮流输出脉冲序列,小键盘控制步进电机的转速和转动方 向。 二、实验目的
1、 了解控制步进电机的基本原理。 2、 掌握控制步进电机转动的编程的方法。 三、实验连线
用硬导线将8255选信号CS接至200-207,PC0-PC3接至SMA-SMD。将 8279的片选信号CS接至208-20F。
在运行过程中,可按动小键盘的“0-9”数码键,控制步进电机的转速, 按“+或-”键控制步进电机的方向,按“REG”键退出。
C8279 EQU 20AH D8279 EQU 208H C8255 EQU 203H P8255C EQU 202H CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:PUSH CS POP DS INI:MOV DX,C8255 MOV AL,90H
OUT DX,AL ;8255初始化 MOV DX,C8279 MOV AL,00H OUT DX,AL MOV AL,2AH
OUT DX,AL ;8279初始化 MOV AL,0D1H
OUT DX,AL ;关显示 WAIT1:IN AL,DX MOV AH,AL AND AL,80H
JNZ WAIT1 ;FIFO正在清除期间则跳转等待 MOV AL,AH AND AL,0FH CMP AL,00H
JE WAIT1 ;无键按下则跳转等待 LEA BX,STEP RUN:CALL CHKKEY CALL DISPLAY
MOV CX,08H ;步进电机控制 LOOP3:MOV DX,P8255C MOV AL,[SI] OUT DX,AL
INC SI CALL DELAY LOOP LOOP3 JMP RUN CHKKEY PROC NEAR RDKEY:MOV DX,C8279 IN AL,DX MOV AH,AL AND AL,80H CMP AL,80H JE RDKEY MOV AL,AH AND AL,0FH CMP AL,00H JE RTN
MOV AL,40H
OUT DX,AL ;读FIFO/传感器RAM命令 MOV DX,D8279 IN AL,DX CHK:CMP AL,38H
JE QUIT ;RST 退出
CMP AL,30H ;键值大于30H,为方向控制键 JNC DIRE MOV DELAYTIME,AL JMP RTN
DIRE:CMP AL,32H ;HERE 顺时针 JNE NEXT MOV DIRDSP,40H LEA BX,STEP JMP RTN
NEXT:CMP AL,33H ;EXEC 逆时针 JNE RTN MOV DIRDSP,46H LEA BX,STEP
ADD BX,08H ;逆时针控制表地址 RTN:
MOV SI,BX RET CHKKEY ENDP QUIT:MOV DX,C8279 MOV AL,0D2H OUT DX,AL jmp $ DELAY PROC NEAR PUSH CX
;判断键值,获得相应延时循环值 MOV AL,20H ;\"9\" SUB AL,DELAYTIME JNZ L1 MOV CX,04H
L1: MOV AL,08H ;\"8\" SUB AL,DELAYTIME
JNZ L2 MOV CX,05H
L2: MOV AL,00H ;\"7\" SUB AL,DELAYTIME JNZ L3
L3: MOV AL,21H ;\"6\" SUB AL,DELAYTIME MOV CX,07H JNZ L4 MOV CX,08H
L4: MOV AL,09H ;\"5\" SUB AL,DELAYTIME JNZ L5 MOV CX,09H
L5: MOV AL,01H ;\"4\" SUB AL,DELAYTIME JNZ L6 MOV CX,0AH
L6: MOV AL,22H ;\"3\" SUB AL,DELAYTIME JNZ L7 MOV CX,10H
L7: MOV AL,0AH ;\"2\" SUB AL,DELAYTIME JNZ L8 MOV CX,20H
L8: MOV AL,02H ;\"1\"
SUB AL,DELAYTIME JNZ L9 MOV CX,30H L9: MOV AL,03H
SUB AL,DELAYTIME ;\"0\" JNZ LOOP1 MOV CX,40H LOOP1:PUSH CX MOV CX,0155H LOOP2:NOP LOOP LOOP2 POP CX LOOP LOOP1 POP CX RET DELAY ENDP DISPLAY PROC NEAR PUSH BX MOV DX,D8279 MOV AL,DELAYTIME
LEA BX,LED ;查表显示速度值 XLAT OUT DX,AL MOV AL,DIRDSP
OUT DX,AL ;显示电机转动方向 MOV CX,0006H ;显示界面\"STEP\" LEA BX,DSP
LOOP4:MOV AL,[BX] OUT DX,AL INC BX LOOP LOOP4 MOV DX,C8279 MOV AL,0C2H OUT DX,AL POP BX RET DISPLAY ENDP
LED DB 07H,66H,06H,3FH DB 00H,00H,00H,00H DB 7FH,6DH,5BH,71H DB 00H,00H,00H,00H
DB 00H,00H,00H,00H DB 00H,00H,00H,00H DB 00H,00H,00H,00H DB 00H,00H,00H,00H
DB 6FH,7DH,4FH,79H DB 00H,00H,00H,00H DB 77H,7CH,39H,5EH DB 00H,00H,00H,00H
DB 06H,5BH,4FH,66H DB 00H,00H,00H,00H
DB 06H,5BH,4FH,66H DB 00H,00H,00H,00H
DSP DB 00H,00H,73H,79H,31H,6DH,00H DELAYTIME DB 01H DIRDSP DB 40H
STEP DB 01h,03H,02h,06H,04h,0cH,08h,09H DB 09H,08h,0cH,04h,06H,02h,03H,01h CODE ENDS END START
因篇幅问题不能全部显示,请点此查看更多更全内容