接口课程设计实验报告孙强.docx

上传人:b****3 文档编号:5412347 上传时间:2022-12-16 格式:DOCX 页数:19 大小:105.50KB
下载 相关 举报
接口课程设计实验报告孙强.docx_第1页
第1页 / 共19页
接口课程设计实验报告孙强.docx_第2页
第2页 / 共19页
接口课程设计实验报告孙强.docx_第3页
第3页 / 共19页
接口课程设计实验报告孙强.docx_第4页
第4页 / 共19页
接口课程设计实验报告孙强.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

接口课程设计实验报告孙强.docx

《接口课程设计实验报告孙强.docx》由会员分享,可在线阅读,更多相关《接口课程设计实验报告孙强.docx(19页珍藏版)》请在冰豆网上搜索。

接口课程设计实验报告孙强.docx

接口课程设计实验报告孙强

 

微机接口课程设计报告

——宿舍安全系统

班级:

计算机学院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.程序界面的设计。

我们按照流程一步步的完成了本次实验,虽然在最后的程序界面设计环节中因为对汇编语言下的界面设计了解的实在是太少没有能够设计出美观、方便使用的界面(这也是本次实验的一个不足之处),但是核心功能则完成的相当好。

汪野同学首先完成了主控机和下位机相应程序的编写,第一个版本的下位机是系统检测键盘输入用户名和密码,并按字符进行异步全双工通信。

在这过程中,我负责代码的调试,解决了几个由于疏漏而导致的问题,比如说源目的寄存器类型不匹配,不常用的汇编命令不熟悉等等。

另外在下位机输入密码的时建议下位机应该显示*号而不是字符,所以针对循环的内部代码做了一个分支,用户名和密码有不

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1