微机原理与接口技术实验程序.docx
《微机原理与接口技术实验程序.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术实验程序.docx(22页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术实验程序
微机原理与接口技术实验程序:
实验一:
数据传送实验,采用相对寻找方式
DDATA SEGMENT;定义源数据段
MSR DB"HELLO,WORLD!
$"
LENEQU$-MSR
DDATA ENDS
EXDASEGMENT;定义附加数据段
MSD DBLENDUP(?
)
EXDAENDS
MYSTACK SEGMENTSTACK;定义堆栈段
DW20DUP(?
)
MYSTACK ENDS
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DDATA,ES:
EXDA
START:
MOVAX,DDATA
MOV DS,AX ;装载数据段寄存器
MOV AX,EXDA
MOV ES,AX ;装载附加数据段寄存器
MOV SI,OFFSETMSR
MOVDI,OFFSETMSD
MOV CX,LEN
MOVBX,0
NEXT:
MOVAL,MSR[BX] ;开始传输数据
MOVES:
MSD[BX],AL
INCBX
LOOP NEXT
PUSH ES
POP DS ;将附加段寄存器指向的段值赋给数据段寄存器
MOV DX,OFFSETMSD
MOV AH,9
INT21H;显示字符串
MOV AH,4CH
INT21H;返回DOS状态
CODE ENDS
ENDSTART
实验二:
最大值程序
DATASEGMENT
BUFFERDW200,-12,45,500,-1000
COUNTEQU($-BUFFER)/2
MAXDW?
;用于存放最大值
MES1DB‘200,-12,45,78,500,-1000’,0AH,0DH,’$’
DATAENDS
STACKSEGMENT
DB64DUP(?
)
TOPEQU$-STACK;计算出堆栈指针数值
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
BEGIN:
MOVAX,SEGDATA
MOVDS,AX
MOVAX,SEGSTACK
MOVSS,AX
MOVSP,TOP
MOVCX,COUNT
LEABX,BUFFER
MOVAX,[BX]
INCBX
INCBX
DECCX
AGAIN:
CMPAX,[BX]
JGENEXT
MOVAX,[BX]
NEXT:
INCBX
INCBX
LOOPAGAIN
MOVMAX,AX
MOVAH,9
LEADX,MES1
INT21H
QQ1:
MOVAH,1
INT16H
JZQQ1
MOVAH,4C
INT21H
CODEENDS
ENDBEGIN
字符串程序:
DATASEGMENT
STRINGDB‘abcduvwxyz’,0DH
L1DB?
CREQU0DH
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
S1DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
BEGIN:
MOVEAX,DATA
MOVDS,AX
MOVES,AX
LEADI,STRING;设串的地址指针
MOVDL,0;置串长度的初值为0
MOVAL,CR;串标志送入AL
CLD;清DF=0,使地址自动增量
AGAIN:
SCASB;搜索串
JEDONE;找到结束标志,停止
INCDL;串长度加1
JMPAGAIN
DONE:
LEABX,L1
MOV[BX],DL;存串长度
MOVDH,DL;串长暂存
MOVCL,4
SHRDL,CL;取串长高4位
MOVAL,DL
CALLCHANGE;将高4位转换成ASCII码放入AL
MOVDL,AL
MOVAH,2
INT21H;显示高4位
MOVAL,DH;取暂存串长
ANDAL,0FH;取串长低4位
CALLCHANGE
MOVDL,AL
MOVAH,2
INT21H;显示串长低位
MOVDL,’H’
MOVAH,2
INT21H;显示H
MOVAH,4CH
INT21H
CHANGEPROC;过程或子程序
CMPAL,10
JLADD30;小于转
ADDAL,37H
JMPP1
ADD30:
ADDAL,30H
P1:
RET
CHANGEENDP
CODEENDS
ENDBEGIN
实验三:
1.在实验箱上设计并连接单脉冲KK1+到8254的CLK0端,8254的OUT0连接IRQ3,定义8254的计数器0为方式0,计数值为5,每当KK1+按动5次后产生中断请求,实现在屏幕上显示字符“5”。
要求:
主机按任意键停止显示返回DOS。
(必做)
IOY1EQU280H
MY8254_COUNT0EQUIOY1+00H;8254计数器0端口地址
MY8254_COUNT1EQUIOY1+01H;8254计数器1端口地址
MY8254_COUNT2EQUIOY1+02H;8254计数器2端口地址
MY8254_MODEEQUIOY1+03H;8254控制寄存器端口地址
DATASEGMENT
STR1DB'COUNT:
$';显示的字符串
DATAENDS
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,CS
MOVDS,AX
MOVDX,OFFSETMYISR
MOVAX,250BH
INT21H
INAL,21H
ANDAL,0f7H
OUT21H,AL
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTR1;显示字符串
MOVAH,9
INT21H
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,10H;计数器0,方式0,计数值为十进制
OUTDX,AL
MOVDX,MY8254_COUNT0;装入计数初值
MOVAL,4
OUTDX,AL
STI
WAIT1:
MOVAH,1;判断是否有按键按下
INT16H
JZWAIT1;无按键则跳回继续等待,有则退出
QUIT:
INAL,21H
ORAL,08H
OUT21H,AL
MOVAX,4C00H;返回到DOS
INT21H
MYISRPROCNEAR;中断处理程序MYISR
MOVAL,35H
MOVAH,0EH
INT10H
MOVAL,20H
INT10H
MOVDX,MY8254_COUNT0;重装计数初值
MOVAL,4
OUTDX,AL
OVER:
MOVAL,20H
OUT20H,AL
IRET
MYISRENDP
CODEENDS
ENDSTART
实验四:
1.1.在实验箱上设计并连接8255,将8255的PB口和PA口分别与数码管显示电路的段选端和位选段相接,使其显示3000H、3001H、3002H和3003H单元中的数据。
要求:
主机按任意键停止显示返回DOS。
(必做)
IOY0EQU0280H;片选IOY0对应的端口始地址
MY8255_AEQUIOY0+00H;8255的A口地址
MY8255_BEQUIOY0+01H;8255的B口地址
MY8255_CEQUIOY0+02H;8255的C口地址
MY8255_MODEEQUIOY0+03H;8255的控制寄存器地址
DATASEGMENT
BUFFDB99H
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATAENDS;键值表,0~F对应的7段数码管的段位值
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,3000H;建立缓冲区,存放要显示的键值
MOVAL,00H;先初始化键值为0
MOV[SI],AL
MOV[SI+1],AL
MOV[SI+2],AL
MOV[SI+3],AL
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;方式0,A口、B口输出,C口低4位输入
OUTDX,AL
BEGIN:
CALLPUTBUF
CALLDISPLAY
MOVAH,1;判断PC键盘是否有按键按下
INT16H
JZBEGIN
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
PUTBUFPROCNEAR;保存显示数据到缓冲区子程序
MOVSI,3003H
MOVAX,BUFF
MOVAH,AL
ANDAL,0FH
MOV[SI],AL
DECSI
MOVAL,AH
ANDAL,0F0H
MOVCL,4
SARAL,CL
MOV[SI],AL
RET
PUTBUFENDP
DISPLAYPROCNEAR;显示子程序
PUSHAX
MOVSI,3000H
MOVDL,08H
MOVAL,DL
AGAIN:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL;设置X1~X4,选通一个数码管
MOVAL,[SI];取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
XLAT
MOVDX,MY8255_B
OUTDX,AL;写入数码管A~Dp
CALLDALLY
INCSI;取下一个键值
POPDX
MOVAL,DL
TESTAL,01H
JNZOUT1;显示完,返回
RORAL,1
MOVDL,AL
JMPAGAIN;未显示完,跳回继续
OUT1:
POPAX
RET
DISPLAYENDP
DALLYPROCNEAR;软件延时子程序
PUSHCX
MOVCX,00FFH
D1:
MOVAX,00FFH
D2:
DECAX
JNZD2
LOOPD1
POPCX
RET
DALLYENDP
CODEENDS
ENDSTART
2.在实验箱上设计并连接,使用8255扫描4*4键盘,并将识别出的键值依次显示在4位数码管上。
要求:
主机按任意键停止显示返回DOS。
IOY0EQU288H;片选IOY0对应的端口始地址
MY8255_AEQUIOY0+00H;8255的A口地址
MY8255_BEQUIOY0+01H;8255的B口地址
MY8255_CEQUIOY0+02H;8255的C口地址
MY8255_MODEEQUIOY0+03H;8255的控制寄存器地址
DATASEGMENT
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,
7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATAENDS;键值表,0~F对应的7段数码管的段位值
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,3000H;建立缓冲区,存放要显示的键值
MOVAL,00H;先初始化键值为0
MOV[SI],AL
MOV[SI+1],AL
MOV[SI+2],AL
MOV[SI+3],AL
MOVDI,3003H
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;方式0,A口、B口输出,C口低4位输入
OUTDX,AL
BEGIN:
CALLDISPLAY
CALLKSCAN;扫描按键
CMPAL,0Fh
JZNKY;未发现有键按下则转
CALLKEYSET
NKY:
MOVAH,1;判断PC键盘是否有按键按下
INT16H
JZBEGIN
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
DISPLAYPROCNEAR;显示子程序
PUSHAX;以缓冲区存放的键值为键值表偏移找到键值并显示
MOVSI,3000H
MOVDL,08H
MOVAL,DL
AGAIN:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL;设置X1~X4,选通一个数码管
MOVAL,[SI];取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
XLAT
MOVDX,MY8255_B
OUTDX,AL;写入数码管A~Dp
CALLDALLY
INCSI;取下一个键值
POPDX
MOVAL,DL
TESTAL,01H
JNZOUT1;显示完,返回
RORAL,1
MOVDL,AL
JMPAGAIN;未显示完,跳回继续
OUT1:
POPAX
RET
DISPLAYENDP
KSCANPROCNEAR;扫描是否有按键闭合子程序
MOVAL,0FH
MOVDX,MY8255_C;将4列全选通,X1~X4置0
OUTDX,AL
INAL,DX;读Y1~Y4
ANDAL,0FH;取出Y1~Y4的值
RET
KSCANENDP
KEYSETPROC
MOVAH,AL
MOVDX,MY8255_MODE
MOVAL,88h
OUTDX,AL
MOVDX,MY8255_C
MOVAL,AH
ORAL,0F0H
OUTDX,AL
INAL,DX;读列扫描值
ANDAL,0F0H
CMPAL,0F0H
JZKERR;未发现有键按下则转
MOVCL,04
SHRAL,CL
TESTAL,01H
JNZL2
MOVCL,00H
JMPR0
L2:
TESTAL,02H
JNZL3
MOVCL,04H
JMPR0
L3:
TESTAL,04H
JNZL4
MOVCL,08H
JMPR0
L4:
TESTAL,08H
JNZKERR
MOVCL,0CH
R0:
MOVAL,AH
TESTAL,01H
JNZR2
MOVAL,00H
JMPKCODE
R2:
TESTAL,02H
JNZR3
MOVAL,01H
JMPKCODE
R3:
TESTAL,04H
JNZR4
MOVAL,02H
JMPKCODE
R4:
TESTAL,08H
JNZKERR
MOVAL,03H
KCODE:
ADDAL,CL;将行的值加上当前列数,确定按键值
CALLPUTBUF;保存按键值
KON:
MOVDX,MY8255_MODE
MOVAL,81h
OUTAX,AL
MOVDX,MY8255_C
MOVAL,0FH
OUTDX,AL
INAL,DX;读行扫描值
ANDAL,0FH
CMPAL,0FH
JNZKON;按键未抬起转
KERR:
RET
KEYSETENDP
PUTBUFPROCNEAR;保存键值子程序
MOVSI,DI
MOV[SI],AL
DECDI
CMPDI,2FFFH
JNZGOBACK
MOVDI,3003H
GOBACK:
RET
PUTBUFENDP
DALLYPROCNEAR;软件延时子程序
PUSHCX
MOVCX,00FFH
D1:
MOVAX,00FFH
D2:
DECAX
JNZD2
LOOPD1
POPCX
RET
DALLYENDP
CODEENDS
ENDSTART
实验五:
1.在实验箱上设计并连接ADC0809芯片的接线,按延时方式对单通道模拟量进行A/D转换。
A/D转换结果送入PC机后,再由PC机送至DAC0832进行D/A转换,结果送至示波器,与原信号进行对比观察。
模拟信号源:
由电位器中心抽头可以得到一个可调节的直流电压0~5V。
电位器一端接地,另一端接+5V。
IOY0EQU290H
AD0809EQUIOY0;AD0809的端口地址
IOY1EQU298H
DA0832EQUIOY1;DA0832的端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
STR1DB‘AD0809:
IN0$’;定义显示的字符串
BUFFDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTR1;显示字符串
MOVAH,9H
INT21H
LOOP1:
CALLADCON
CALLDACON
MOVAH,1;判断是否有按键按下
INT16H
JZLOOP1;无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
ADCONPROC
MOVDX,AD0809;启动A/D转换
OUTDX,AL
CALLDALLY
MOVDX,AD0809;读出转换结果
INAL,DX
MOVBUFF,AL
CALLTOASCII
RET
ADCONENDP
TOASCIIPROC
MOVCH,AL;分析结果进行显示
ANDAL,0F0H
MOVCL,04H
SHRAL,CL;取出数据的十位
CMPAL,09H
JGA1
ADDAL,30H
JMPA2
A1:
ADDAL,37H;对A~F的处理
A2:
MOVDL,AL;对0~9的处理
MOVAH,02H
INT21H
MOVAL,CH
ANDAL,0FH;取出数据的各位
CMPAL,09H
JGA3
ADDAL,30H
JMPA4
A3:
ADDAL,37H;对A~F的处理
A4:
MOVDL,AL;对0~9的处理
MOVAH,02H
INT21H
MOVDL,0DH;回车,置光标到行首
MOVAH,02H
INT21H
RET
TOASCIIENDP
DACONPROC
MOVDX,DA0832
MOVAL,BUFF
OUTDX,AL
CALLDALLY
RET
DACONEDNP
DALLYPROCNEAR;软件延时子程序
MOVCX,4000H
D1:
MOVAX,0600H
D2:
DECAX
JNZD2
LOOPD1
RET
DALLYENDP
CODEENDS
ENDSTART