标题:
我的DIY ( 51单片机汇编+蓝牙串口 ) 实现手机输入密码开锁
[打印本页]
作者:
Kxuan163
时间:
2020-12-22 13:17
标题:
我的DIY ( 51单片机汇编+蓝牙串口 ) 实现手机输入密码开锁
本帖最后由 Kxuan163 于 2020-12-24 20:34 编辑
【电路图】
[attach]259114[/attach]
.
【工作原理】
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秒[attach]259114[/attach] 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 ;; 主程序结束
(89s52+蓝牙串口)手机用密码开锁电路.jpg
(53.85 KB, 下载次数: 39)
下载附件
2020-12-24 20:34 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1