接口課程設(shè)計(jì)報(bào)告
接口課程設(shè)計(jì)報(bào)告,接口,課程設(shè)計(jì),報(bào)告
接口課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
計(jì)算機(jī)學(xué)院0202班
徐亮
學(xué)號(hào):012002013414
《宿舍安全系統(tǒng)》設(shè)計(jì)報(bào)告
一.實(shí)驗(yàn)?zāi)康募耙?
目的:結(jié)合一個(gè)實(shí)際的接口技術(shù)問(wèn)題在實(shí)驗(yàn)臺(tái)上編程模擬實(shí)現(xiàn)。
要求:結(jié)合實(shí)際應(yīng)用,設(shè)計(jì)一微機(jī)應(yīng)用系統(tǒng),要求該系統(tǒng)綜合應(yīng)用并行接口、串行接口、其它接口(定時(shí)器接口、中斷接口、模擬接口可選)、編制對(duì)應(yīng)的程序,實(shí)現(xiàn)主控中心微機(jī)與下位機(jī)遠(yuǎn)距離傳送以及遠(yuǎn)程控制或監(jiān)測(cè)功能。
二.系統(tǒng)功能
本系統(tǒng)是用來(lái)驗(yàn)證進(jìn)入宿舍人員的身份的。用戶(hù)從下位機(jī)刷卡,并錄入用戶(hù)名和密碼。下位機(jī)分別將用戶(hù)名和密碼發(fā)送給主控機(jī),主控機(jī)驗(yàn)證之后,發(fā)送相應(yīng)的反饋信息給下位機(jī)。只有當(dāng)用戶(hù)名和密碼都被確認(rèn),用戶(hù)身份才合法。合法時(shí)下位機(jī)控制發(fā)光部件逐個(gè)亮燈提示,不合法時(shí)則下位機(jī)控制發(fā)聲部件鳴聲警報(bào)。
三.系統(tǒng)設(shè)計(jì)
1. 系統(tǒng)硬件由主控機(jī)(其中一臺(tái)微機(jī))、下位機(jī)(另一臺(tái)位微機(jī))和執(zhí)行部件組成。主控機(jī)與下位機(jī)通過(guò)串行通信線(xiàn)連接。
2. 執(zhí)行部件:由接口電路等組成,將接收的數(shù)據(jù)送入到下位機(jī)或?qū)⑾挛粰C(jī)輸出的數(shù)據(jù)送到執(zhí)行部件。
3. 下位機(jī):與主控機(jī)通信,控制執(zhí)行部件。
4.主控機(jī):與所有下位機(jī)進(jìn)行數(shù)據(jù)交換,必要時(shí)需建數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)處理等。
5.主控機(jī)程序:串行(RS232/RS485)通信程序,數(shù)據(jù)處理程序等。
6.下位機(jī)程序:串行(RS232/RS485)通信程序,執(zhí)行部件控制程序。
系統(tǒng)接口框圖見(jiàn)下頁(yè)所示:
下圖中,8255是用來(lái)進(jìn)行下位機(jī)控制部件的接口單元。A口的8個(gè)引腳和控制板上的8個(gè)顯示燈相連,其輸出決定燈的狀態(tài);B口8個(gè)引腳和控制板上的撥碼開(kāi)關(guān)的8位相連,編碼開(kāi)關(guān)的狀態(tài)可由B口讀入下位機(jī);C口的PC0,PC1,PC3分別和控制板上的SW1,SW2,S24相連,可由下位機(jī)讀入各開(kāi)關(guān)的狀態(tài),PC6則和喇叭相連,由PC6輸出方波控制喇叭發(fā)聲。
主控機(jī)
8251
RS232
RS232
8251
下位機(jī)
8255
A口 B口 C口
顯示燈
sw1,sw2,sw4和
喇叭
開(kāi)關(guān)
總線(xiàn)
總線(xiàn)
四.程序設(shè)計(jì)
本次課程設(shè)計(jì)的過(guò)程中,我主要負(fù)責(zé)下位機(jī)的程序的編寫(xiě),以及導(dǎo)線(xiàn)在實(shí)驗(yàn)臺(tái)上的連接這兩部分的程序設(shè)計(jì)工作。
系統(tǒng)的模塊框圖由系統(tǒng)設(shè)計(jì)的內(nèi)容可知,即8255芯片以上的部分是本系統(tǒng)的通訊模塊框圖,以下的部分為本程序的功能模塊框圖。
系統(tǒng)的程序設(shè)計(jì)是緊密?chē)@系統(tǒng)功能進(jìn)行的,程序要實(shí)現(xiàn)的功能就是系統(tǒng)的功能。
流程框圖如下:
1.主控機(jī)程序流程圖
程序設(shè)計(jì)過(guò)程中,為了模擬用戶(hù)的刷卡進(jìn)入,讓下位機(jī)去測(cè)試控制板上的開(kāi)關(guān)sw4,其按下表示有用戶(hù)刷卡進(jìn)入,這時(shí)就可以發(fā)送插卡信號(hào)給主控機(jī),下圖中“接收用戶(hù)插卡信號(hào)”就是指這個(gè)信號(hào)。
開(kāi)始
按鍵?
結(jié)束
接收用戶(hù)插卡信號(hào)
合法?
發(fā)確認(rèn)信號(hào)
接收用戶(hù)密碼信息
發(fā)確認(rèn)信號(hào)
接收用戶(hù)名信息
正確?
合法?
發(fā)確認(rèn)信號(hào)
提示用戶(hù)可以進(jìn)入
初始化
提示用戶(hù)名錯(cuò)誤
發(fā)否認(rèn)信號(hào)
提示密碼錯(cuò)誤
發(fā)否認(rèn)信號(hào)
提示卡非法
Y
Y
Y
Y
N
N
N
N
2.下位機(jī)程序流程圖
下位機(jī)部分需要操作控制板,這里要用到控制板上的8位編碼開(kāi)關(guān),以及開(kāi)關(guān)sw1,sw2,sw4。按下sw4表示用戶(hù)插卡進(jìn)入,然后撥動(dòng)控制板上的編碼開(kāi)關(guān),設(shè)置用戶(hù)名編碼,按下sw1發(fā)送給主控機(jī),若被主控機(jī)確認(rèn)無(wú)誤,則撥動(dòng)控制板上的編碼開(kāi)關(guān)設(shè)置密碼,再按下sw2發(fā)送給主控機(jī),等待主控機(jī)確認(rèn)。
正確情況下的燈亮很好控制,只要A口輸出數(shù)據(jù)到燈的引腳,再設(shè)計(jì)一段程序控制燈的閃爍方式即可。喇叭的發(fā)聲要說(shuō)明的是,此處并不是用8253的out端輸出方波來(lái)使之發(fā)聲,而是將C口的PC6交替置位和復(fù)位產(chǎn)生方波,使之發(fā)聲的。
開(kāi)始
按鍵?
結(jié)束
發(fā)送用戶(hù)插卡信號(hào)
接收確認(rèn)信號(hào)
合法?
發(fā)用戶(hù)密碼信息
接收確認(rèn)信號(hào)
發(fā)送用戶(hù)名信息
接收確認(rèn)信號(hào)
正確?
合法?
提示用戶(hù)可以進(jìn)入
燈亮
初始化
聲音報(bào)警
提示用戶(hù)名錯(cuò)誤
接收否認(rèn)信號(hào)
聲音報(bào)警
提示密碼錯(cuò)誤
接收否認(rèn)信號(hào)
提示卡非法
Y
Y
Y
Y
N
N
N
N
3.主控機(jī)源程序
;每次驗(yàn)證用戶(hù)名和密碼之前,都有退出提示,即3秒鐘內(nèi)按任意鍵退出,此時(shí)
;按任意鍵方可退出
data segment
data51 equ 308h ;8251A數(shù)據(jù)口
ctr151 equ 309h ;8251A命令/狀態(tài)口
defuser db 65h,81h,24h,37h,02ah,54h ;依次為各用戶(hù)名
defpwd db 20h,17h,34h,25h,04ch,44h ;依次為各用戶(hù)對(duì)應(yīng)的密碼
userno dw 6 ;用戶(hù)數(shù)目
YN db 0 ;發(fā)送緩存
user db 0 ;存放接收的用戶(hù)名
pwd db 0 ;存放接收的密碼
t dw 0 ;延時(shí)初值
bufb db 0ah,0dh,'The domitory system is running...!$'
bufu db 0ah,0dh,'username(4 characters):$' ;接收用戶(hù)名提示
bufp db 0ah,0dh,'password(6 characters):$' ;接收密碼提示
bufr db 0ah,0dh,'You can get in!!$' ;正確提示
bufus db 0ah,0dh,'Error username!!$' ;用戶(hù)名錯(cuò)誤提示
bufpd db 0ah,0dh,'Error password!!$' ;密碼錯(cuò)誤提示
buferr db 0ah,0dh,'Can not identify the card!!!!$' ;不可識(shí)別的卡
bufexit db 0ah,0dh,'Press any key within 3 seconds to exit!$'
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
hh macro ;回車(chē)換行的宏
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
endm
int51 proc near ;8251A初始化子程
mov dx,ctr151 ;8251A命令口
mov al,0 ;空操作
out dx,al
mov al,40h ;內(nèi)部復(fù)位
out dx,al
mov al,4Eh ;8251A方式命令
out dx,al
mov al,27h ;8251A工作命令
out dx,al
ret
int51 endp
delay1 proc ;延時(shí)子程1
push bx
mov bx,t
dl1: dec bx
jnz dl1
pop bx
ret
delay1 endp
quit proc ;3秒鐘之內(nèi)按任意鍵退出程序
push cx
lea dx,bufexit
mov ah,9
int 21h
mov cx,05fffh
qxx: cmp cx,0
je qx
mov ah,1 ;檢測(cè)是否有鍵按下,有則退出
int 16h
jnz qnext
mov t,0ffffh
call delay1
dec cx
jmp qxx
qnext: mov ah,4ch
int 21h
qx: pop cx
ret
quit endp
send macro a;發(fā)送一個(gè)字符的宏,首先必須將要發(fā)送的字符送入變量YN
mov dx,ctr151
a: in al,dx
test al,01 ;發(fā)送準(zhǔn)備好?TXRDY=1?
jz a ;未準(zhǔn)備好,則等待
mov dx,data51 ;已準(zhǔn)備好,則發(fā)送Y給下位機(jī)
mov al,YN
out dx,al
endm
receive macro b ;接收一個(gè)字符的宏,接收到al
b: mov dx,ctr151 ;檢測(cè)接收準(zhǔn)備好沒(méi)
in al,dx
test al,02 ;接收數(shù)據(jù)準(zhǔn)備好?RXRDY=1?
jz b ;未準(zhǔn)備好則繼續(xù)檢測(cè)
mov dx,data51;已準(zhǔn)備好,即有數(shù)據(jù)傳送過(guò)來(lái),則接收1個(gè)字符
in al,dx
endm
begin: mov ax,data
mov ds,ax
call int51 ;調(diào)用8251A子程序,初始化8251A
k: call quit ;延時(shí)3秒退出
hh
lea dx,bufb ;系統(tǒng)提示
mov ah,9
int 21h
receive o ;接收插卡信號(hào)
cmp al,'O'
jne error
mov YN,'Y' ;發(fā)送卡確認(rèn)信息
send yyy
lea dx,bufu ;用戶(hù)名提示信息
mov ah,9
int 21h
mov al,0
receive a ;接收一個(gè)字符,用戶(hù)信息
mov user,al ;保存接收的用戶(hù)信息
mov dl,user ;顯示接收的字符
mov ah,02h
int 21h
jmp cmpuser
error: lea dx,buferr ;無(wú)法識(shí)別的卡
mov ah,9
int 21h
hh
jmp k
over: mov ax,4c00h
int 21h
cmpuser: mov al,user
lea si,defuser ;取用戶(hù)名數(shù)組的首地址
mov cx,userno ;取用戶(hù)數(shù)目
cu: cmp cx,0
je sendnu
cmp al,[si]
je sy ;和某一個(gè)用戶(hù)名相等則發(fā)送Y確認(rèn)信號(hào)
inc si
dec cx
jmp cu
sy: push si ;保存該用戶(hù)名的地址
mov YN,'Y'
send y
lea dx,bufp ;密碼提示信息
mov ah,9
int 21h
;接收密碼
receive pp
mov pwd,al ;保存接收的密碼
pop si
mov ax,si
add ax,userno ;得到該用戶(hù)名對(duì)應(yīng)的密碼在密碼數(shù)組中的地址
mov si,ax
mov bl,[si]
cmp pwd,bl ;和密碼比較
jne sendnp ;不相等則發(fā)送N,相等則發(fā)送Y
mov YN,'Y'
send yy
lea dx,bufr ;顯示正確
mov ah,9
int 21h
hh
jmp k ;重新開(kāi)始
sendnp: mov YN,'N'
send n
lea dx,bufpd ;顯示密碼錯(cuò)誤
mov ah,9
int 21h
hh
jmp k ;重新開(kāi)始
sendnu: mov YN,'N'
send n
lea dx,bufus ;顯示用戶(hù)名錯(cuò)誤
mov ah,9
int 21h
hh
jmp k ;重新開(kāi)始
code ends
end begin
4.下位機(jī)源程序
;程序開(kāi)始時(shí),提示在3秒鐘內(nèi)按任意鍵退出,否則繼續(xù)執(zhí)行。若繼續(xù)執(zhí)行,首
;先按sw4表示插卡,再由開(kāi);關(guān)狀態(tài)設(shè)置用戶(hù)名,按sw1發(fā)送之,顯示提示信息
;仍然用開(kāi)關(guān)狀態(tài)設(shè)置密碼,按sw2發(fā)送之,顯示提示
;信息,回程序開(kāi)始.
data segment
data51 equ 308h ;8251A數(shù)據(jù)口
ctr151 equ 309h ;8251A命令/狀態(tài)口
ctr155 equ 303h ;8255命令口
ctr155a equ 300h ;8255數(shù)據(jù)口a
ctr155b equ 301h ;8255數(shù)據(jù)口b
un db 0 ;存放讀入的用戶(hù)名
pd db 0 ;存放讀入的密碼
hh db 0ah,0dh,'$' ;回車(chē)換行
light db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh ;閃爍燈狀態(tài)
t dw 0 ;延時(shí)初值
f db 0 ;計(jì)數(shù)初始值
j db 0 ;計(jì)數(shù)初始值
YN db 0
bufexit db 0ah,0dh,'Press any key within 3 seconds to exit!$'
buf1 db 0ah,0dh,'Press sw4 instand of inserting the card!$'
buf2 db 0ah,0dh,'Change the state of the switch to set username! Press sw1 to send it!$' ;提示錄入和發(fā)送用戶(hù)名
buf3 db 0ah,0dh,'Change the state of the switch to set password! Press sw2 to send it!$' ;提示錄入和發(fā)送密碼
buf4 db 0ah,0dh,'The user is not existed or you have the wrong password!$' ;錯(cuò)誤提示信息
buf5 db 0ah,0dh,'You can get in!!$' ;成功登錄信息
data ends
stack segment stack
DB 200 DUP(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
int51 proc near ;8251A初始化子程
mov dx,ctr151 ;8251A命令口
mov al,0 ;空操作
out dx,al
mov al,40h ;內(nèi)部復(fù)位
out dx,al
mov al,4Eh ;8251A方式命令
out dx,al
mov al,27h ;8251A工作命令
out dx,al
ret
int51 endp
send macro a;發(fā)送一個(gè)字符的宏,首先必須將要發(fā)送的字符送入變量YN
mov dx,ctr151
a: in al,dx
test al,01 ;發(fā)送準(zhǔn)備好?TXRDY=1?
jz a ;未準(zhǔn)備好,則等待
mov dx,data51 ;已準(zhǔn)備好,則發(fā)送一個(gè)字符給下位機(jī)
mov al,YN
out dx,al
endm
clear macro c ;置口c某一位,c為置位控制字
mov dx,303h
mov al,c
out dx,al
endm
receive macro b ;接收一個(gè)字符的宏,接收到al
b: mov dx,ctr151 ;檢測(cè)接收準(zhǔn)備好沒(méi)
in al,dx
test al,02 ;接收數(shù)據(jù)準(zhǔn)備好?RXRDY=1?
jz b ;未準(zhǔn)備好則繼續(xù)檢測(cè)
mov dx,data51 ;已準(zhǔn)備好,即有數(shù)據(jù)傳送過(guò)來(lái),則接收1個(gè)字符
in al,dx
endm
delay1 proc ;延時(shí)子程1
push bx
mov bx,t
dl1: dec bx
jnz dl1
pop bx
ret
delay1 endp
delay2 proc ;延時(shí)子程2
push cx
mov cx,00fffh
xx: cmp cx,0
je x
mov t,0ffffh
call delay1
dec cx
jmp xx
x: pop cx
ret
delay2 endp
quit proc ;3秒鐘之內(nèi)按任意鍵退出程序
push cx
lea dx,bufexit
mov ah,9
int 21h
mov cx,07fffh
qxx: cmp cx,0
je qx
mov ah,1 ;檢測(cè)是否有鍵按下,有則退出
int 16h
jnz qnext
mov t,0ffffh
call delay1
dec cx
jmp qxx
qnext: mov ah,4ch
int 21h
qx: pop cx
ret
quit endp
flutter proc ;燈閃爍函數(shù),8個(gè)燈依次亮,循環(huán)3次
lea di,light
mov f,3
wyyy: cmp f,0
je wy
mov cx,8
l: cmp cx,0
je wyy
mov al,[di] ;燈亮
mov dx,ctr155a
out dx,al
call delay2 ;延時(shí)2
mov al,0ffh ;燈滅
mov dx,ctr155a
out dx,al
inc di
dec cx
jmp l
wyy: lea di,light
dec f
jmp wyyy
wy: ret
flutter endp
noise proc ;聲音報(bào)警子函數(shù),3次長(zhǎng)鳴
push cx
mov f,3
jj: cmp f,0
je ejj
;產(chǎn)生一定頻率的方波,使喇叭發(fā)聲
mov cx,00dffh
xxkk1: cmp cx,0
je xkk
mov dx,ctr155 ;pc6置1
mov al,0dh
out dx,al
mov t,0ffffh
call delay1 ;延時(shí)
mov dx,ctr155 ;pc6置0
mov al,0ch
out dx,al
mov t,0ffffh
call delay1 ;延時(shí)
dec cx
jmp xxkk1
xkk: call delay2 ;不產(chǎn)生方波,停止發(fā)聲
dec f
jmp jj
ejj: pop cx
ret
noise endp
begin: mov ax,data
mov ds,ax
call int51 ;調(diào)用8251A子程序,初始化8251A
mov dx,ctr155 ;初始化8255A
mov al,10000011b
out dx,al
ww: lea dx,hh ;回車(chē)換行
mov ah,9
int 21h
call quit ;延時(shí)退出程序
lea dx,hh ;回車(chē)換行
mov ah,9
int 21h
lea dx,buf1 ;提示按sw4表示插卡
mov ah,9
int 21h
;檢測(cè)sw4是否按下
clear 07h ;清sw4狀態(tài)
wait4: mov dx,302
in al,dx ;sw4按下? pc3=0?
test al,08h ;否,則繼續(xù)檢測(cè)
jnz wait4
;是則發(fā)送卡插入信號(hào)
mov YN,'O'
send o
mov al,0 ;接收主控機(jī)反饋信息
receive i
cmp al,'Y' ;確認(rèn)則繼續(xù),否則重新開(kāi)始
jne ww
lea dx,buf2 ;提示設(shè)置用戶(hù)名并發(fā)送之
mov ah,9
int 21h
;檢測(cè)sw1狀態(tài)
clear 01h ;清sw1狀態(tài)
wait1: mov dx,302h ;檢測(cè)sw1是否按下
in al,dx
test al,01h ;sw1按下? pc0=0?
jnz wait1 ;否則繼續(xù)檢測(cè)
;按下則讀開(kāi)關(guān)狀態(tài)(口b),得到用戶(hù)名
mov dx,ctr155b ;讀b口
in al,dx
mov un,al ;保存用戶(hù)名
mov YN,al ;發(fā)送用戶(hù)名
send us
jmp receiv
over: mov ax,4c00h ;程序退出
int 21h
;接收主控機(jī)反饋信息
receiv: receive y
cmp al,'Y' ;接收的字符和'Y'比較
jne wrong ;不合法就提示錯(cuò)誤信息
lea dx,buf3 ;合法則提示設(shè)置密碼并發(fā)送之
mov ah,09h
int 21h
clear 02h ;清sw2狀態(tài)
wait2: mov dx,302h ;檢測(cè)sw2是否按下
in al,dx
test al,02h ;sw2按下? pc1=0?
jnz wait2 ;否則繼續(xù)檢測(cè)
;按下則讀開(kāi)關(guān)狀態(tài)(口b),得到密碼
mov dx,ctr155b ;讀口b
in al,dx
mov pd,al ;保存密碼
mov YN,al ;發(fā)送密碼
send pd
;接收主控機(jī)反饋回來(lái)的信息
receive yy
cmp al,'Y' ;接收的字符和'Y'比較
jne wrong ;不相等就提示錯(cuò)誤信息,相等則提示登錄成功
lea dx,buf5 ;提示登錄成功
mov ah,9
int 21h
;此處亮燈提示
call flutter
jmp ww ;準(zhǔn)備第二次刷卡
wrong: lea dx,buf4 ;顯示錯(cuò)誤提示信息
mov ah,9
int 21h
;此處聲音報(bào)警
call noise
jmp ww ;準(zhǔn)備第二次刷卡
code ends
end begin
五.心得體會(huì)
此次程序設(shè)計(jì)我們小組同心協(xié)力,通過(guò)三天多的時(shí)間,終于完成了接口的課程設(shè)計(jì)。通過(guò)這個(gè)課程設(shè)計(jì),我真正掌握了8255,8251等芯片的功能和使用方法,以前在課堂上一知半解的知識(shí)通過(guò)這次課程設(shè)計(jì)都徹底弄清楚了。通過(guò)寫(xiě)8255,8251等芯片的命令口,可以使得各種芯片工作在不同的狀態(tài),這可以發(fā)揮這些芯片的使用范圍,特別是撥碼開(kāi)關(guān)的地方,通過(guò)撥碼開(kāi)關(guān)可以設(shè)置8255的PB口的值,而這些值可以通過(guò)8251發(fā)送出去,這就是卡號(hào)和車(chē)費(fèi)輸入的地方。通過(guò)這次課程設(shè)計(jì),我認(rèn)識(shí)到了匯編語(yǔ)言的強(qiáng)大功能,匯編語(yǔ)言是計(jì)算機(jī)能夠提供給用戶(hù)使用的最快而又最有效的語(yǔ)言,也是能夠利用計(jì)算機(jī)所有硬件特性并能直接控制硬件的唯一語(yǔ)言。但是,匯編語(yǔ)言作為一種低級(jí)語(yǔ)言,有他自身無(wú)法克服的缺點(diǎn),他的圖形用戶(hù)界面效果,遠(yuǎn)遠(yuǎn)不能和C語(yǔ)言或者C++語(yǔ)言相提并論,最好的方法是匯編語(yǔ)言和C/C++混合編程,高級(jí)語(yǔ)言編程方便簡(jiǎn)潔,匯編語(yǔ)言能充分發(fā)揮計(jì)算機(jī)硬件特性并且程序運(yùn)行效率高,二者相結(jié)合,效果勝過(guò)單獨(dú)一門(mén)語(yǔ)言體現(xiàn)出來(lái)的效果。
我還想提一個(gè)建議,那就是實(shí)驗(yàn)室最好為我們的控制板提供一本使用說(shuō)明或指南,這樣我們就可以徹底拋棄控制板的束縛,靈活地從單個(gè)接口芯片的功能特性出發(fā),設(shè)計(jì)出更好更精彩的程序。
收藏