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