你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32项目设计:基于stm32f4的智能门锁

[复制链接]
STMCU小助手 发布时间:2022-8-15 19:57
一、项目背景
5 A( q1 w7 J; s4 F0 t2 @+ k在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。2 t/ i1 p, y/ C5 m
) Z7 D9 ^; L( G. L$ X' K' K
XYT~RODDVGH34KJ`94H}H}C.png / L! T2 s' i: ~& Y  \) [; ~
/ s0 T1 f/ R) C, m4 |+ L9 u3 j  a
二、项目功能要求
# Y5 K/ `. J& i7 [' g2 L1、可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上# `( j1 Z" _& A; i% k+ F$ |
2、在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动步进电机一圈6 o( x: [: C% x7 ?& H
3、可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中* J( O. J! A6 s( j# M% U5 h! t" C
4、实现RFID与手机解锁(蓝牙解锁)
: A2 Z& s! o' s3 V5、扩展:虚位密码解锁(虚位密码:自己百度)
' L0 F! z* R6 P$ O/ L* H! o$ U; Q9 @" B% V) f1 Q
项目所用到的主要技术:2 O' m: J. g/ s: s! Q0 i
1、IIC协议、SPI协议、串口协议
" Y; R" h8 q( Z4 |2、外部flash驱动、SD卡驱动
$ Q$ \- Z( x/ D- D4 h, W* ^1 ]2 S3、FTAFS文件系统
$ `! r) n( ~: \" O1 N2 K' @' I& D4、RTC实时时钟8 q: S" d: l0 H2 h* K6 \3 Y! H! w
& C6 z' }& b8 R4 Q6 J& S
三、元件准备! \: W! |: Q( v6 j
1、步进电机(带驱动模块)
6 A3 i% E4 H$ z, d* w$ z$ d4 V型号:28BYJ4+ULN2003
+ [3 b9 U  g, i. _5 \( z" ~% H8 e7 e) s/ W7 ^
20200627204259600.png : c1 P3 o* B# L, M

$ \& Z; Y3 [$ ~' A) O) n3 T2、4X4矩阵按键
3 E9 n% P& M( u! i+ H  w
7 b  S, d( P8 \
RA$A1)4_EZX@TPQV7Y68`LJ.png * O2 a0 N2 K  Q4 I
  _& ~/ T6 w' o4 H4 H
3、指纹模块AS608(串口控制); T2 Z. |: n2 \& C, s  Q& N
6 D- x* g7 o, s5 ?
4、0.96寸OLED显示屏(IIC)
% w( e* e( `! o0 @; W* b0 t型号:7针" M3 ]' I2 b4 i1 c5 h
/ W7 m% `' m2 m' r) h$ Y
MF3N86_UCB`5(1~0$K{THYJ.png
" o( Z4 Y7 V8 _  f4 ]) B+ a' l& H7 t
5、蓝牙模块HC-05
6 |8 N% U& l+ S1 G! s" g# M1 |! |/ A& g% l7 W- M* x! u/ [$ A- F
R(XAFOM63WB{J[HMWL1N~XV.png / H6 l- Q: P! X% Z0 P9 K
9 ?& O6 A- w8 _: m4 ^/ z4 A/ ]; i" i
6、主控芯片STM32F407ZGT6
: e0 G9 \8 y5 z1 p2 r/ U型号:普中最小系统板
) B4 R3 s5 S% L7 b7 y  n
" r" ^, J8 Q9 F& F1 N- N7 d% E! L# \
9 C. E' v" D/ m: f$ o# }. r3 C
1@W5_5G5@}Y)RAD(`0CFD~K.png / W: l9 x4 k' f- x3 N) t# ?7 G3 P) y
% W5 I. w3 \/ f* [8 F' x8 L; c, t+ i
7、RFID RC522 射频模块(带一张卡片)
8 j+ g! d5 P: E/ |9 z- y

. n, q) Q; o6 Q" G' y7 W* `
' F4 D" p: z0 h2 c0 w
C{]X1_Q53]IALFCN[YC$ZEH.png
: P( z! B! v% G/ n/ q  N  h# g) a9 y
8、杜邦线
, o2 y  Q+ m' ]- ~* _
" I, V  l0 r% `! d0 R$ c( d. c9 `四、项目设计
, g) j( A% ^7 c: w# [(一)原理图设计% M, _5 M# z! {
) V' U0 O6 @) c! g# S' ]7 p8 I
~(PND}ZH68[T_TG}7TE41GW.png
; F) h, V4 n* _* s
* T: s+ p+ h, i+ I! F3 d: y& R

1 V. @* k0 ^0 H& W/ ^  w ZA(9UI@$QLAX1_{0]3OX$PJ.png % M- d( @% M* Z/ a9 _% M

: i) Z2 @$ h+ W9 [1 T

- q+ q4 a  y5 g( m- l: _3 R GF3P7SIX{0}E%HX@4MFOTSP.png
6 Y- S# {. ?0 e+ H- f0 R) S& v+ \+ K; J. W8 e+ F2 v
) f: _( E! V- E+ a  \
(二)硬件设计- b* y$ y* i  _: U6 o) t
根据原理图连接好硬件电路

6 W0 [8 j5 S, v' P3 `' V# F* F  n9 `
(%OM_R9PH@35LP]Y89~~9U7.png 4 E9 T) S2 s7 p" `

# T  E8 C0 ^2 z' y$ |(三)程序设计
: I9 Q5 G7 K, q0 f4 {" o3 r由于代码过长只展示部分代码:

$ `( q* s/ M( B
+ ^3 a$ o/ z( e. V8 T
  1. #include "sys.h"
    7 y8 r$ a: D/ x
  2. #include "delay.h"
    " L. G1 Y' G& @
  3. #include "usart.h"
    9 z: p. f0 z6 l' K
  4. #include "led.h"
    ' @8 C' P% q8 E: ^/ c" V; n
  5. #include "sram.h"   
    $ ^6 z& I& Y3 y& _: D
  6. #include "malloc.h"
    & v8 k) z9 T) N1 j; ~
  7. #include "sdio_sdcard.h"   
    7 b( g) C9 j+ @6 c# p( A+ g2 C/ l
  8. #include "malloc.h" & z: x$ Z  f# E- _* \3 O
  9. #include "w25qxx.h"   
    % ?  R# V" m! |( P/ o. u2 P  ]
  10. #include "ff.h"  
    6 \  F# U: a8 @+ Q, x
  11. #include "exfuns.h"   
    + X  K) x$ z: q8 H3 k
  12. #include "fontupd.h"; l$ D$ ?( `' F" T* k! C1 ~
  13. #include "text.h"        , h+ z3 F2 U; |; ~9 Z$ {: o$ C
  14. #include "oled.h"
    4 Y1 A2 T. T' p* d  k+ I5 o
  15. #include "beep.h"
    6 q3 D" [( J2 ]
  16. #include "button4_4.h"( f5 B$ b: S5 j6 L
  17. #include "AS608.h"& h# }+ ?& z4 x% a* B7 ~/ B
  18. #include "walkmotor.h"
    4 N: I" z+ U5 v- B  e" R
  19. #include "usart2.h"
    % K. [, ]/ w- g7 \$ R$ e% D
  20. #include "rtc.h"
    9 ^0 S$ j4 Q3 {- K
  21. #include "MFRC522.h"* r* N$ j8 [8 l
  22. #include "usart3.h"        9 F8 T" q1 P6 ~' T, x
  23. #include "stmflash.h"' n9 J8 H2 C5 U2 ^" g  Z5 `

  24. " i- Z( a. v3 R5 K( _! b- H" D
  25. #define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改
    3 C$ u7 w. @* c

  26. 7 \- R1 W, i, G& G! N1 q
  27. //要写入到STM32 FLASH的字符串数组
    9 H: \8 W$ y" s$ J- O9 p4 x
  28. const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};5 _5 |' {) I8 j  D
  29. #define TEXT_LENTH sizeof(TEXT_Buffer)                                   //数组长度        , s% I3 A6 C6 Y
  30. #define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
    5 W1 t5 B7 ^' x
  31. #define FLASH_SAVE_ADDR  0X0802C124         //设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区.  V7 C# a1 y8 `$ C8 m! e
  32.                                                                                 //否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机.
    # i7 \' U6 R% |( y) T$ v5 y
  33. 7 v3 z  Y0 z8 Z
  34. SysPara AS608Para;//指纹模块AS608参数  V0 ~# T4 \3 ]! e5 w9 A$ b
  35. u16 ValidN;//模块内有效指纹个数
    ( h! k* x+ _4 |9 \1 B5 l
  36. u8** kbd_tbl;
    , i1 r( h$ t& `5 ^

  37. 7 y3 k3 b2 m3 Z6 R/ B$ g" X# ~
  38. void Display_Data(void);//显示时间* F1 d  [, @6 A) u7 a
  39. void Add_FR(void);        //录指纹' J# c. W" O+ F+ x7 U3 n- X# P
  40. void Del_FR(void);        //删除指纹
    % z4 o% U3 Q7 ^$ D6 T2 `7 d7 ~
  41. int press_FR(void);//刷指纹+ n3 d0 f% z9 K
  42. void ShowErrMessage(u8 ensure);//显示确认码错误信息
    / z/ q# m6 m1 m* c
  43. int password(void);//密码锁
    " \% b6 y1 ?, l  b& e  X
  44. void SetPassworld(void);//修改密码2 d5 G  w* }( [4 O1 _' G- v
  45. void starting(void);//开机界面信息
    ( ?: I! M7 A4 q: L0 {
  46. u8 MFRC522_lock(void);//刷卡解锁$ R; ?! R9 R0 q) c
  47. u8 Add_Rfid(void);                //录入  b; U/ e0 c, e) a
  48. void Set_Time(void);
    4 D1 G" l; j. P- [
  49. void Massige(void);
    ) Y  G3 I4 J' N2 Q+ J
  50. u8 Pwd[7]="      ";  //解锁密码1  W1 Z" i; E8 \/ M2 B% ~% z5 U
  51. u8 Pwd2[7]="      ";  //解锁密码21 _6 m6 D1 X; @6 P: A
  52. u8 cardid[6]={0,0,0,0,0,0};  //卡号1' b) p) T6 ?7 o% O
  53. int Error;  //密码验证信息( w5 ]2 W* S8 E5 `; |* S1 p; _; U
  54. $ c. h; H# ]- m3 A, H. g% W* U: N
  55. 9 X. U0 Q* X- H6 S6 m* \
  56. //数字的ASCII码
    - n8 k- b3 T8 c
  57. uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};2 W2 M( w5 |! |0 o
  58. //显示缓冲区
    ) @; v, C4 s- i% C
  59. u8  dispnumber5buf[6];
    & s1 x" s4 [$ l/ o7 @7 T0 ?
  60. u8  dispnumber3buf[4];
    : E  {- K, v; b# E
  61. u8  dispnumber2buf[3];
    $ ~: O* [  r; y3 D7 @; `) Y$ Q% W
  62. //MFRC522数据区1 v. p' s  [  E, U
  63. u8  mfrc552pidbuf[18];& F% u; a9 ~8 Z4 |/ h: |
  64. u8  card_pydebuf[2];6 N$ M" N( l& ~
  65. u8  card_numberbuf[5];6 O8 ~+ F0 G% Y" g- d
  66. u8  card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};9 }5 c4 k5 h/ W/ S% C" Z4 t8 |$ H3 ~
  67. u8  card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    5 N! t# ]& u& n: @0 |0 C. U9 k
  68. u8  card_readbuf[18];
    8 x# }! r9 b# j1 B' D% N4 v
  69. //SM05-S数据区
    , T  l8 _2 P0 j6 v/ F  ]
  70. u8  sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
    2 F7 G/ r5 R0 n/ w
  71. //extern声明变量已在外部的C文件里定义,可以在主文件中使用
    & m. w1 F9 W" W. o# C
  72. extern u8  sm05receivebuf[16];        //在中断C文件里定义
    # O8 [3 j' z' A% J8 _# v" z- g
  73. extern u8  sm05_OK;                                                        //在中断C文件里定义; Y* v' s. {6 H- m1 B
  74. , R( L, ^/ A* [! O; t/ A4 c' ?# i
  75. u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};/ t- ]0 f2 u1 P& D4 {1 g, x& g; J. e
  76. u8 * setup[7]={"1、录入指纹","2、删除指纹","3、修改密码","4、修改时间","5、录入卡片","6、查看信息"};& Q9 ~3 Y+ p" _6 l
  77. & G6 S9 \( b0 |2 `8 W$ ^$ }+ D
  78. int main(void)
    # ]' ]  A8 B, E. w! c7 @
  79. {; a/ b% o1 ~; m, p- s
  80.         u16 set=0;/ ]6 r/ y8 W4 Y. G2 l# U
  81.         int key_num;# p$ m( g1 j, K' c& |, P' I
  82.         int time1;
    5 `! l8 s) v1 N% b  X5 j
  83.         int time2;                //锁屏时间
    2 G0 {. X- n7 B8 e
  84.         char arrow=0;  //箭头位子
    * t# e# Q* c* ?
  85.         
    6 L6 k: J5 M: P
  86.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2$ z; X# s0 E3 T' R( v) H
  87.         My_RTC_Init();                                 //初始化RTC
    # q9 n: [# y8 R$ A( ~
  88.         RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);                //配置WAKE UP中断,1秒钟中断一次# b2 D& k' ^7 j; q( N
  89.         delay_init(168);  //初始化延时函数
      K: P. S; b' h$ U6 P6 @) \
  90.         uart_init(115200);        //初始化串口1波特率为115200,用于支持USMART
    + }0 J0 ?: C( B9 B: |* Z) n5 S
  91.         uart3_init(9600);// 蓝牙初始化
    , r0 j: Z2 ^1 M. N. \
  92.         usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
    7 i& r! O* s& p9 ?
  93.         PS_StaGPIO_Init();        //初始化FR读状态引脚: m0 R: X6 [4 h9 Q) A) k$ c& g
  94.         LED_Init();                                        //初始化LED  9 k. I1 T5 Z6 ]. }# b
  95. //        BEEP_Init();                    //beep初始化$ m4 j( {" y# {  o( f, a
  96.         Button4_4_Init();//矩阵按键初始化
    1 S9 \5 \5 {+ A) t* t! ^
  97.         OLED_Init();                         //oled初始化3 i# X# e5 [* _
  98.         W25QXX_Init();                                //初始化W25Q128
    6 W' X# F- V. k
  99.         
    8 W6 Y" C) H2 a& e6 G% @8 z
  100.         Walkmotor_Init(); //步进电机初始化
    # O4 S. [0 w" ^# Y' y! r8 H
  101.         my_mem_init(SRAMIN);                //初始化内部内存池
    3 G. t0 ?8 T  S$ n) j' `
  102.         my_mem_init(SRAMCCM);                //初始化CCM内存池
    9 L* f6 M7 n* M/ |9 v! N- A( I
  103.         exfuns_init();                                //为fatfs相关变量申请内存  
    ! r8 _. }; @. q8 a. L, \
  104.           f_mount(fs[0],"0:",1);                 //挂载SD卡
    ( I$ `! H. H3 G5 u3 H4 `+ ~4 V, s
  105.          f_mount(fs[1],"1:",1);                 //挂载FLASH.
    ; R% `) g/ A6 I5 l# D+ Z# {
  106.         starting();//开机信息  logo
    ' W5 Q" \- d8 C. b7 k

  107. 3 H4 |$ F, I5 T! `( U9 Y
  108.         STMFLASH_Read(0X08020004,(u32*)Pwd,2);        //读取密码1: _. [7 R' B& ]/ J1 D( p$ s
  109.         STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //读取密码2
    : e* P+ l. n% K$ G1 B& t7 x/ V
  110.         STMFLASH_Read(0X080f0004,(u32*)cardid,1); //读取卡号1
    ; N+ ~5 s4 z  D  H& s! b. P, ?
  111.          while(1), u+ A; e) [3 F# @, H: L" u
  112.          {
    ! N  z, H8 x- q! ^% Y
  113. //锁屏界面
    6 d( ]- |! E- Z. B+ E
  114. MAIN:
    . V; `) V. j0 j) a
  115.                         OLED_Show_Font(56,48,0);//显示锁图标) ~4 P. Q3 @$ v7 z6 W
  116.                         while(1)
    - ?1 I- {' f) P; y; \, f# J; \6 \/ v
  117.                         {
    4 O5 x0 y5 x5 J' z2 E
  118.                                 time1++;
    " S) D! s7 k. O: ~
  119.                                 if((time1%200)==0)//时间显示:每50ms更新一次显示数据
    % X/ e' r' x7 ?
  120.                                 {
    / u4 z* E7 h& N5 [5 G, v0 x
  121.                                         Display_Data();) \* A% ?6 R" C1 w4 D
  122.                                 }) _& ~' H$ C# P: O4 {
  123.                                 if((time1%1000)==0)//每200ms检测一次卡片,蓝牙数据
    7 m: D/ e2 L8 L. \  Q
  124.                                 {
    $ h6 e" |3 V" Z1 x/ y
  125.                                         //MFRC522解锁
    0 p  A5 s1 G( x5 X; s5 |! @" o$ S
  126.                                         MFRC522_Initializtion();                        - s* @4 P& d, m  y8 b" J3 p" c' A5 W) h
  127.                                         Error=MFRC522_lock();
    2 r1 L$ C* W- p4 H4 F7 L& o& [
  128.                                         if(Error==0)goto MENU;        $ q  p/ v2 M/ m! d2 y1 o
  129.                                         else
    / B( P1 b5 n# D( m' e
  130.                                                 OLED_Show_Font(56,48,0);//锁
    2 C# k' A# K9 ]5 o' j7 A( u( q
  131.                                         //手机蓝牙解锁密码1
    , t4 O: R% `0 y. f# u& Q1 S
  132.                                         Error=usart3_cherk((char*)Pwd);         7 i* d# m: z  B- Y5 Y7 ^  V
  133.                                         if(Error==0){
    " j5 u2 D( j5 D8 C4 H  I" N* t
  134.                                                 OLED_Clear();! w- c' l" Z, f' i6 v) ?* v
  135.                                                 Show_Str(20,10,128,24,"解锁中...",24,0);        
    % Y- M  r+ U9 K' z
  136.                                                 Walkmotor_ON();& E9 ?  U4 e3 g$ \+ a& D. n5 ^
  137.                                                 Show_Str(20,10,128,24,"已解锁!",24,0);- U8 b. u+ G& U. r( o! D2 t& [& N
  138.                                                 goto MENU;        $ U, I) ?: E* U" W" f
  139.                                         }6 e; b, S8 F4 a6 \# ^0 S
  140.                                         else 2 ^' Z( x4 A1 `% S$ I1 E! r
  141.                                                 OLED_Show_Font(56,48,0);//锁6 g, U" G3 x; C  z/ N. t* O
  142.                                         //手机蓝牙解锁密码2" B9 e6 b2 t: e, o8 n
  143.                                         Error=usart3_cherk((char*)Pwd2);
    # w& f: r# }' v) c; x
  144.                                         if(Error==0){# |4 s0 d4 T7 ^! w0 W) }
  145.                                                 OLED_Clear();' v. H3 X& \0 u9 w: u$ O
  146.                                                 Show_Str(20,10,128,24,"解锁中...",24,0);        ) R+ N) y: K7 M1 N# O. C# ?
  147.                                                 Walkmotor_ON();: E% }/ Y8 }7 I. Q2 U" W9 x+ t7 x- N0 C
  148.                                                 Show_Str(20,10,128,24,"已解锁!",24,0);9 ^! C1 O- r7 A& u
  149.                                                 goto MENU;        
    # x# ~8 \9 G: @. u! U
  150.                                         }
    - F/ U! V% h/ O) S: a2 S7 T) ?
  151.                                         else 6 t& R4 F5 j' `4 |
  152.                                                 OLED_Show_Font(56,48,0);//锁  b- a2 V: S8 |
  153.                                         ; [  T0 G) M2 b7 T0 a" \; t8 d) Q
  154.                                 } 3 v( g+ N) l* G, _" P" x+ b
  155.                                 //指纹解锁
    # @' ?3 u' I" [/ D. M, V) a- o" l
  156.                                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下9 v/ N- r% i9 T  S1 C" i# @
  157.                                 {, ]1 x* G: g* Y0 {8 L
  158.                                                 while(PS_Sta){) M' ^/ _0 X# G
  159.                                                 Error=press_FR();//刷指纹. ~. ?+ e3 h" f0 H" l9 l
  160.                                                 if(Error==0)goto MENU;, `* I1 U. k) A9 \2 e3 a0 C
  161.                                                 else
    * H- e( S" B1 A1 M
  162.                                                         OLED_Show_Font(56,48,0);//锁! m4 U3 w4 Q) N# D& f+ E6 N" A% V) [
  163.                                         }
    6 a6 H& k& p& W  `: n
  164.                                 }
    - c0 T- [2 L; U
  165.                                 //密码锁
    9 b  }" K, l. y  ?
  166.                                 key_num=Button4_4_Scan();        //按键扫描' i1 D. y" I$ \6 j
  167.                                 if(key_num!=-1)% J- w! V6 R0 Z- g" Q
  168.                                 {; l6 K7 u( @/ v' P6 s0 N
  169.                                         Error=password();
    $ j3 L) ?5 c3 f( [$ S
  170.                                         if(Error==0)goto MENU;        
    % Q) Y+ O/ a# @" D: q' u" h6 o
  171.                                         else
    5 Q+ E1 _9 b+ {  ?
  172.                                                 OLED_Show_Font(56,48,0);//锁
    * M0 \$ v* x# a9 h/ b
  173.                                 }6 ^2 w8 h- m# X
  174.                         }
复制代码

0 g' E8 y. P, ~& J) i& w. w五、上机调试
7 ]( u$ R* P+ p( I* |! q0 X
把硬件连接好之后还需要做一些准备工作:
: ~9 u5 j- @% D$ j$ B6 x  ]录入指纹:3 |# z' _$ Z# z/ z, k$ d1 j/ ~1 |
(1)程序下载之前需要给门禁一个解锁方式,门锁一共有4种解锁方式:指纹、蓝牙、卡片、密码。其中卡片需要录入过系统的才可以解锁,密码一开始保存在stm32内部flash中,内部flash做eeprom需要先初始化,解锁后在设置中更改密码或者在代码中进行初始化密码,不然密码是乱码。0 }/ E* s& v9 J2 ]: J! h- Z1 k0 E$ ~
(2)串口录入指纹:将串口转TTL CH340模块连接好指纹模块,用配套上位机录入自己的一个指纹。详细连接方法参考指纹模块资料
3 Q6 a  I! o1 r& p( H; c: X(3)解锁后就可以进行设置密码和录入卡片等操作
, f+ g( P; x; w8 ^

1 o: W1 Q: c; y* k$ v) Q

# G$ }% F. T. S7 E" f; V FDM_KA9COVS2VHO0)@3S3GI.png ) T$ B9 g; q' @

, Y5 Z- }8 |7 t7 ~
1 i' [2 B( v8 U
移植汉字库:(如果没有SD卡接口可以自己汉字取模显示)
6 v! r8 |3 N0 ^/ X3 L9 }(1)准备一个sd卡,一个读卡器,用来存储汉字库,显示到OLED
! W! W- ?3 B7 ^% t0 q% l1 V5 p(2)找到开发资料下的SYSTEM文件夹
# l4 U# T! I; f$ K% T
; ^1 c* C8 Q; n4 Z# N

9 u5 J# R% N% G! U* \ QZB5$}XD3AI}H}JANGPLMOR.png * p/ M. E) }, E+ h* V
- s& M* G1 u: D+ k+ I
(3)把SYSTEM文件夹复制到SD卡根目录下(一定要是根目录下)

4 ]- A9 Y, B) a5 i- H$ {( c8 _' _. f  _* Z6 ~
* d- U, M' u! Y% a3 T* _
E_TOHIX0EQV[ESHT3S])B2T.png $ y- Y( g- p# B( P
0 Y% _6 A" u4 b
(4)复制好之后吧SD卡插到开发板
' X- I9 O" G3 }6 }5 e(5)下载程序到开发板启动,如果可以显示汉字说已经移植成功。(注意:开始的化作尘&指纹锁界面是显示的图片,并不是汉字字体)
. `  d1 R8 _2 t) y; H% |! d) k( X& r  ?
一般遇到的问题:
( k# e8 c* [6 k  K2 o& }# `* g3 |/ l1 i/ X, [* n
如果进去只显示“化作尘指纹锁”然后黑屏,那么是字库的问题% {/ f6 ^4 U' m$ e/ U, q2 f
如果因为不知道密码进不去主界面,那么打开代码,将密码打印出来,然后就可以用密码解锁了,一共两个密码,任意一个都可以解锁:
+ ^" G5 E4 K# m. a
' O) }  W; c' U) Q! g  z$ F8 ?

, X  G) [1 T) V& j* |
- g- l3 _8 ^* ^  ~& i2 ]. |) G& c6 s7 [* k" R. j% n
因为没有考虑到字符不全是’0’- '9’的关系,密码打印出来不是数字,所以查看密码不成功
2 W7 J/ J3 y7 U* }4 w6 d! g2 n% [  U. f3 V: d
正确打开方式% s$ a7 ]: E$ p6 M( Y7 T
步骤一:直接给密码赋值操作,然后编译下载,下载完成后输入密码“123456”是肯定可以进主界面的,然后点击修改密码,密码修改为你想要的密码“000111”,这个密码会保存到内部eeprom
/ j2 x6 Y0 B  Q  S& r: X,密码初始化就完成了( |$ Q1 F* x4 r

6 w4 r" r. S2 t4 o( j1、在127行加入如下代码编译下载
+ q# ^  @5 W; J6 b. e4 g4 P$ |6 ?

) z% m  h# L3 d' m- r- K7 Q

" L0 `: y6 _) q4 M4 Z 20201221084736863.png
9 J0 @7 x4 i1 D9 G; ~! O+ H$ m0 Y) \% {+ N6 n
2、输入密码“123456”解锁

, M: t$ F( Y9 z* d( L& O
; j4 }" r/ r& m! _& T% S, E: F

: x' I0 \3 r9 O: T2 m2 W5 T 0 p5 Q8 x' X  k9 h( M7 ^7 M1 @

) C# s1 J# N/ s4 P+ `3、进入解锁后界面,选择修改密码

- q* {+ a; B! [& `" w0 k3 J7 U8 z, \, F1 S! w% [
/ }- V! G& q. {7 D
[VU%ID5_VH2G13Q}6_WF[EN.png
* Y% M9 o, q2 ~
$ N4 O- F& O* H3 x' H/ b. V3 P! D密码修改为“123456”后保存,会保存到内部eeprom7 I1 s, R8 y& x2 w$ W7 u6 `
0 {1 A1 i  \$ N0 ]4 j
JEBSCZNJ68UTWCT7SI0[F9C.png
  I* X2 T9 y+ G: m8 h
* {" D5 P: o$ \5 M1 x步骤二:把刚刚写的代码注释,重新下载进去,代码就可以正常运行了,输入刚刚设置的密码“000111”就可以解锁1 ~5 |2 w6 s# Y, s
4 ~7 u2 ~! e, S9 L' C$ v
20201221084803359.png
* f6 i/ n+ ]6 X; O
  W1 S( L5 C! Z: [/ \+ o- g蓝牙调试+ U+ [) }- r( N& J
1、首先下载“蓝牙串口”APP: m+ F+ h6 Y; t
2、连接蓝牙后发送密码“123456::”
$ K, `" g6 t' `# m6 K7 ?* {4 P1 Q' T6 ^# _
蓝牙发送密码不解锁?5 @; \. R, t2 n# b

* p/ C! e; H( C4 S4 Y1、可能是波特率不对
2 u5 X  K$ s2 s# P& o/ P8 v5 D①可以通过AT指令修改蓝牙模块的波特率与单片机一样(9600),使得蓝牙模块能连接单片机(单片机代码初始化蓝牙模块的波特率一般为9600)
& E! g0 ]5 |# i  Y1 q6 j3 C: j②可以用usb转ttl将蓝牙模块与电脑相连,打开串口助手后,用手机连接蓝牙发送数据,调节串口助手的波特率,接收到正常数据后记录波特率,这个就是蓝牙模块现在的波特率,随后将代码中初始化蓝牙模块的波特率改成这个波特率,单片机就可以正常与蓝牙模块通信
* O. K4 h1 D2 M: S+ W2、可能是蓝牙模块接线不对,吧tx rx对调
: `0 {- s3 _( n5 n3、可能蓝牙模块已经损坏/ m6 T; o: k3 E5 q: X/ e$ U6 q

6 p* i' y4 ]6 u( Y开机图片取模显示
+ `- _$ S6 c, _' [取模软件合集.rar# m1 m1 |9 F6 Q$ D* t5 I( j
1、先画一张黑白的128*64分辨率的 .bmp图片
& q  D- q  I; H' S  k

- H: Y; [7 c" U% {* ?

6 [2 M" ^' j; I# @( X* \ (T2J){B)$XA_9FH`)26TK_N.png : F' y3 c- D  L% ]7 j/ d6 e! C

6 B( {; ?" k7 H( ]8 L! t2 y6 S; g2、打开Image2Lcd软件,先打开图片,按照如下配置,点击保存,会生成取模代码" {& y0 X* D# ~( _9 o, X

% D7 y/ s* G, D _OXZ@ERM~(R4$$B%8)_{F.png $ q  \: n! G( a1 P* G& L
" |, _* ~2 p" |: O
六、知识扫盲  }) k) l, a6 o5 j8 O4 M$ q* Q
(一)汉字的显示

0 P  j5 S1 f: }7 X" F  A(具体代码参考正点原子“汉字显示实验”)
$ R- I1 o& B% h" i9 P
2 K$ Z! a' V; `0 u  p4 R) H1、汉字的显示原理' {/ e* Q9 v, x4 i

$ ~2 v& {4 V9 c8 x  C- ]" j  t1)学习过屏幕驱动的应该都知道,屏幕的显示无非就是在屏幕上打相应颜色的点,比如要显示一个字符 ‘A’ 那么我只需要知道 ‘A’ 相应的点阵数据就可以把它显示出来,汉字也一样。
! t# q) c0 i: b4 Y+ R$ B
$ Z' z+ N7 Z" z: Y( S8 |; d- d2、汉字库% P1 J5 B4 e: V5 e
0 F$ G0 `: U5 J" b7 i$ T
1)汉字库文件在正点原子的开发板资料->“SD卡根目录文件”中,可以到正点原子官网论坛下载
+ L0 Z* F  I# T* v
  r9 Q5 ?- ?' U" a5 O% ], J& _! y
" J) q4 S/ h% l3 O4 ]
20201217190322952.png
# ~3 Q! o1 r- T1 c! u  u
9 p) P. R3 v* }! i2)汉字库有两类文件,.FON与.BIN文件,.FON代表汉字库点阵文件,.BIN表示的是编码表,与点阵一一对应,比如GBK编码的第一个字就对应着点阵里的第一个点阵数据,映射关系如下:8 s( D6 V" o$ G/ k! V  A9 I
UNIGBK->GBK12.FON* A" y0 ^- e! s& g' Y
UNIGBK->GBK24.FON
$ |4 A) h" F* B5 h, z2 ?UNIGBK->GBK32.FON' I2 C& ~% C0 E* T5 @
/ h6 J( W, J- A9 L! `! q
有兴趣可以百度一下查看GBK编码表:
% f& j: l5 z% X, b
! q6 |/ U+ i& k: e$ Q3 g$ Y 8624$RFMDQX_9VKGGPR7BM9.png
# U# g4 }9 z* c, k
( i6 N! }' t/ H8 W3 A% p2、汉字库的存储位置4 o/ g/ p7 i$ a' X6 {7 l
5 F( P+ y% p8 n% R% U: W$ O- h) j
2)汉字与字符不同的是,汉字有1万多个,ASCII码字符却只有100多个,并且汉字的显示明显比字符的点阵复杂程度高,比如说字体是12的字符占用点阵是12x6,每个字符需要12x6/8=9个字节的存储空间。字体是12 的汉字占用12x12的点阵,每个汉字需要12x12/8=18个字节存储空间,这还是最小字体,大的字体所需要的存储空间只会成倍增加
: v# B3 U0 S; Q5 Z) i
5 _8 O) e5 [. W; G/ F; I3)一般12号字体的汉字库需要500K字节、16号字体700K、24号字体1.6M、32号字体3M,这对于单片机来说数据量太大了,内部FLASH512K~1M表示压力很大
5 I. `, L3 U' X! }1 m# a

9 x+ b1 `7 ], r
! l3 G8 B" W  A5 T* s
20201217162029866.png
- u: U3 ]4 x/ u; B! f1 O9 l6 L, O6 v+ @& U4 c# g& r
4)需要把汉字库保存到SD卡,再将SD卡中的汉字库数据保存到外部FILASH才行,w25q128无疑是个好选择,它拥有16M的存储空间,SPI通信协议,读写速度也是相当快。
4 P. v( b! A9 E+ J! e2 N2 t$ l
5 h4 P  I# b& T; [/ p: E(二)把汉字库里的点阵数据读取出来显示到MCU屏9 i% J1 q1 ^! f) h8 p/ ^
1 @# O  G3 O5 x& y  ^) B4 k# k
1、数据编码格式的问题4 Z- m' m7 Z' n8 n( E- L2 m

& {* t; X3 K+ ]1 T, W! t9 i1)有关显示汉字就必然会涉及编码格式的问题,不同的编码格式对应的汉字编码是不同的,比如UTF-8编码的文件用GB2312编码打开就会乱码。
" f9 ]9 Y+ P7 t+ L5 ], i同理,比如文档的格式是UTF-8编码,但是我的字库是GBK编码,读出来的数据直接显示到屏幕就必然会乱码+ @0 r0 Q7 u3 t

6 d1 K2 C4 |1 y) S. v5 S( C2 i( v  A! J' k2)所以显示汉字如果乱码首先需要检查的就是编辑器的编码,保证编码一致。

5 S. g6 V4 u  G: v: p
% W" f9 s0 w& K3 f
5 l9 s8 r3 @6 W4 t4 s- @, _* Q; x$ C
8 r3 k1 S. {$ `/ L+ N; Z$ {5 c* }# o3 I4 j
5 O3 c4 z- ^, ^0 u  P
+ B: w5 m9 E/ d
1 q- ^0 v6 w+ ]+ D  R
赞 收藏 评论0 发布时间:2022-8-15 19:57

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版