一.硬件方案' J1 t: f+ Y' L$ V+ c
本设计是一款基于STM32单片机的电子秤系统,随着科学技术的不断发展,传统的机械秤逐渐被电子秤所取代,相比于计量不精确,费时费力的机械秤,电子秤采用在方便快捷的同时,又保证了结果的准确性。本次设计采用STM32单片机作为处理器,控制各个传感器和外设,采用LCD1602液晶屏作为显示器,显示检测到的重量,压力传感器用于称重,通过检测物体对传感器造成的压力,通过公式计算得出物体的重量,此外通过16个按键组成矩阵键盘,可以输入数字,并进行加减乘除操作,通过重量和单价计算出总价。7 Z4 `8 I! a5 ]# e5 F$ ^% Z% ^. y
主要由STM32单片机+最小系统+LCD1602液晶显示模块+HX711模块+LED模块+蜂鸣器模块+矩阵按键模块+10kg压力传感器;如图:
% J+ {8 D3 H& F2 |+ W+ |; `$ Q! Q, L/ J8 ]
! q4 \# U% K* X2 L
& {2 N2 x+ _4 ?0 e& _% n4 u二.设计功能
- T5 G% y9 e4 g(1)液晶显示当前重量大小。
2 u! I4 B- a7 I" D+ `1 I(2)按键可以设置当前物品单价。
6 r! O. W+ H- D, _* W(3)具有去皮清零功能。 g- a* h; E: k: W2 [3 d
(4)按键确认按键液晶显示当前重量,单价,总价。
% {% h2 ^- W/ q# l
9 y5 L$ ~: j0 X. m6 O' D; {8 v三.设计原理图% N1 o: G7 W4 V) [( t
(1)原理图主要采用AD软件进行设计,如图:
. {0 J+ V6 G, d( s0 ^8 j4 h
! z% C- k7 g; T3 b' Q- f, [) |0 w
+ {3 I# \/ _& b
3 V; X: G }! H/ x# i(2)PCB图如下:! R' B" b, n C5 y5 B
4 b7 L8 R$ B: E
7 V6 T6 C$ d) K8 `$ j9 I. T- W* F6 Z; ~" p9 `
四.软件设计
8 E! D1 M7 _- x1 a(1)程序流程图' W3 w/ S$ b- R3 s, i- Q
6 t6 _: p: J2 Z" x
( J$ B [2 J# v
* R% F3 Q9 y; G(2)主程序源码
7 A& _/ a; a: o' Y8 D+ g9 z; Y
- g, K4 d+ r) M' ^$ W" H- int main(void)
3 V* D) L0 c, W, c0 R/ Y4 o - { # G0 J x# O3 `8 K% i) n& E
- u8 test_interval = 0;
8 X2 k* B% O8 O& { B - . y5 X% g& x, a: Z9 h! m
- delay_init(); //延时函数初始化
; `8 X$ t& }/ Z! }" G8 [/ T; n - KEY_GPIO_Init(); //按键初始化7 y" `: l2 m7 |( ]
- HX711_GPIO_Init();" ]/ a" ?6 A" P& I$ @) t6 F
- delay_ms(500); //上电瞬间加入一定延时在初始化
; o; m6 v+ ]( y r1 ]3 g2 J - LCD_Init(); //屏幕初始化2 I6 ~8 u( R C5 I4 m4 D1 e
- delay_ms(300);
, S: I' @2 Y1 u2 Z, V K3 M) e - LCD1602_write_com(0x80); //指针设置# Z7 x3 T0 v& E! \% h2 C7 D7 Q. j
- LCD1602_write_word("Welcome to use! ");
( {" x5 ?4 C. w7 X' o - To_Zero();
% C# Q" \: \. f: e - LCD1602_write_com(0x80); //指针设置' u! g0 k, P$ Q6 u1 J
- LCD1602_write_word("WE: . PR: . ");; i# M5 b* j3 I7 N% R/ `
- LCD1602_write_com(0x80+0x40); //指针设置
6 K) e6 ~2 S; Y7 d - LCD1602_write_word("MON: . ");
2 o6 O- t/ N+ q: t7 y0 P - Display_Price();& n' c/ w! j6 Y. h) h
- 8 O: v: l, i, _8 c
- while(1)% ~4 V8 V8 K7 p$ U7 C) g4 |
- {
2 u. J/ k6 x* G9 c& g9 D - //每0.5秒称重一次
: d+ @( W/ F! C0 r z1 ]" d - if (test_interval ++ > 25)3 \- a% J& K$ |3 e6 P3 v$ D
- {) S5 L3 t1 C9 E7 u
- test_interval = 0;
2 J' j8 m$ }4 S. |) p - //称重,得到重量值weight,单位为g+ P8 S6 L! p* C3 h
- get_weight();
3 b; N) ?1 `' F8 p
8 m6 Z( T' i/ V9 v2 m1 Q- //如果超量程,显示‘-.---’; U" s7 v1 N$ g, O. `
- if (weight >= 10000); o/ n: _, O. Z& Q1 k$ Z K" v
- {7 f6 W* ?; p5 U* y4 C4 o
- pre_weight = 10000;3 a4 l' E8 c4 I
- LCD1602_write_com(0x83);6 \9 x2 |. O; x. {
- LCD1602_write_word("-.---");1 w6 T f' u/ f) D- M3 j
- }
' g* q4 l! ]1 R- }- F - //如果不超量程
2 _1 a7 X# T; T9 A8 S6 F - else
! U3 P. v$ z4 G0 A - {! L& Q# i* a- m( M" c
- //显示重量值
6 V( T. J E' v' W- d' j! s, ? - if (pre_weight != weight)
% @* Z8 n- F$ n# | - {
7 }, V) } m+ @5 v) j4 {0 z. ]3 w - pre_weight = weight;: f) L- \' u2 E
- Display_Weight();1 D! w+ ]0 R: _) \" v9 V. n
- }: g+ G% J0 b" V4 H; M! X8 Q
- //如果单价设定好了,则计算价格2 a- M, h7 B- k7 P1 N9 Q
- if (FlagSetPrice == 1)7 Y7 N3 T; t' Q; L6 P+ U
- {
. Y& @- W& O- E- T v) L7 b# k/ u! U! a - money = weight*price/1000; //money单位为分7 w9 r U# X0 H. Y7 u6 k
- //显示总金额7 ?* _1 h+ I4 |- H4 W0 X* Y' M! {
- if (pre_money != money)
$ g' H! U d8 U/ q( W - {
/ I7 z4 \7 t& @! W' i$ @' u5 ~, ]+ F - pre_money = money;5 N, Z$ s9 W0 N% H# q- {5 {
- Display_Money();
+ z; h" I9 K$ v! ]4 j* }6 M' P - }
; D+ M7 m3 M. y3 y0 w* j - }
: j7 l! q1 Q; i% n! G0 N& `; K - else
4 A7 n l4 k& u- ]' I - {3 Q* X' A' T% A- i2 }
- LCD1602_write_com(0x80+0x40+4);
O# d1 Q d, L0 z# x - LCD1602_write_word(" . ");
5 B* T% v; R- h! H - }
# y% w d% `, z9 m6 m: y - }* c4 B. R+ L8 h3 m+ G ?0 Q
- }
, [1 A' y5 D l# \9 \# S - //获取按键. e! L; H A, |' X5 C, w7 F9 N% ~
- keycode = KEYSCAN();) O' C" ~; o+ v! r
- //有效键值0-15
' J# f* y: x7 C5 A$ a1 D8 W - if ((keycode<16)&&(FlagKeyPress==0))) w# K/ |- u/ o; ~5 \6 n
- {
. _7 a0 c; ]( z; L - FlagKeyPress = 1;5 j2 ?/ F* L- `: O# g
- KeyPress(keycode); @1 H L0 r( K1 g
- FlagKeyPress = 0;
9 Z2 j2 A/ s y. J - delay(100);
7 ?# D. |- j. v G g - }
, I- U* F n& j - delay(1);3 P. x& r; C) z* \! w
- }1 {! W N$ B; {
-
6 A( o( m% e0 a J5 L _4 d5 ?/ _ - }: O; i% m8 P, ?3 o# w. s1 ^, v
复制代码
P; t, b0 }& n% t% v) W7 E
4 o9 S0 V {. Y+ m; D# a
1 A @& T0 V, Z |