一.硬件方案
; U: ?2 K: D2 z本设计采用STM32F103C8T6单片机作为主控芯片,结合外围的矩阵按键输入、LCD1602液晶显示、报警、开锁等电路模块实现开锁、上锁、报警、密码更改等功能,设计了一款可以多次修改密码并且具有报警功能的液晶显示电子密码锁。
/ p; U w( |1 \0 h3 P% y4 S主要由STM32单片机+最小系统+LCD1602液晶显示模块+蜂鸣器模块+LED指示灯模块+继电器驱动模块+矩阵键盘模块+AT24C02芯片模块;如图:
0 t% l, O0 P3 T" m- S% F8 h. ?# }( H/ b- H' {
6 l' j, S0 U% F( g/ k; U
" b7 c+ _& T/ p5 G二.设计功能
) Y3 H* [: {3 Y5 U9 `, |(1)采用矩阵键盘输入、1602液晶显示、AT24C02实现存储的密码掉电保存、继电器模拟开锁。
! }9 V9 J& m5 _(2)六位数字密码(0-9),更改密码时需要先验证初始密码,初始密码正确,输入两次新密码,两次输入一致即更改密码成功。9 S5 f) ?; ^) G3 \& m
(3)开锁时密码输入错误,声光报警提示。
# Z' E6 O. Q) @; v7 N* G0 p(4)如修改的密码忘记,可以通过管理员重置。6 S" B, `6 Z/ Z9 M
/ `# d; r( c7 K$ A1 E
三.设计原理图$ V5 D% A0 q% q9 f" }2 _
(1)原理图主要采用AD软件进行设计,如图:
# \1 q' |! j) m/ G* N5 P9 i% p8 s: \
$ k5 U3 t: }* k2 R6 [
- o- p* A$ c6 e2 a: W& S(2)PCB图如下:
; Y4 F1 S/ q6 a8 B5 Q& o5 V4 m" w# l( W+ c; z
0 }" `# R. Y+ k2 `" u1 M& C) Y* a% Y# _' V6 B
四.软件设计
# S0 {! `, ^& ]& t$ u, l(1)程序流程图
" `/ c7 w0 z* Y! q
) Y, L5 P" q7 J# }
, I$ ~" @2 f x; r
# f; k8 P3 _9 H3 Q(2)主程序源码6 f* t- c! K8 k- u5 ]2 {+ O( }; c/ X
- T! {" |, w) E8 O, F! D8 T) D- int main(void)3 Z: _; }& L1 X
- {
) B1 m0 A' S: B - BEEP_Init();
1 @ E2 ~. K& ~5 ]6 d% P/ w - LED_Init();2 D4 ]# e% i( s) Y2 H
- delay_init();
% h L3 ^/ p/ v" Y3 f+ u - LCD1602_Init(); @$ b* n5 M$ p: {
- KEY_Init();: k4 O$ I. L9 w4 O1 X0 m
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
' Z& A( q3 M0 h Z - TIM2_Int_Init(4999,7199);
2 ^, o$ z6 P- j u - TIM3_Int_Init(29,35999);! p' r- M* g- G. W m4 z3 O
- TIM4_Int_Init(4999,7199);//每500ms计算一次速度的值,并显示
" e7 w/ X2 N$ @8 e3 B - .....6 r6 U7 P3 ^; Q+ i3 Z
- // flash1[0]=100;
* L" @3 v# j; [! l9 | - //STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));0 o# K0 i2 ]; n" I
- //STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
" K0 E1 R" x' l. Q! A2 E; O
8 ?3 E. m1 S" D7 H6 A1 I- TIM_Cmd(TIM3, ENABLE);+ M& z$ F5 b' ~5 t' p( _* M' S$ Z
- STMFLASH_Read(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));, y3 W; W- }7 n5 {. b8 l
- setpass_flag=flash1[0];+ t: @7 h4 A' |# ~/ G" h) o
- STMFLASH_Read(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
_0 `' L% J& q! o0 m - for(j=0;j<6;j++)
9 T0 m9 S$ f8 e6 @) v5 U2 S' @, G - {
1 s. J4 |: E$ ^; \# ] - setpassword1[j]=flash2[j];
; z) F& J3 Y/ I" P, K - # O2 ~- d, C% {2 [) {& ^
- }1 V. d O4 i; X0 k" m4 Z! r O
- j=0;$ m+ Y4 ~* ^3 b* l6 v2 D# }2 B9 T
-
) Y+ b2 K; @. h& {/ }: n - open_flag=1;
7 K6 ]" ^& j+ m# S - pass_shuru=0;8 B$ @7 G3 d# S# M9 }& D5 Y! l
- while(1)/ q- j- I* Y8 @7 E. R4 b# V2 _
- {; Z5 l0 m( W# l
- mound();
! t7 h/ }% r7 N) y# a - if(down_flag==2)1 B7 D6 N# _# Z; e
- {2 A [! r. d( ]1 l6 S# Y
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);
2 e8 G" Z$ E7 d* J - }
0 l9 \# z# x# p# |+ d - if(down_flag==5), o5 F+ {' R- ?% u. i D. M' }
- {
7 C! W- |2 r' b4 @ - down_flag=0;
+ W1 {( \2 q5 u% }2 P9 V - if(setpass_flag11==2)$ ?! E6 _( R* K0 H( P: W) ~1 ]1 Q
- {1 l. e# {# ?! N# h" |* ]/ i
- TIM_Cmd(TIM2, DISABLE);7 S2 W7 |2 Y) Q% k+ `
- }7 }+ d8 p; b- j4 S
- else
9 X" H2 _, G3 ^) A - {
/ V" l6 I+ y( ?! s, T3 x1 e - open_flag=1;! _& y! \. ]4 ^2 f f: [: w: i
- pass_shuru=0;
3 \( T' f/ Z- K! K* \ B - GPIO_ResetBits(GPIOC,GPIO_Pin_13);1 e8 m# T; L2 }2 B9 l( a3 o1 j, {* i) @6 T
- TIM_Cmd(TIM2, DISABLE);
7 E! x; P* G. P9 @8 r/ f9 m7 X, ?. Y, z+ N - GPIO_ResetBits(GPIOB,GPIO_Pin_0);9 f% L! n' Y; }/ ^
- }
1 B+ ~, Y# z3 M* |! c - ' @/ ]+ x- U9 h5 `7 F
- }/ m) n9 k. _" r
-
0 A* j4 F1 X& a* M - if(errtime_flag==2), Z7 u" u a: D
- {* @* f% V. R v1 B8 W
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);
. Z+ r/ h) `- x; ~/ N - }0 z9 k, P- a) c
- if(errtime_flag==3)
5 ?: E m: X9 K# X% N: E8 Q - {
, z q3 ]2 ]+ u) p W7 A - GPIO_SetBits(GPIOC,GPIO_Pin_13);- F, a8 ^. ?. Z: Z/ @( X" \; U
- }
/ K3 l- r) F3 {( I. V( n; O& ^ - if(errtime_flag==4)3 B& H0 _" z2 a9 a- I$ _2 \
- {4 b% }- c n% Q
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);* l1 `' u! Z: q! n
- }
. a( H0 L3 W* ^ - if(errtime_flag==5)2 V3 k( c5 ^$ r$ o8 h% n
- {* l0 ]8 F0 ~/ T4 g$ q: p; ^8 u
- GPIO_SetBits(GPIOC,GPIO_Pin_13);
/ X$ }! Q1 t* b& n5 B0 ~7 c - }
, i% C% D0 b1 i - % i/ h' `* R p2 V1 v
- if(errtime_flag==6)) C8 H' t' w4 I$ i
- {3 p& [8 {- S9 {# |' H# G# \
- open_flag=1;! e9 ^' {3 I. U
- pass_shuru=0;7 [8 p0 q7 ?( D7 G
- errtime_flag=0;
3 q4 T1 t" t/ J3 \, q: ` - GPIO_ResetBits(GPIOC,GPIO_Pin_13);& `; e9 a+ `2 w. W4 C% S F
- TIM_Cmd(TIM4, DISABLE);
1 n9 B# X D2 @9 ^6 K - }
' k; y% w* b7 M1 V4 U% J2 y
/ j3 ]5 V' ~7 d! F$ e- }# d6 O9 G$ o* S" u! n
( a$ Y8 G& ~3 r
3 a% p9 j1 v% o1 w. k' ?- ' X: I7 H3 s# Q& X: |/ {
- / ~; q7 I6 x" P% }+ X0 `
0 @* W8 d; J7 P5 V- }
复制代码
) H( @1 W% W% K" N1 A T9 |0 @2 @7 ^$ z6 N
2 ] f* l7 P X1 S: N. c
" B+ y% n, |* y9 E2 I+ K& J2 A
|