《微机原理与接口技术》实训程序代码Word文档下载推荐.docx
《《微机原理与接口技术》实训程序代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《微机原理与接口技术》实训程序代码Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
CODEENDS
ENDSTART
实训二8259A外部中断
CS273equ8000H
ICW1euq00010011b;
单片8259,上升沿触发中断,写ICW4ICW2equ00100000b;
中断号为20HICW4equ00000001b;
工作在8086/88方式OCW1equ11111110b;
只响应IR0CS8259Aequ0A000hCS8259Bequ0A001h
datasegment
CNTdb0
dataends
codesegment
asummecs:
code,ds:
dta
ienterprocnear
pushax
pushdx
movdx,CS273
incCNT
moval,CNT
outdx,al;
输出计数值
movdx,CS8259A
moval,20h
outdx,al
popdx
popax
iret
ienterendp
iinitproc
moval,ICW1
movdx,CS8259B
moval,ICW2
moval,ICW4
moval,OCW1
ret
iinitendp
startprocnear
cli
movax,0
movds,ax
movbx,4*ICW2
movax,code;
movax,offsetienter;
中断入口地址(段地址为0)
mov[bx],ax
incbx
incbx
mov[bx],ax;
代码段地址为0
calliinit
movax,data
movds,ax
movCNT,0;
计数初值为0
moval,CNT
movdx,CS273
sti
LP:
nop;
等待中断
jmpLP
startendp
codeends
endstart
实训三8255输入/输出
七.参考代码
modeequ082h;
方式0,PA,PC输出,PB输入PortAequ8000h;
PortAPortBequ8001h;
PortB
PortCequ8002h;
PortC
CAddrequ8003h;
控制字地址
codesegment
assumecs:
code
Start:
moval,mode
movdx,CAddr
outdx,al;
输出控制字
moval,80H
movcx,08H
OutA:
movdx,PortA
输出PortA
movdx,PortC
shral,1;
移位
movah,100
calldelay;
延时
loopOutA
delayprocnear
moval,0
pushcx
movcx,ax
loop$
popcx
delayendp
enfstart
实训48251A串行通讯
CS8251Dequ8000h;
8251控制口地址
CS8251Cequ8001h
datasegment
sourcedb256dup(055h)
targetdb256dup(0aah)
RBufdb0
TBufdb0
data
IInitprocnear;
8251初始化
movdx,CS8251C
moval,01001111b;
1位停止位,无校验,8位数据,波特率因子64
moval,00010101b;
清除错标志,允许发送接收
IInitendp
sendprocnear;
串口发送
moval,00010101b
WaitTXD:
inal,dx
testal,1;
发送缓冲器是否为空
jzWaitTXD
moval,TBuf;
取要发送的字
movdx,CS8251D
发送数据
sendendp
receiveprocnear;
串行接收
WaitRXD:
testal,2;
是否已收到一个字
jeWaitRXD
inal,dx;
读取接收的字
movRBuf,al
receiveend
startprocnear
movax,data
moves,ax
movsi,offsetsource
movdi,offsettarget
movcx,256
callIInit
MLoop:
是否接收下一个字
testal,2
jnercvdata
cmpcx,0
jeMLoop
moval,[si]
incsi
movTbuf,al
callsand
loopMLoop
jimpMLoop
rcvdata:
callreceive;
读入接收的字
moval,RBuf
mov[di],al
incdi
jmpMLoop
startendp
codeends
end
实训58253计数器
CONTROLequ08003h
COUNT0equ08000hCOUNT1equ08001hCOUNT2equ08002hcodesegmentassumecs:
codetartprocnearmoval,36h;
00110110B;
计数器0,16位,方式3,二进制
movdx,CONTROL
movax,10000
movdx,COUNT0
计数器低字节
moval,ah
计数器高字节
moval,76h;
01110110B;
计数器1,16位,方式3,二进制
movax,100
movdx,COUNT1
计数器高字节
jmp$
endstart
实训6交通灯控制
appmacroyy;
控制显示宏指令
movdx,03c1h
moval,yy
movcx,00d0h
calldelay
endm
fresmacroxx,yy;
控制闪烁宏指令
appxx
appyy
tsmacroxx;
控制测试宏指令
movdx,03c0h
testal,xx
codesegmnetstack‘stack’
magdb‘outofwok!
’,0ah,0dh,24h
assumeds:
code,cs:
code,es:
code,ss:
start:
movax,cs
movss,ax
moval,90h
movdx,3c3h
outdx,al;
置8255a方式字,使A口输入,B口输出
callzjdn
callfjdn
go:
app0ch;
主干道通行
movcx,40h
b0:
callzjdn
callfjdn
app0ch
loopb0
callczf;
从主干道通行变为支通行
callczf
app21h;
支路通行
movcx,20h
b2:
app21h
loopb2
callcfz;
从支路通行变为主干道通行
callcfz
movah,01h
int16h
zjagain
jnzexit;
有键盘输入,结束运行
again:
jmpgo
exit:
movah,09h
movdx,offsetmsg
int21h
movah,4dh
zjdnprocnear;
检测主干道特种车子程序,一旦有就放行
ts01b
jzp1
testal,21h
jzs1
s1:
movcx,0200h
p1:
zjdnendp
fjdnprocnear;
检测支路特种车子程序,如有且主干道无才放行
jzff
ff:
ts02h
jzp2
testal,0ch
jzs2
s2:
p2:
fjdnendp
delayproc;
延时子程序
d2:
movax,0100h
dela:
decax
jnzdela
loopd2
delayendp
cfzprocnear
movbx,03h
w3:
fres11h,10h
decbx
jnzw3
cfzendp
czfprocnear;
从主干道通行变为支路通行
w1:
fresoah,02h
jnzw1
ret
czfendp
db200dup(?
)