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