一.硬件方案* ]: x6 o; n" ~3 u" Y7 }
本设计采用STM32F103C8T6单片机作为主控芯片,结合外围的矩阵按键输入、LCD1602液晶显示、报警、开锁等电路模块实现开锁、上锁、报警、密码更改等功能,设计了一款可以多次修改密码并且具有报警功能的液晶显示电子密码锁。
, t' A# ]) L6 g4 z6 F" s主要由STM32单片机+最小系统+LCD1602液晶显示模块+蜂鸣器模块+LED指示灯模块+继电器驱动模块+矩阵键盘模块+AT24C02芯片模块;如图:
. {9 n+ z# z( Q2 o0 Z. Z. {& {
& h+ M; `0 j# p1 J6 d) q
: h4 C2 j ~; v _& @2 N
( N& c1 N+ `* h' R
二.设计功能( j0 k3 I1 d! T% a0 a9 n
(1)采用矩阵键盘输入、1602液晶显示、AT24C02实现存储的密码掉电保存、继电器模拟开锁。4 h) c h: l5 y+ q2 w- e5 e
(2)六位数字密码(0-9),更改密码时需要先验证初始密码,初始密码正确,输入两次新密码,两次输入一致即更改密码成功。2 N" r3 \& d+ K$ `# J7 f; E' w3 f
(3)开锁时密码输入错误,声光报警提示。
; _: P& o* ?0 `, K( r0 f(4)如修改的密码忘记,可以通过管理员重置。! q3 f' z" Q% O$ {
/ ?" U. d+ ]" `. V6 }% F7 O三.设计原理图1 m- R7 w! d* [. Y5 ^ y1 [
(1)原理图主要采用AD软件进行设计,如图:8 d3 h! ]' d. O5 a+ v! J) h, j
: b7 L& Q2 x" K! h# b+ `0 x# P, s9 X O
& o3 z& L6 X# A( m- N T* t/ Q
& x" ~6 u8 O6 N: V2 h4 m3 H
(2)PCB图如下:- ?! c' F( X. p$ V2 K/ v1 T0 a
, D3 d* q2 z/ D0 i
6 L/ [* z4 f7 D/ \/ E2 P
" ]# M; z( W& X1 q5 B四.软件设计7 [* I) F4 V. `9 U/ _2 f
(1)程序流程图
8 X5 A0 w$ V0 Q; _) s7 G/ U2 k5 H0 Q; V3 b8 n4 }
$ S ?1 O( S' `2 _$ J9 k5 A
2 c6 C, T. Z2 C(2)主程序源码1 ]* ~* E$ ]8 |; q" d v
, J) z2 f- M& _. t! Z- int main(void)
r- p* S4 M' F$ i6 x/ I! w7 R - {
/ u! H& Y9 Y" v" O7 K, X) E% @2 h - BEEP_Init();
) p8 c8 G. h3 P1 C: F k - LED_Init();
, w8 ^: I% j% A s* S+ B - delay_init(); 4 i \. `$ x: C2 r: c
- LCD1602_Init();4 B7 @$ A* z% S5 S' {& k; U
- KEY_Init();( k6 Z/ z! L* j$ _& J4 s/ i
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
% G# c$ T* d/ g/ { - TIM2_Int_Init(4999,7199);# o9 |' {1 {, x& v a# T c4 Z. f
- TIM3_Int_Init(29,35999);
3 u% v; t# I( N3 Q/ M - TIM4_Int_Init(4999,7199);//每500ms计算一次速度的值,并显示
1 E' X# ?9 ~3 q+ l1 x. w0 \ - .....
0 s I, o n' M0 z/ q' r4 ^, l8 _ - // flash1[0]=100;* _0 B9 [6 v" H. {( Q f& P+ F
- //STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));; f$ {! {% L/ e h- P
- //STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));7 z# g8 ?' b: o* [6 I# j2 R
- % N6 o+ X* e( e" w8 m
- TIM_Cmd(TIM3, ENABLE);8 ]0 {) U, i1 Q% N; k$ a5 T. P1 ]
- STMFLASH_Read(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));) j4 M5 q1 r' i( ?2 h! R
- setpass_flag=flash1[0];+ v# N" f' H# A( s3 U! w
- STMFLASH_Read(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
3 D; c s+ w* `+ T - for(j=0;j<6;j++)
2 L) ]- M, n* S6 c& \3 X# i - {# q. Z" A* f% C E; g0 g& M
- setpassword1[j]=flash2[j];
3 ~7 s% D# G* e# ^+ g -
% c& Z% f3 |- X9 H( b. ?; k* \7 c) D - }
% ~$ K& H. ?/ n' R8 E. t- p - j=0;* [9 b/ X2 `2 M+ J8 W, C. h2 }; I9 P% u% q
- : A$ ?+ v' }+ |/ @9 ^( z) C8 G1 p
- open_flag=1;
0 W: L& b3 t% F - pass_shuru=0;
/ c. @" U$ Z4 H! W* X - while(1)) D! i. S/ `2 E6 V# W/ X
- {
: k. d3 ~! g/ }: C4 Q/ v: s0 k - mound();4 I3 O7 s( ]7 a ~
- if(down_flag==2)
& d& J' j+ ]9 ?5 H - {! R. I* ^& w+ `! p
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);% [; ~+ P* |8 V! T
- }. t6 z# T+ c, v2 r, d2 _/ S+ A
- if(down_flag==5): m, T7 t+ @, V3 W- ?/ i9 }
- {# ]9 h- X" H1 L& `! I& a
- down_flag=0;
L' q, S) ]4 {4 Q( M* {" Z- A - if(setpass_flag11==2)8 \/ |$ q9 T$ ]; t; d8 ]) k
- {
5 ?7 m4 O* ^' @1 B& h - TIM_Cmd(TIM2, DISABLE);
, y! D& ~) L& h9 K+ r4 D - }
. }2 p, V; A$ F - else
0 |3 f u# M- Z( h - {
# C) Q! ]/ |. t - open_flag=1;; _2 d! ]& _% A- l
- pass_shuru=0;
" o f/ }% r, _( E - GPIO_ResetBits(GPIOC,GPIO_Pin_13);4 o1 v) v$ G8 a
- TIM_Cmd(TIM2, DISABLE);
$ M, |4 M! R1 B$ u' j/ V p - GPIO_ResetBits(GPIOB,GPIO_Pin_0);
8 P# I8 F# K5 d; `) K: {) C - }
9 S! F+ @ o6 y. l
, _8 N0 Z7 Q3 y/ L6 O4 X, E- }
/ l v1 u, i- @0 Z( n+ B - H1 U$ V/ z) n$ T3 G; T, |* S4 X: }
- if(errtime_flag==2)
- ~# H; j% A, B" t" c$ L1 ` - {
# G- b" q1 X1 I) t - GPIO_ResetBits(GPIOC,GPIO_Pin_13);' B; |& y) B0 T( s& a' V
- }
6 v" p% @! I& i& X. w - if(errtime_flag==3)
{" X1 S2 |% L, M8 L3 Z y: F3 E7 O5 ~ - {
! G) p# \! M" X, X+ e - GPIO_SetBits(GPIOC,GPIO_Pin_13);
# L8 B) m/ ~! v* l2 n' ? - } I# {* X9 @3 e0 F3 H8 F6 B+ V( N
- if(errtime_flag==4)
$ O5 U" W( ]0 k6 d# A - {- X# R- U0 [' d+ x2 s; {! N2 z7 p
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);4 S1 Y. z$ Y$ \4 l! g
- }
: z( b4 C0 Y4 s( B2 z8 ? - if(errtime_flag==5)* D; @9 Q5 X4 y( [: E8 N! }" F
- {2 N! N5 K4 v# g5 `# D8 P1 T& f
- GPIO_SetBits(GPIOC,GPIO_Pin_13);4 Y# |% k! D- p3 }
- }
1 m0 j1 y5 I4 K) o7 G
3 |1 b' Z5 s: s1 V1 n- if(errtime_flag==6)' u1 O# A2 U* y6 M! g% s3 ]
- {. k4 C% S) C% V) L9 h
- open_flag=1;8 |* e1 x6 B( \8 R6 C% f/ p Y
- pass_shuru=0;) X- p9 } K( c: L* \
- errtime_flag=0;
% g0 L, u' i" n - GPIO_ResetBits(GPIOC,GPIO_Pin_13);2 Q% M1 g i* v# h$ h& j+ ^1 F
- TIM_Cmd(TIM4, DISABLE);1 x( D$ o1 ]2 P8 ]; H. M$ |+ U2 B
- }
) k7 d" b' [2 O; ^7 L8 D. m
8 A5 ^% s/ j# y- S! N$ _- }6 c% y; l" [. f
) a8 N9 d9 i( I& y- 1 J+ w! \- E6 F6 `, o
- $ _2 P0 D' f4 x0 s. x
-
& v2 j9 h6 {# \6 C - 8 \% r3 t& ~- ?6 y4 R9 {
- }
复制代码
6 M2 Y/ R' l6 q, @) p. H }
/ k+ {7 Y t& Y7 f$ p; }3 Q( o/ e2 T x
6 Z+ g! ~; J: m8 [ |