|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (31.09 KB, 下載次數(shù): 103)
下載附件
2021-4-18 22:22 上傳
單片機(jī)匯編語(yǔ)言源程序如下:
- ;===================================================
- ;
- RS BIT P2.7
- RW BIT P2.6
- E BIT P2.5
- ENTER BIT 22H.0
- OPEN BIT P3.6
- SPEAK BIT P3.7
- PASSBUF EQU 40H
- KEYNUMBER EQU 41H ;存放識(shí)別后的按鍵號(hào)
- ORG 0000H
- AJMP MAIN
- ORG 0003H
- JMP KEY_INT
- ORG 000BH
- AJMP INTT0
- ORG 001BH
- AJMP INTT1
- ORG 0030H
- ;========== 主程序開(kāi)始 ==============
- MAIN: MOV 30H,#07H ;輸入密碼為7位 最高只可設(shè)15位
- MOV 42H,#200 ;設(shè)定報(bào)警的時(shí)間,42H單元里的數(shù)*50MS
- MOV 43H,#250 ;設(shè)定開(kāi)門(mén)時(shí)間 14的倍數(shù)(實(shí)際上液晶顯示器執(zhí)行指令占用了時(shí)間,開(kāi)門(mén)時(shí)間會(huì)比14*250MS大)
- ;44H號(hào)單元存放輸入錯(cuò)誤的次數(shù)
- ;45H為定時(shí)器0中斷次數(shù)
- ;46H為定時(shí)器1中斷次數(shù)
- MOV 47H,#250 ;輸入密碼時(shí)間設(shè)定,50MS倍數(shù)
- MOV SP,#60H
- CLR OPEN
- CLR SPEAK ;初始化輸出設(shè)備
- CLR ENTER ;標(biāo)志位初始化
-
- MOV TMOD,#11H ;定時(shí)器工作方式2
- MOV TH0,#3CH ;初值50MS
- MOV TL0,#0BH
- MOV TH1,#3CH
- MOV TL1,#0BH
- SETB EA
- SETB ET0
- SETB ET1
-
- MOV TCON,#00000000B ;電平觸發(fā)
- START: MOV R0,30H
- MOV R1,#31H
- SS1: MOV @R1,#00H
- INC R1
- DJNZ R0,SS1 ;將輸入密碼緩沖單元清零
- MOV P1,#0FH ;初始化按鍵口
- MOV R1,#31H ;從31號(hào)單元開(kāi)始存放按建輸入的密碼
- CLR 20H ;報(bào)警標(biāo)志清零
- CLR 21H ;密碼超時(shí)標(biāo)志
- MOV 46H,#00H ;超時(shí)后對(duì)定時(shí)器中斷次數(shù)清零,便于下一輪重新計(jì)時(shí)
- INIT: ACALL SELLCD ;設(shè)定液晶工作方式
- ACALL LINE1 ;在第一行顯示
- MOV DPTR,#MES_P ;顯示請(qǐng)輸入密碼
- ACALL DISPLAY
- setb EX0 ;開(kāi)中斷,允許鍵盤(pán)輸入
- KEYIN: JB 21H,ERR ;超時(shí)轉(zhuǎn)到錯(cuò)誤程序
- JNB ENTER,KEYIN ;等待ENTER按下
- CLR ENTER
- clr EX0 ;密碼輸入完后鎖定鍵盤(pán)
- ;當(dāng)使用邊沿觸發(fā)時(shí)用上面的指令為什么禁止不了中斷???
- ;========== 密碼判斷程序 ============
- COMP:
- MOV DPTR,#PASS
- MOV R4,30H ;密碼的長(zhǎng)度
- MOV A,#0
- MOV R1,#31H
- LOOP: MOV R5,A
- MOVC A,@A+DPTR
- MOV PASSBUF,A ;取出系統(tǒng)設(shè)定的密碼
- MOV A,@R1 ;從31號(hào)單元開(kāi)始取出輸入的密碼
- CJNE A,PASSBUF,ERR ;比較
- MOV A,R5
- INC A
- INC R1 ;取下一位
- DJNZ R4,LOOP
- ;正確
- MATCH: MOV A,#01H
- ACALL ENABLE ;清屏,光標(biāo)復(fù)位
- ACALL LINE1 ;從第一行開(kāi)始顯示
- MOV DPTR,#MES_C
- ACALL DISPLAY ;顯示"請(qǐng)進(jìn)"
- ACALL LINE2
- MOV DPTR,#TAB_1
- ACALL DISPLAY
- SETB OPEN ;開(kāi)門(mén)
- MOV 44H,#00H ;輸入錯(cuò)誤次數(shù)清零
- MOV R6,43H
- ACALL DELAY
- CLR OPEN ;復(fù)位
- JMP START
- ;錯(cuò)誤
- ERR: ACALL BACK
- MOV R6,#03H
- ACALL DELAY
- ACALL BACK ;輸錯(cuò)提示音,鳴兩下
- MOV A,#01H
- ACALL ENABLE
- ACALL LINE1
- MOV DPTR,#MES_E
- ACALL DISPLAY ;顯示錯(cuò)誤
- MOV R6,#40H
- ACALL DELAY
- INC 44H
- MOV A,44H
- CJNE A,#03H,EE0
- EE0: JC ERROUT ;輸錯(cuò)不到三次返回
- MOV 44H,#00H ;清零
- ACALL WRANING ;報(bào)警
- ERROUT: JMP START
- ;=========== 按鍵中斷服務(wù)程序 ==========
- KEY_INT:push acc
- push psw
- clr ex0
- acall delay10ms ;延時(shí)消抖
- SETB TR1 ;啟動(dòng)定時(shí)器
- ACALL SMKEY ;按鍵識(shí)別
- MOV A,KEYNUMBER ;返回按鍵號(hào)
- ACALL BACK ;按鍵發(fā)聲
- MOV R3,A
- CJNE R3,#0BH,K1 ;ENTER是否按下
- SETB ENTER
- clr tr1 ;按下確認(rèn)后關(guān)畢定時(shí)器
- mov 46h,#00h ;對(duì)中斷次數(shù)清零
- AJMP KEY_RTN
- K1: ADD A,#30H ;將按鍵號(hào)轉(zhuǎn)換為ASCⅡ碼
- MOV @R1,A ;將輸入的密碼存入緩沖單元
- INC R1 ;修改地址
-
- ACALL WRDATA ;輸入一位顯示一個(gè)"*"
-
- KEY_RTN:pop psw
- pop acc
- setb ex0
- RETI
- ;=========== 按鍵識(shí)別程序 ==========
- SMKEY:
- MOV A,P1
- ANL A,#0FH
- WKEY: MOV B,A ;反轉(zhuǎn)法查詢
- MOV P1,#0F0H
- NOP
- MOV A,P1
- ANL A,#0F0H
- ORL A,B
- MOV P1,#0FH ;還原P1口初態(tài)
- CJNE A,#0EEH,WKEY1
- MOV KEYNUMBER,#00H
- AJMP RETURN
- WKEY1: CJNE A,#0EDH,WKEY2
- MOV KEYNUMBER,#01H
- AJMP RETURN
- WKEY2: CJNE A,#0EBH,WKEY3
- MOV KEYNUMBER,#02H
- AJMP RETURN
- WKEY3: CJNE A,#0E7H,WKEY4
- MOV KEYNUMBER,#03H
- AJMP RETURN
- WKEY4: CJNE A,#0DEH,WKEY5
- MOV KEYNUMBER,#04H
- AJMP RETURN
- WKEY5: CJNE A,#0DDH,WKEY6
- MOV KEYNUMBER,#05H
- AJMP RETURN
- WKEY6: CJNE A,#0DBH,WKEY7
- MOV KEYNUMBER,#06H
- AJMP RETURN
- WKEY7: CJNE A,#0D7H,WKEY8
- MOV KEYNUMBER,#07H
- AJMP RETURN
- WKEY8: CJNE A,#0BEH,WKEY9
- MOV KEYNUMBER,#08H
- AJMP RETURN
- WKEY9: CJNE A,#0BdH,WKEY10
- MOV KEYNUMBER,#09H
- AJMP RETURN
- WKEY10: CJNE A,#0BbH,WKEY11
- MOV KEYNUMBER,#0AH
- AJMP RETURN
- WKEY11: CJNE A,#0B7H,RETURN
- MOV KEYNUMBER,#0BH ;判斷哪個(gè)鍵按下,返回相應(yīng)按鍵號(hào)碼
- RETURN: MOV P1,#0FH
- NOP
- NOP
- MOV A,P1
- CPL A
- ANL A,#0FH
- JNZ RETURN ;等待按鍵松開(kāi)
- RET
- ;========== 液晶工作方式設(shè)置 ============
- SELLCD: MOV A,#01H ;清屏,光標(biāo)復(fù)位
- ACALL ENABLE
- MOV A,#38H ;設(shè)置顯示模式,8位兩行,5*7點(diǎn)陣
- ACALL ENABLE
- MOV A,#0DH ;顯示器開(kāi),允許內(nèi)爍
- ACALL ENABLE
- MOV A,#06H ;文字不動(dòng),光標(biāo)右移
- ACALL ENABLE
- RET
- ;========== 液晶執(zhí)行指令 ============
- ENABLE: CLR RS
- CLR RW ;RS,RW同為低電平時(shí)寫(xiě)入指令
- MOV P0,A
- CLR E ;E由高變低時(shí)執(zhí)行指令
- ACALL WAIT
- SETB E
- RET
- ;========== WAIT ============
- ;判斷液晶是否忙的子程序
- WAIT: MOV P0,#0FFH
- CLR RS
- SETB RW ;RW為高,RS為低時(shí)可讀忙信號(hào)
- CLR E
- NOP
- SETB E
- JB P0.7,WAIT
- RET
-
- ;========== 顯示的起始地址 ============
- ;在第一行
- LINE1: MOV A,#80H
- ACALL ENABLE
- RET
- ;在第二行
- LINE2: MOV A,#0C0H
- ACALL ENABLE
- RET
- ;=========== 顯示程序 ============
- DISPLAY:MOV R7,#00H
- NEXT: MOV A,R7
- MOVC A,@A+DPTR
- CJNE A,#10H,DSP
- RET
- DSP: ACALL WRDATA
- INC R7
- AJMP NEXT
- ;========== 將A里面的數(shù)據(jù)寫(xiě)入液晶 ============
- WRDATA: SETB RS
- CLR RW
- MOV P0,A
- CLR E
- ACALL WAIT
- SETB E
- RET
- ;=========== 報(bào)警程序 ============
- WRANING: SETB TR0
- ACALL BACK
- MOV R4,#00H
- ACALL D2
- JNB 20H, WRANING
- RET
- ;=========== 發(fā)聲程序 ============
- BACK: MOV R0,#100
- KK1: CPL SPEAK
- LCALL DELAY2MS
- DJNZ R0,KK1 ;不斷取反P2.0使其產(chǎn)生一定頻率的方波推動(dòng)揚(yáng)聲器
- RET ;延時(shí)的長(zhǎng)短可以改變輸出的頻率
- ;=========== INTT0 ============
- ;報(bào)警時(shí)間設(shè)定
- INTT0: PUSH ACC
- PUSH PSW
- MOV TH0,#3CH
- MOV TL0,#0BH
- INC 45H
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
電子密碼鎖.rar
(121.75 KB, 下載次數(shù): 52)
2021-4-18 20:02 上傳
點(diǎn)擊文件名下載附件
師兄改的 下載積分: 黑幣 -5
|
|