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