找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1926|回复: 0
打印 上一主题 下一主题
收起左侧

我的DIY ( 51单片机汇编+蓝牙串口 ) 实现手机输入密码开锁

[复制链接]
跳转到指定楼层
楼主
本帖最后由 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                ;; 主程序结束




(89s52+蓝牙串口)手机用密码开锁电路.jpg (53.85 KB, 下载次数: 35)

(89s52+蓝牙串口)手机用密码开锁电路.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表