一.硬件方案- s* y1 z- W. |2 y2 s/ B0 L
本设计是一款基于STM32单片机的电子秤系统,随着科学技术的不断发展,传统的机械秤逐渐被电子秤所取代,相比于计量不精确,费时费力的机械秤,电子秤采用在方便快捷的同时,又保证了结果的准确性。本次设计采用STM32单片机作为处理器,控制各个传感器和外设,采用LCD1602液晶屏作为显示器,显示检测到的重量,压力传感器用于称重,通过检测物体对传感器造成的压力,通过公式计算得出物体的重量,此外通过16个按键组成矩阵键盘,可以输入数字,并进行加减乘除操作,通过重量和单价计算出总价。, R/ [: _, R4 X* z( b v$ e
主要由STM32单片机+最小系统+LCD1602液晶显示模块+HX711模块+LED模块+蜂鸣器模块+矩阵按键模块+10kg压力传感器;如图:
0 G' k" r* v" F
$ }9 c* D& m9 O4 S; }
' G- H$ l* K3 v
4 L& Q; h' r3 E二.设计功能
1 P$ k$ q9 |) p# r(1)液晶显示当前重量大小。3 w3 u& s% l. ~: y1 H
(2)按键可以设置当前物品单价。* H8 g) S" A$ q4 c
(3)具有去皮清零功能。
1 f7 q3 G5 p% i5 D( n) w* R$ l(4)按键确认按键液晶显示当前重量,单价,总价。
! M. B0 C8 A' o$ C' U! K4 n D/ ~7 }% r0 m9 `3 R
三.设计原理图/ J! V$ u, |# k& v, d
(1)原理图主要采用AD软件进行设计,如图:( L4 Y% y9 N0 f4 c
" K; r; J" b p& i6 a' e) n" s- B* M7 f
9 q2 b" ~5 d6 E8 x
( ~4 M: n* B- X5 t z(2)PCB图如下:7 M- C: O. z W$ w, n5 H- |. I- s: m' x
) H2 B! z' ^8 Z
6 _6 n. c: |/ ^2 E& Y! n
3 x }! c( z% Y) M9 \四.软件设计. d5 }7 A" q- M2 M, K1 Y6 h. Y
(1)程序流程图" S9 J6 p2 H4 M% W
b% z: r- T" Y/ @! C5 I
1 v3 r \+ G- W& {8 N7 v: t1 h, \0 B8 n& [0 R$ ` T
(2)主程序源码
! I5 e: F7 ~1 Z! L- r+ b5 I0 I( g! s4 b; a7 h- l
- int main(void)
1 [: e; i' a( k: u5 o. R8 j - { : {" v, m5 v$ J) T: k
- u8 test_interval = 0;
% w# L$ D2 P+ |0 Y4 p/ ?
' ?1 S0 L- w6 N+ r% h- delay_init(); //延时函数初始化 ; t+ u) k- ]. m) z3 @
- KEY_GPIO_Init(); //按键初始化/ U5 I2 P' U! O
- HX711_GPIO_Init();
P) Q( N) }1 [7 R' P6 @# `$ ~ - delay_ms(500); //上电瞬间加入一定延时在初始化5 \, O. f/ ?- B4 Q: j- \! o# B
- LCD_Init(); //屏幕初始化
# |5 R; P4 C1 {, L! E5 s' I - delay_ms(300); 3 p3 e) ]6 x. Q3 k+ R* \
- LCD1602_write_com(0x80); //指针设置
z0 I" t( V, ~1 J - LCD1602_write_word("Welcome to use! ");& \. F) Y* _) F2 G- l
- To_Zero();
: Q) [8 S) T( {- L; }# |4 |4 Q/ Z - LCD1602_write_com(0x80); //指针设置7 E0 M* u* |+ I6 H Y( I
- LCD1602_write_word("WE: . PR: . ");
2 s. [8 X. P s: F8 C. g - LCD1602_write_com(0x80+0x40); //指针设置
; S, P5 A( h/ R! e! M3 h! L9 O( k# ^ - LCD1602_write_word("MON: . ");3 a! F9 y% e$ D& T3 b3 S
- Display_Price();
$ J; B) W, m/ p1 j$ H1 F - 3 `# \2 A0 R2 d, O2 F2 R q
- while(1)# W: M# T& @0 q- d: x4 O
- {
7 O6 t4 `8 f; I" y - //每0.5秒称重一次! ]& w/ e6 K0 d D1 J* l8 h5 D5 z7 F
- if (test_interval ++ > 25)
, H' G7 s0 q% e# z8 K/ N - {
1 s2 u: l: y$ S2 P( f: |6 [ - test_interval = 0;
e# M* z9 Q8 R* D) B6 u - //称重,得到重量值weight,单位为g, p( f4 E: J, D* `( L9 Y, r) b
- get_weight();
' |' u3 h4 M5 Q8 \3 k - 7 L. {9 z" X5 D ]: p
- //如果超量程,显示‘-.---’$ P8 q2 D* I9 ~
- if (weight >= 10000)
4 h- Y( {! L* M o/ J; h% s - {3 A/ J' s/ V: a( \; R- c* H" a9 w
- pre_weight = 10000;
7 Y. U8 x+ m! D& c$ h6 k+ ` - LCD1602_write_com(0x83);
8 [1 G* t3 a) Q, ^/ i+ O- R. } - LCD1602_write_word("-.---");% E& M) I$ [9 L: u: ~0 n& C& e
- }+ Q* I! r( j1 M0 L; @; o
- //如果不超量程9 c6 \$ y* y8 J, W1 r1 C
- else' w6 s* s5 F- z- |. `
- {
, j! E6 v2 d3 f - //显示重量值1 H9 w0 _; ~. h+ J- B7 h) E
- if (pre_weight != weight)
1 m9 K1 r E4 K# A - {
+ V4 W* o0 M$ {4 q7 Q; Y - pre_weight = weight;
. w2 w- k/ d; B2 ` - Display_Weight();4 r' t j ?5 a$ B2 r/ m, e
- }
( q5 N$ g* f4 e2 f4 k+ V - //如果单价设定好了,则计算价格
* M, r# M. f$ j' J2 [ - if (FlagSetPrice == 1)9 @0 z0 b" n3 T* g+ j0 i/ @0 Y$ Y
- {
; {4 l' @+ H1 M* ~) J M - money = weight*price/1000; //money单位为分& v; O0 p1 z8 F+ ^8 h& i" A: X
- //显示总金额( H$ v; t" G9 i; Y/ Y
- if (pre_money != money)
1 e4 b0 M8 J3 Y* @6 U2 E - {0 j" u: U5 U5 @6 w2 l
- pre_money = money;( ]& j0 h2 C% R
- Display_Money();# c5 ^% {' v9 I, T2 N
- }3 p) Z: s( k3 @( a3 m" P3 `
- }
* _0 H; L4 ]& @8 I6 w; }) ^* s - else4 a4 q3 C1 L d6 X( @
- {
: A; E- J& e9 s+ S) W. q/ U - LCD1602_write_com(0x80+0x40+4);5 f& v% [5 l" ^: F* w
- LCD1602_write_word(" . ");0 s* f/ P1 S |# ]; f
- }
( o/ `: O: C/ ?4 L `" R! T- e - }
6 v% A; U9 r+ T9 v# O$ ~$ S4 I - }- g5 ~/ h7 J/ G* U
- //获取按键
( R, P$ N* L# ~" f- y - keycode = KEYSCAN();
2 d/ d' Q2 D5 S. Y$ ?# E - //有效键值0-15! p* Z8 ^9 v* {% [ A* v
- if ((keycode<16)&&(FlagKeyPress==0))# F# c9 W5 s6 Z8 }
- {
5 m5 D3 E; J; D - FlagKeyPress = 1;/ W$ l: C, v k2 o3 {" k* P5 t
- KeyPress(keycode);
. s: L% d1 N9 i+ o - FlagKeyPress = 0;, i# B9 N3 Y s, q. L' L7 w
- delay(100);
9 d& m" g9 P+ D# \ - }$ X: P, q# i* M* |# E
- delay(1);( [* ^, s2 F2 K0 G7 }( b ?+ N0 b
- }
" `7 t3 i3 |7 X1 ]4 w# X. Q9 h -
$ s" @$ }7 M/ M3 w - }$ Y1 d9 @' o) |7 z
复制代码 ' @; O* l7 C5 D- B4 Q7 r* W
* t/ ~0 m M( n# u+ t; s5 e5 s' A+ _3 \
|