|
本帖最后由 Kxuan163 于 2020-12-24 20:34 編輯
【電路圖】
.
【工作原理】
BT05藍(lán)牙串口模塊連接單片機(jī)的串行口(如圖),單片機(jī)及電磁鎖安裝于室內(nèi),
主人歸家時(shí),在門外操作安卓手機(jī),運(yùn)行手機(jī)端藍(lán)牙串口APP,
搜索到室內(nèi)BT05藍(lán)牙,隨即在手機(jī)輸入開鎖密碼,以串行通信方送密碼,
室內(nèi)的單片機(jī)接收串行數(shù)據(jù)并校驗(yàn)密碼,若校驗(yàn)無(wú)誤則由P0.1腳輸出低電平,
再經(jīng)光耦4N25及反向驅(qū)動(dòng)芯片MC1413使繼電器J3線包通電,觸頭K3閉合,
電磁鐵L通電開鎖。
.
【匯編語(yǔ)言源程序】 Kxuan163 原創(chuàng)
ORG 0000H
JMP START
;;--------------------------------------------
ORG 000BH ;定時(shí)器T0中斷處理入口地址
AJMP T0_INT
;;--------------------------------------------
ORG 0030H ;; 主程序入口地址
START: MOV SP, #60H ;; 設(shè)定棧頂初址
;;--------------------------------------------
ACALL DSPLED ;; LED7~LED0逐個(gè)顯示1遍
ACALL SET_T0
ACALL SET_T1
;;--------------------------------------------
R_X: ;; 串行接收
SETB P0.1 ;; P0.1高電平,防止控制對(duì)象誤動(dòng)作
MOV R2, #5 ;; 接收出錯(cuò)允許次數(shù)
R_X_A: ;; 開始接收
CLR RI ;; RI清零,允許接收字符
MOV P2, #11111110B ;; LED指示燈亮,表示開始接收數(shù)據(jù)
MOV R3, #12 ;; 開鎖密碼由12個(gè)字符組成
MOV DPTR, #DAT_tab ;; 數(shù)據(jù)表首址
RX_1chr: ;; 接收1個(gè)字符
JNB RI, $ ;; 等待1個(gè)字符幀接收完畢
RX_check: ;; 檢測(cè)收到的字符與數(shù)據(jù)表DAT_tab對(duì)應(yīng)字符相同否?
CLR A
MOVC A, @A+DPTR ;; A←數(shù)據(jù)表的1個(gè)字符
CJNE A, SBUF, RX_err
DJNZ R3, RX_next ;; 該字符無(wú)誤,接收另一字符
OK: ;; 全部字符接收檢測(cè)無(wú)誤
CLR P0.1 ;; P0.1低電平,驅(qū)動(dòng)外設(shè)動(dòng)作
MOV P2, #01010101B ;;#11111101B ;; 藍(lán)LED亮1秒 ACALL DLY1s
AJMP START
RX_next: ;; 接收另一字符
INC DPTR ;; 數(shù)據(jù)表指針移動(dòng)
CLR RI ;; RI清零,允許接收字符
SJMP RX_1chr ;; 接收另一字符
RX_err: ;; 接收字符出錯(cuò)
RX_errA: DJNZ R2, R_X_A ;; 若出錯(cuò)未夠5次,重新開始接收
ACALL DLY20s
AJMP START ;; 若出錯(cuò)達(dá)5次,延時(shí)20秒后初始化
;;--------------------------------------------
SET_T1: ;; 用T1產(chǎn)生波特率的設(shè)置
MOV TMOD, #20H ;; T1定時(shí)模式.方式2(8位自動(dòng)重載計(jì)數(shù)初值)
MOV TH1, #0FDH ;;
MOV TL1, #0FDH ;; 波特率9600
MOV SCON, #70H ;; 設(shè)定串口工作方式1,8位UART,接收允許 ANL PCON, #00H ;; 波特率不倍增
SETB TR1 ;; 啟動(dòng)定時(shí)器T1
RET
;;--------------------------------------------
SET_T0: ;; T0初始化,
;; 定時(shí)65ms的計(jì)數(shù)值 =65000μs/1μs =65000
;; 方式1,16位計(jì)數(shù)器,計(jì)數(shù)值 =65536-65000 =536 =218H
MOV TMOD, #01H ;; T0定時(shí)模式.方式1(16位計(jì)數(shù)器)
MOV TH0, #02H ;; 裝入計(jì)數(shù)初值高字節(jié)
MOV TL0, #18H ;; 裝入計(jì)數(shù)初值低字節(jié)
SETB TR0 ;; 啟動(dòng)T0
SETB ET0 ;; 允許T0中斷
SETB EA ;; MPU開中斷
RET
;;-------------------------------------------
T0_INT: ;; T0定時(shí)中斷處理程序,每隔65ms喂狗一次
CLR P0.3 ;; FeedDog 喂片外狗
MOV TH0, #02H ;; 重裝計(jì)數(shù)初值高字節(jié)
MOV TL0, #18H ;; 重裝計(jì)數(shù)初值低字節(jié)
RETI
;;--------------------------------------------
DLY250: ;; 延時(shí)250ms
DLY250A: MOV R5,#2
DLY250B: MOV R6,#250
DLY250C: MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY250C
DJNZ R5,DLY250B
RET
;; 1個(gè)機(jī)器周期 =12/(11.0592MHz) ≈1.085μs
;; 每條DJNZ Rn,rel指令耗費(fèi)2個(gè)機(jī)器周期≈2μs
;; 2x250x250x2μs≈250 000μs =250ms
;;----------------------------------------------
DLY1s: ;; 延時(shí)1秒
DLY1sA: MOV R5,#8
DLY1sB: MOV R6,#250
DLY1sC: MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY1sC
DJNZ R5,DLY1sB
RET
;; 8x250x250x2μs=1 000 000μs =1ms
;;--------------------------------------------
DLY20s: ;; 延時(shí)20秒
DLY20sA: MOV R4,#4
DLY20sB: MOV R5,#40
DLY20sC: MOV R6,#250
DLY20sD: MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY20sD
DJNZ R5,DLY20sC
DJNZ R4,DLY20sB
RET
;;4x40x250x250x2μs =20 000 000μs =20s,
;;--------------------------------------------
DSPLED: ;;LED7~LED0逐個(gè)顯示1遍然
LEDLP1: MOV A, #01111111B
LEDLP2: MOV P2, A ;; LED7亮
CALL DLY250 ;; 延時(shí)250ms
CJNE A, #11111110B, DSP_next
SJMP END_LED
DSP_next: RR A ;; 右移1位
SJMP LEDLP2 ;; 另一個(gè)LED亮
END_LED: RET
;;--------------------------------------------
DAT_tab: ;;12個(gè)字符的ASCII碼,例如 38H,39H,73H,35H,32H...
;;對(duì)應(yīng)手機(jī)端輸入的密碼: 8 9 s 5 2 ...
;;----------------------------------------------
END ;; 主程序結(jié)束
|
評(píng)分
-
查看全部評(píng)分
|