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