STM32项目设计:基于stm32f4的智能门锁(附项目视频全套教程、源码资料)

article/2025/9/25 22:42:46

文章目录

  • 智能门锁
    • 一、项目背景
    • 二、项目功能要求
    • 三、元件准备
    • 四、项目设计
      • (一)原理图设计
      • (二)硬件设计
      • (三)程序设计
    • 五、上机调试
    • 六、知识扫盲
    • 七、项目图片展示

智能门锁

资料链接 :智能门锁.rar

2022年1月1日前 单片机设计,有意可添加Q2809786963

百度网盘下载链接:https://pan.baidu.com/s/1jmrMfNDlkZ9denImJRwzOw
提取码:abcd(2020年12月7日08:26:11)

原理图清晰图片:智能门锁连接图.bmp

哔哩哔哩配套视频笔记:
https://download.csdn.net/download/mbs520/20049130

哔哩哔哩项目展示视频:https://b23.tv/bxfxvd

哔哩哔哩视频教程:https://www.bilibili.com/video/BV1Ah411y71E
在这里插入图片描述

学习QQ建立了,大家有什么疑问都可以在群里交流学习:981140834
取走记得点赞,谢谢各位。

一、项目背景

在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。
在这里插入图片描述

二、项目功能要求

1、可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上
2、在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动步进电机一圈
3、可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
4、实现RFID与手机解锁(蓝牙解锁)
5、扩展:虚位密码解锁(虚位密码:自己百度)

项目所用到的主要技术:
1、IIC协议、SPI协议、串口协议
2、外部flash驱动、SD卡驱动
3、FTAFS文件系统
4、RTC实时时钟

三、元件准备

1、步进电机(带驱动模块)
型号:28BYJ4+ULN2003

在这里插入图片描述

2、4X4矩阵按键
在这里插入图片描述
3、指纹模块AS608(串口控制)在这里插入图片描述

4、0.96寸OLED显示屏(IIC)
型号:7针

在这里插入图片描述

5、蓝牙模块HC-05
在这里插入图片描述

6、主控芯片STM32F407ZGT6
型号:普中最小系统板
在这里插入图片描述
7、RFID RC522 射频模块(带一张卡片)在这里插入图片描述
8、杜邦线

四、项目设计

(一)原理图设计

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

(二)硬件设计

根据原理图连接好硬件电路
在这里插入图片描述

(三)程序设计

由于代码过长只展示部分代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "sram.h"   
#include "malloc.h" 
#include "sdio_sdcard.h"    
#include "malloc.h" 
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"    
#include "fontupd.h"
#include "text.h"	
#include "oled.h"
#include "beep.h"
#include "button4_4.h"
#include "AS608.h"
#include "walkmotor.h"
#include "usart2.h"
#include "rtc.h"
#include "MFRC522.h"
#include "usart3.h"	
#include "stmflash.h"#define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改//要写入到STM32 FLASH的字符串数组
const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};
#define TEXT_LENTH sizeof(TEXT_Buffer)	 		  	//数组长度	
#define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
#define FLASH_SAVE_ADDR  0X0802C124 	//设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区.//否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机.SysPara AS608Para;//指纹模块AS608参数
u16 ValidN;//模块内有效指纹个数
u8** kbd_tbl;void Display_Data(void);//显示时间
void Add_FR(void);	//录指纹
void Del_FR(void);	//删除指纹
int press_FR(void);//刷指纹
void ShowErrMessage(u8 ensure);//显示确认码错误信息
int password(void);//密码锁
void SetPassworld(void);//修改密码
void starting(void);//开机界面信息
u8 MFRC522_lock(void);//刷卡解锁
u8 Add_Rfid(void);		//录入
void Set_Time(void);
void Massige(void);
u8 Pwd[7]="      ";  //解锁密码1
u8 Pwd2[7]="      ";  //解锁密码2
u8 cardid[6]={0,0,0,0,0,0};  //卡号1
int Error;  //密码验证信息//数字的ASCII码
uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//显示缓冲区
u8  dispnumber5buf[6];
u8  dispnumber3buf[4];
u8  dispnumber2buf[3];
//MFRC522数据区
u8  mfrc552pidbuf[18];
u8  card_pydebuf[2];
u8  card_numberbuf[5];
u8  card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8  card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
u8  card_readbuf[18];
//SM05-S数据区
u8  sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
//extern声明变量已在外部的C文件里定义,可以在主文件中使用
extern u8  sm05receivebuf[16];	//在中断C文件里定义
extern u8  sm05_OK;							//在中断C文件里定义u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
u8 * setup[7]={"1、录入指纹","2、删除指纹","3、修改密码","4、修改时间","5、录入卡片","6、查看信息"};int main(void)
{u16 set=0;int key_num;int time1;int time2;		//锁屏时间char arrow=0;  //箭头位子NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2My_RTC_Init();		 		//初始化RTCRTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);		//配置WAKE UP中断,1秒钟中断一次delay_init(168);  //初始化延时函数uart_init(115200);	//初始化串口1波特率为115200,用于支持USMARTuart3_init(9600);// 蓝牙初始化usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯PS_StaGPIO_Init();	//初始化FR读状态引脚LED_Init();					//初始化LED  
//	BEEP_Init();    		//beep初始化Button4_4_Init();//矩阵按键初始化OLED_Init(); 			//oled初始化W25QXX_Init();				//初始化W25Q128Walkmotor_Init(); //步进电机初始化my_mem_init(SRAMIN);		//初始化内部内存池 my_mem_init(SRAMCCM);		//初始化CCM内存池 exfuns_init();				//为fatfs相关变量申请内存  f_mount(fs[0],"0:",1); 		//挂载SD卡 f_mount(fs[1],"1:",1); 		//挂载FLASH.starting();//开机信息  logoSTMFLASH_Read(0X08020004,(u32*)Pwd,2);	//读取密码1STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //读取密码2STMFLASH_Read(0X080f0004,(u32*)cardid,1); //读取卡号1while(1){
//锁屏界面
MAIN:OLED_Show_Font(56,48,0);//显示锁图标while(1){time1++;if((time1%200)==0)//时间显示:每50ms更新一次显示数据{Display_Data();}if((time1%1000)==0)//每200ms检测一次卡片,蓝牙数据{//MFRC522解锁MFRC522_Initializtion();			Error=MFRC522_lock();if(Error==0)goto MENU;	else OLED_Show_Font(56,48,0);//锁//手机蓝牙解锁密码1Error=usart3_cherk((char*)Pwd);         if(Error==0){OLED_Clear();Show_Str(20,10,128,24,"解锁中...",24,0);	Walkmotor_ON();Show_Str(20,10,128,24,"已解锁!",24,0);goto MENU;	}else OLED_Show_Font(56,48,0);//锁//手机蓝牙解锁密码2Error=usart3_cherk((char*)Pwd2);if(Error==0){OLED_Clear();Show_Str(20,10,128,24,"解锁中...",24,0);	Walkmotor_ON();Show_Str(20,10,128,24,"已解锁!",24,0);goto MENU;	}else OLED_Show_Font(56,48,0);//锁} //指纹解锁if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下{while(PS_Sta){Error=press_FR();//刷指纹if(Error==0)goto MENU;else OLED_Show_Font(56,48,0);//锁}}//密码锁key_num=Button4_4_Scan();	//按键扫描if(key_num!=-1){Error=password();if(Error==0)goto MENU;	else OLED_Show_Font(56,48,0);//锁}}

五、上机调试

把硬件连接好之后还需要做一些准备工作:
录入指纹:
(1)程序下载之前需要给门禁一个解锁方式,门锁一共有4种解锁方式:指纹、蓝牙、卡片、密码。其中卡片需要录入过系统的才可以解锁,密码一开始保存在stm32内部flash中,内部flash做eeprom需要先初始化,解锁后在设置中更改密码或者在代码中进行初始化密码,不然密码是乱码。
(2)串口录入指纹:将串口转TTL CH340模块连接好指纹模块,用配套上位机录入自己的一个指纹。详细连接方法参考指纹模块资料
(3)解锁后就可以进行设置密码和录入卡片等操作在这里插入图片描述
在这里插入图片描述
移植汉字库:(如果没有SD卡接口可以自己汉字取模显示)
(1)准备一个sd卡,一个读卡器,用来存储汉字库,显示到OLED
(2)找到开发资料下的SYSTEM文件夹
在这里插入图片描述
(3)把SYSTEM文件夹复制到SD卡根目录下(一定要是根目录下)在这里插入图片描述
(4)复制好之后吧SD卡插到开发板
(5)下载程序到开发板启动,如果可以显示汉字说已经移植成功。(注意:开始的化作尘&指纹锁界面是显示的图片,并不是汉字字体)

一般遇到的问题:

如果进去只显示“化作尘指纹锁”然后黑屏,那么是字库的问题
如果因为不知道密码进不去主界面,那么打开代码,将密码打印出来,然后就可以用密码解锁了,一共两个密码,任意一个都可以解锁:
在这里插入图片描述
因为没有考虑到字符不全是’0’- '9’的关系,密码打印出来不是数字,所以查看密码不成功

正确打开方式
步骤一:直接给密码赋值操作,然后编译下载,下载完成后输入密码“123456”是肯定可以进主界面的,然后点击修改密码,密码修改为你想要的密码“000111”,这个密码会保存到内部eeprom
,密码初始化就完成了

1、在127行加入如下代码编译下载
在这里插入图片描述
2、输入密码“123456”解锁
在这里插入图片描述
3、进入解锁后界面,选择修改密码
在这里插入图片描述
密码修改为“123456”后保存,会保存到内部eeprom
在这里插入图片描述

步骤二:把刚刚写的代码注释,重新下载进去,代码就可以正常运行了,输入刚刚设置的密码“000111”就可以解锁

在这里插入图片描述
蓝牙调试
1、首先下载“蓝牙串口”APP
2、连接蓝牙后发送密码“123456::”

蓝牙发送密码不解锁?

1、可能是波特率不对
①可以通过AT指令修改蓝牙模块的波特率与单片机一样(9600),使得蓝牙模块能连接单片机(单片机代码初始化蓝牙模块的波特率一般为9600)
②可以用usb转ttl将蓝牙模块与电脑相连,打开串口助手后,用手机连接蓝牙发送数据,调节串口助手的波特率,接收到正常数据后记录波特率,这个就是蓝牙模块现在的波特率,随后将代码中初始化蓝牙模块的波特率改成这个波特率,单片机就可以正常与蓝牙模块通信
2、可能是蓝牙模块接线不对,吧tx rx对调
3、可能蓝牙模块已经损坏

开机图片取模显示
取模软件合集.rar
1、先画一张黑白的128*64分辨率的 .bmp图片
在这里插入图片描述
2、打开Image2Lcd软件,先打开图片,按照如下配置,点击保存,会生成取模代码
在这里插入图片描述

六、知识扫盲

(一)汉字的显示
(具体代码参考正点原子“汉字显示实验”)

1、汉字的显示原理

1)学习过屏幕驱动的应该都知道,屏幕的显示无非就是在屏幕上打相应颜色的点,比如要显示一个字符 ‘A’ 那么我只需要知道 ‘A’ 相应的点阵数据就可以把它显示出来,汉字也一样。

2、汉字库

1)汉字库文件在正点原子的开发板资料->“SD卡根目录文件”中,可以到正点原子官网论坛下载
在这里插入图片描述
2)汉字库有两类文件,.FON与.BIN文件,.FON代表汉字库点阵文件,.BIN表示的是编码表,与点阵一一对应,比如GBK编码的第一个字就对应着点阵里的第一个点阵数据,映射关系如下:
UNIGBK->GBK12.FON
UNIGBK->GBK24.FON
UNIGBK->GBK32.FON

有兴趣可以百度一下查看GBK编码表:
在这里插入图片描述

2、汉字库的存储位置

2)汉字与字符不同的是,汉字有1万多个,ASCII码字符却只有100多个,并且汉字的显示明显比字符的点阵复杂程度高,比如说字体是12的字符占用点阵是12x6,每个字符需要12x6/8=9个字节的存储空间。字体是12 的汉字占用12x12的点阵,每个汉字需要12x12/8=18个字节存储空间,这还是最小字体,大的字体所需要的存储空间只会成倍增加

3)一般12号字体的汉字库需要500K字节、16号字体700K、24号字体1.6M、32号字体3M,这对于单片机来说数据量太大了,内部FLASH512K~1M表示压力很大
在这里插入图片描述
4)需要把汉字库保存到SD卡,再将SD卡中的汉字库数据保存到外部FILASH才行,w25q128无疑是个好选择,它拥有16M的存储空间,SPI通信协议,读写速度也是相当快。

(二)把汉字库里的点阵数据读取出来显示到MCU屏

1、数据编码格式的问题

1)有关显示汉字就必然会涉及编码格式的问题,不同的编码格式对应的汉字编码是不同的,比如UTF-8编码的文件用GB2312编码打开就会乱码。
同理,比如文档的格式是UTF-8编码,但是我的字库是GBK编码,读出来的数据直接显示到屏幕就必然会乱码

2)所以显示汉字如果乱码首先需要检查的就是编辑器的编码,保证编码一致。

七、项目图片展示

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

资料下载:https://download.csdn.net/download/mbs520/12662458
在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/LjtOcS3j.shtml

相关文章

软件测试项目实战Web项目实战解析(附全套实战项目视频+源码+部署教程+服务器)

前言: Web项目是当今软件行业中最为常见的一种应用类型,而对于从事Web项目测试工作的测试人员来说,实战经验和技能水平尤为重要。本篇文章提供了一套完整的Web项目实战解析教程,包括全套实战项目教程、视频和源码。这些实战项目以…

JavaWeb新项目视频管理平台要这么做附源码

一 课程介绍 简介:本项目为JavaWeb项目(视频管理平台),是在Web环境下实现的视频管理平台。技术上涉及Servlet、JSP、EL表达式、JSTL、Apache Dbutils、分页,以及其他之前Web阶段所学习的课程内容。本项目重点锻炼学员的Servlet、JSP、MySQL数…

Project免费视频教程来了

Microsoft Project是国际上享有盛誉的通用项目管理软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本的计划、控制。 MS Project的应用门槛极低,只要你懂什么是甘特图,基本上就会用它。 MS pr…

项目管理(视频学习)

第四章项目整合管理-7_哔哩哔哩_bilibili 第四章 项目整合管理 4.1 什么是整合管理 4.2 项目整合管理考虑因素 4.3 项目管理过程框架 4 过程组(项目整合管理) 4.1 制定项目章程 4.2 制定项目管理计划 4.3 指导与项目管理工作 4.3.1 变更类型 4.3.2 项…

视频教程-项目管理12个微案例-项目管理

项目管理12个微案例 清华大学项目管理硕士 清华大学MPM同学会创始人,PMI国际认证讲师。 一线实战经验:15年以上,授课经验:5年以上 T培训 T1--项目管理实战九步演练 T2—项目管理沙盘课程 T3--PMP与IPMP-C内训课 T4--项目经理领导力…

【项目】视频点播系统

目录 一、项目介绍1. 对视频点播系统的认识2. 服务端功能模块划分 二、环境搭建2.1 升级GCC2.2 安装JsonCpp库2.3 引入httplib库2.4 MySQL数据库及开发包安装 三、第三方库的认识3.1 认识JsonCpp3.2 JsonCpp实现序列化3.3 JsonCpp实现反序列化3.4 认识MySQL数据库的API3.5 使用…

IT老哥分享的27套Java实战项目视频教程

一、27套Java实战项目视频教程 最近在B站上看到了IT老哥分享的27套Java实战项目视频教程,今天全给你们了 下面是27套Java实战项目视频教程- 百度网盘链接 链接:https://pan.baidu.com/s/1O-UkPSH2A4XtWNhKREl7EQ 提取码:8ldi 链接&#xf…

二、全国计算机三级数据库考试——理论知识总结(填空题)

上一篇博客:一、全国计算机三级数据库考试——理论知识总结(选择题)_简时刻的博客-CSDN博客 说明:红色字为三级数据库考试中需要输入的答案,填空题在考试中一共15道题,一题2分,一共30分。 IDEFO…

计算机三级-数据库技术

三级数据库技术知识点总结 1 数据字典是对系统种各类数据描述的集合,包括数据项,数据结构,数据流,数据存储和处理过程五个部分 2 数据模型的三要素:数据结构、数据操作和完整性约束 3 数据库系统:一般由数…

一个月的时间准备计算机三级数据库技术,够吗?

去年九月考了计算机三级数据库技术,花了不到一个月的时间学了下,有些经验心得,打算把它记录下来,回顾一下学习历程,同时也希望能给其他小伙伴一些小经验吧~ 学习之前一定要有的装备 (1)关注“计算机等级考试”公众号,除了了解平时的考试动态以外,还有就是要买他们的…

计算机三级数据库好考吗,2019计算机三级数据库难吗 如何备考

很多同学想知道计算机三级数据库难不难,下面是小编整理的相关内容,希望对大家有所帮助! 计算机三级数据库难吗 计算机三级数据库考试不是很容易,数据库技术计算机中专毕业生以及计算机相关专业大学低年级的学生、希望系统学习计算…

数据库技术-计算机三级考试介绍

前言 随着互联网的快速普及,我们身处在信息大爆炸的环境之中,每一天都在产生海量的数据信息,有人就会疑问,这些信息到底存储在哪里?解答这个问题之前,我首先问一个很简单的问题,如果你有很多的…

三、全国计算机三级数据库考试——操作题(1—5套)

上一篇博客:https://blog.csdn.net/weixin_44940488/article/details/119417955 说明: 目录 第一套操作题 第46题 第47题 第48题 第二套操作题 第46题 第47题 第48题 第三套操作题 第46题 第47题 第48题 第四套操作题 第46题 第47题 第48题 第…

计算机三级数据库要学哪些知识,计算机三级数据库怎么备考 考试内容是什么...

很多同学想知道计算机三级数据库如何备考,下面是小编整理的相关内容,希望对大家有所帮助! 计算机三级数据库如何备考 1、章节复习,不管是那门学科都分为大的章节和小的课时,一般当讲完一个章节的所有课时就会把整个章节…

计算机三级数据库填空题汇总

第一套: 1.数据库管理系统提供了数据定义语言(DDL),用于定义各种数据库对象。数据定义语句经DDL编译器编译后,各种对象的描述信息存放在数据库的数据字典中。 2.关系数据库中要求关系的主码不能为空,这属于…

小白菜飘过计算机三级数据库

害,是真的没学啥没东西写了 买书呜呜47大题归纳填空题46大题 好久没更新了,害,把之前的三级数据库笔记录下来吧(强行刷存在感) 计算机三级数据库也及格佛佛的过了,虽然没学过但是机械刷题找规律还是勉强混过…

计算机三级——数据库技术

计算机三级——数据库技术 一、考试内容及要求 掌握数据库技术 的基本概念、原理、方法和技术。能够使用SQL语言实现数据库的基本操作(增删改查)基本数据库系统安装配置以及数据库管理及维护的基本技能。掌握数据库管理和维护的方法。掌握数据库性能优…

全国计算机等级考试三级数据库技术(十)

第10章_数据库运行维护与优化 考点分析 ◆在考试中一般情况下会出现在选择题、填空题部分。 ◆常考知识点有: 1.熟悉数据库运行维护基本工作 2.理解运行状态监控与分析 3.熟悉数据库存储空间管理 4.掌握数据库的模式调整与优化、存储优化、查询优化 10.1 数据库运行维护基本…

全国计算机等级考试三级数据库技术(七)

考点分析 ◆在考试中一般情况下会出现在选择题、填空题、大题。 ◆常考知识点有: 1.掌握SQL Server数据库的类别、甩途及组成 2.掌握修改数据库、分离和附加数据库的语法 3.理解架构含义与语法格式 4.掌握分区表的概念、创建分区方案 5.掌握创建索引及索引视图 7.1 创建及维护…

全国计算机等级考试三级数据库技术(一)

第一章_数据库应用系统开发方法 考点分析 ◆在考试中一般情况下会出现在选择题和填空题部分。 ◆常考知识点有: 1.掌握数据库应用系统生命周期、DBAS生命周期模型 2.掌握系统规划与定义的内容 3.掌握数据、功能、性能的需求分析 4.理解概念、逻辑、物理设计 5.熟悉实现与部署…