接口课程设计实验报告孙强文档格式.docx
《接口课程设计实验报告孙强文档格式.docx》由会员分享,可在线阅读,更多相关《接口课程设计实验报告孙强文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![接口课程设计实验报告孙强文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/16/a953d3dd-bc8b-46ab-b531-99f9e1178bc4/a953d3dd-bc8b-46ab-b531-99f9e1178bc41.gif)
用户数目
YNdb0;
发送缓存
userdb0;
存放接收的用户名
pwddb0;
存放接收的密码
tdw0;
延时初值
bufbdb0ah,0dh,'
Thedomitorysystemisrunning...!
$'
bufudb0ah,0dh,'
username(4characters):
;
接收用户名提示
bufpdb0ah,0dh,'
password(6characters):
接收密码提示
bufrdb0ah,0dh,'
Youcangetin!
!
;
正确提示
bufusdb0ah,0dh,'
Errorusername!
用户名错误提示
bufpddb0ah,0dh,'
Errorpassword!
密码错误提示
buferrdb0ah,0dh,'
Cannotidentifythecard!
不可识别的卡
bufexitdb0ah,0dh,'
Pressanykeywithin3secondstoexit!
dataends
stacksegmentstack
db200dup(0)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
hhmacro;
回车换行的宏
movdl,0ah
movah,2
int21h
movdl,0dh
endm
int51procnear;
8251A初始化子程
movdx,ctr151;
8251A命令口
moval,0;
空操作
outdx,al
moval,40h;
内部复位
outdx,al
moval,4Eh;
8251A方式命令
moval,27h;
8251A工作命令
ret
int51endp
delay1proc;
延时子程1
pushbx
movbx,t
dl1:
decbx
jnzdl1
popbx
delay1endp
quitproc;
3秒钟之内按任意键退出程序
pushcx
leadx,bufexit
movah,9
movcx,05fffh
qxx:
cmpcx,0
jeqx
movah,1;
检测是否有键按下,有则退出
int16h
jnzqnext
movt,0ffffh
calldelay1
deccx
jmpqxx
qnext:
movah,4ch
qx:
popcx
ret
quitendp
sendmacroa;
发送一个字符的宏,首先必须将要发送的字符送入变量YN
movdx,ctr151
a:
inal,dx
testal,01;
发送准备好?
TXRDY=1?
jza;
未准备好,则等待
movdx,data51;
已准备好,则发送Y给下位机
moval,YN
receivemacrob;
接收一个字符的宏,接收到al
b:
movdx,ctr151;
检测接收准备好没
inal,dx
testal,02;
接收数据准备好?
RXRDY=1?
jzb;
未准备好则继续检测
movdx,data51;
已准备好,即有数据传送过来,则接收1个字符
endm
begin:
movax,data
movds,ax
callint51;
调用8251A子程序,初始化8251A
k:
callquit;
延时3秒退出
hh
leadx,bufb;
系统提示
receiveo;
接收插卡信号
cmpal,'
O'
jneerror
movYN,'
Y'
;
发送卡确认信息
sendyyy
leadx,bufu;
用户名提示信息
moval,0
receivea;
接收一个字符,用户信息
movuser,al;
保存接收的用户信息
movdl,user;
显示接收的字符
movah,02h
int21h
jmpcmpuser
error:
leadx,buferr;
无法识别的卡
movah,9
int21h
hh
jmpk
over:
movax,4c00h
int21h
cmpuser:
moval,user
leasi,defuser;
取用户名数组的首地址
movcx,userno;
取用户数目
cu:
cmpcx,0
jesendnu
cmpal,[si]
jesy;
和某一个用户名相等则发送Y确认信号
incsi
jmpcu
sy:
pushsi;
保存该用户名的地址
sendy
leadx,bufp;
密码提示信息
int21h
接收密码
receivepp
movpwd,al;
保存接收的密码
popsi
movax,si
addax,userno;
得到该用户名对应的密码在密码数组中的地址
movsi,ax
movbl,[si]
cmppwd,bl;
和密码比较
jnesendnp;
不相等则发送N,相等则发送Y
sendyy
leadx,bufr;
显示正确
jmpk;
重新开始
sendnp:
movYN,'
N'
sendn
leadx,bufpd;
显示密码错误
重新开始
sendnu:
sendn
leadx,bufus;
显示用户名错误
codeends
endbegin
4.下位机源程序
程序开始时,提示在3秒钟内按任意键退出,否则继续执行。
若继续执行,首
先按sw4表示插卡,再由开;
关状态设置用户名,按sw1发送之,显示提示信息
仍然用开关状态设置密码,按sw2发送之,显示提示
信息,回程序开始.
data51equ308h;
ctr151equ309h;
ctr155equ303h;
8255命令口
ctr155aequ300h;
8255数据口a
ctr155bequ301h;
8255数据口b
undb0;
存放读入的用户名
pddb0;
存放读入的密码
hhdb0ah,0dh,'
回车换行
lightdb0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh;
闪烁灯状态
tdw0;
fdb0;
计数初始值
jdb0;
YNdb0
buf1db0ah,0dh,'
Presssw4instandofinsertingthecard!
buf2db0ah,0dh,'
Changethestateoftheswitchtosetusername!
Presssw1tosendit!
;
提示录入和发送用户名
buf3db0ah,0dh,'
Changethestateoftheswitchtosetpassword!
Presssw2tosendit!
提示录入和发送密码
buf4db0ah,0dh,'
Theuserisnotexistedoryouhavethewrongpassword!
错误提示信息
buf5db0ah,0dh,'
成功登录信息
stacksegmentstack
DB200DUP(0)
movdx,data51;
已准备好,则发送一个字符给下位机
clearmacroc;
置口c某一位,c为置位控制字
movdx,303h
moval,c
receivemacrob;
movdx,ctr151;
testal,02;
jzb;
movdx,data51;
endm
delay2proc;
延时子程2
movcx,00fffh
xx:
jex
jmpxx
x:
popcx
delay2endp
movcx,07fffh
flutterproc;
灯闪烁函数,8个灯依次亮,循环3次
leadi,light
movf,3
wyyy:
cmpf,0
jewy
movcx,8
l:
jewyy
moval,[di];
灯亮
movdx,ctr155a
outdx,al
calldelay2;
延时2
moval,0ffh;
灯灭
outdx,al
incdi
jmpl
wyy:
leadi,light
decf
jmpwyyy
wy:
flutterendp
noiseproc;
声音报警子函数,3次长鸣
jj:
jeejj
产生一定频率的方波,使喇叭发声
movcx,00dffh
xxkk1:
jexkk
movdx,ctr155;
pc6置1
moval,0dh
calldelay1;
延时
pc6置0
moval,0ch
jmpxxkk1
xkk:
calldelay2;
不产生方波,停止发声
jmpjj
ejj:
popcx
noiseendp
movds,ax
movdx,ctr155;
初始化8255A
moval,10000011b
ww:
leadx,hh;
延时退出程序
leadx,hh;
leadx,buf1;
提示按sw4表示插卡
检测sw4是否按下
clear08h;
清sw4状态
wait4:
movdx,302
inal,dx;
sw4按下?
pc3=0?
testal,08h;
否,则继续检测
jnzwait4
是则发送卡插入信号
sendo
moval,0;
接收主控机反馈信息
receivei
cmpal,'
;
确认则继续,否则重新开始
jneww
leadx,buf2;
提示设置用户名并发送之
检测sw1状态
clear01h;
清sw1状态
wait1:
movdx,302h;
检测sw1是否按下
inal,dx
testal,01h;
sw1按下?
pc0=0?
jnzwait1;
否则继续检测
按下则读开关状态(口b),得到用户名
movdx,ctr155b;
读b口
movun,al;
保存用户名
movYN,al;
发送用户名
sendus
jmpreceiv
movax,4c00h;
程序退出
receiv:
receivey
接收的字符和'
比较
jnewrong;
不合法就提示错误信息
leadx,buf3;
合法则提示设置密码并发送之
movah,09h
clear02h;
清sw2状态
wait2:
检测sw2是否按下
testal,02h;
sw2按下?
pc1=0?
jnzwait2;
按下则读开关状态(口b),得到密码
movdx,ctr155b;
读口b
movpd,al;
保存密码
发送密码
sendpd
接收主控机反馈回来的信息
receiveyy
不相等就提示错误信息,相等则提示登录成功
leadx,buf5;
提示登录成功
此处亮灯提示
callflutter
jmpww;
准备第二次刷卡
wrong:
leadx,buf4;
显示错误提示信息
此处声音报警
callnoise
准备第二次刷卡
codeends
四.心得体会
本次接口实验的课程设计历时一周,由我们一个小组共5人合作完成。
在此次实验中,小组的各个成员由汪野同学负责总体的规划架构和主要程序的设计并向我们阐述设计的思路;
而我则负责对程序设计的测试、调试以及进一步的完善功能;
而周远则负责程序界面的设计还有硬件的设计,张仲容同学主要负责硬件上的监测以及流程图设计。
所有软件设计用到的程序语言都是汇编语言。
这五天中,我们的设计流程思路在一开始就整理的相当清楚:
1.首先完成下位机从实验面板接受信号的输入;
2.接下来进行主控机设计,主要是对用户名和密码的验证;
3.然后完成异步全双工传输;
4.根据实验需求逐步调整、完善核心代码;
5.进行判断对错的处理模块,正确则闪烁指示灯,错误则声音报警;
6.程序界面的设计。
我们按照流程一步步的完成了本次实验,虽然在最后的程序界面设计环节中因为对汇编语言下的界面设计了解的实在是太少没有能够设计出美观、方便使用的界面(这也是本次实验的一个不足之处),但是核心功能则完成的相当好。
汪野同学首先完成了主控机和下位机相应程序的编写,第一个版本的下位机是系统检测键盘输入用户名和密码,并按字符进行异步全双工通信。
在这过程中,我负责代码的调试,解决了几个由于疏漏而导致的问题,比如说源目的寄存器类型不匹配,不常用的汇编命令不熟悉等等。
另外在下位机输入密码的时建议下位机应该显示*号而不是字符,所以针对循环的内部代码做了一个分支,用户名和密码有不