一.硬件方案8 ~; q$ P0 ?8 Q* P
本设计是一款基于STM32单片机的电子秤系统,随着科学技术的不断发展,传统的机械秤逐渐被电子秤所取代,相比于计量不精确,费时费力的机械秤,电子秤采用在方便快捷的同时,又保证了结果的准确性。本次设计采用STM32单片机作为处理器,控制各个传感器和外设,采用LCD1602液晶屏作为显示器,显示检测到的重量,压力传感器用于称重,通过检测物体对传感器造成的压力,通过公式计算得出物体的重量,此外通过16个按键组成矩阵键盘,可以输入数字,并进行加减乘除操作,通过重量和单价计算出总价。
5 C2 _. N' R. C; r5 ]& C主要由STM32单片机+最小系统+LCD1602液晶显示模块+HX711模块+LED模块+蜂鸣器模块+矩阵按键模块+10kg压力传感器;如图:
1 W0 S; e! F7 b4 V' h0 G' ?
2 I Q* A, c3 ~9 N( V( `
' o& w( l$ g8 n6 C. G
* y6 K# `. a0 c9 I& _
二.设计功能
8 U' {4 D) X: e5 x0 Q9 N4 ^5 Q* r' v(1)液晶显示当前重量大小。; T- P( a; @7 a8 t. R
(2)按键可以设置当前物品单价。, B/ F$ G) d' x$ x! J4 X* i
(3)具有去皮清零功能。* w: N) {. ]& q3 w
(4)按键确认按键液晶显示当前重量,单价,总价。. O6 ^7 I) d' A( C
, K2 b& M4 K5 q) E( q三.设计原理图
3 }3 }/ k4 }7 J4 W(1)原理图主要采用AD软件进行设计,如图:; w8 ~+ ^) d% @5 c; i
: A# P6 c; H, M% N, ]/ m
+ X( z+ h* K. G! d
7 W( Z: _' d. e; v6 K; a: z2 G(2)PCB图如下:
/ N; r* b$ j4 ^7 f% c* X7 F8 g& r( u
. L) ~7 e* k- |- a- e x- `, N1 v- ~ M
四.软件设计
% z+ g8 l4 p3 b5 |(1)程序流程图4 o: c/ m6 v* @+ R+ u2 G' o# }
( S- o7 E0 n5 Q3 G) B" G2 C
& T2 n. V% ^2 k, P2 z7 s) p6 @8 S$ o H
(2)主程序源码1 h7 ^- v+ ~( q
3 D, d7 I/ s" b- ^: m
- int main(void)
# g4 W1 @) O3 { - {
7 o0 `; a( j% ^% B0 e - u8 test_interval = 0;
; V0 S7 R | p! v% v' A1 a
; V+ B% F- N0 D% ]7 x- delay_init(); //延时函数初始化 , ]6 G) E: _; E8 h3 c1 B: w! E
- KEY_GPIO_Init(); //按键初始化
" B* S+ K' `0 h( C4 R - HX711_GPIO_Init();1 c$ v4 \0 i1 k' k! z5 j
- delay_ms(500); //上电瞬间加入一定延时在初始化5 H' h2 J0 T: l, N
- LCD_Init(); //屏幕初始化+ A& r0 }3 k7 Q( ^# T( |
- delay_ms(300);
5 ^- Z9 g, U9 p2 J" x$ ^8 n( d - LCD1602_write_com(0x80); //指针设置: m# i0 k+ X) i
- LCD1602_write_word("Welcome to use! ");0 Z; U7 E4 `) v: z; w1 A
- To_Zero();
}5 |& V( C4 u- h; [2 _ - LCD1602_write_com(0x80); //指针设置
* m' n m& m) \ c4 E - LCD1602_write_word("WE: . PR: . ");8 q' R9 j6 c! N3 ^
- LCD1602_write_com(0x80+0x40); //指针设置
$ `" ]* ~4 n Y; G - LCD1602_write_word("MON: . ");) f+ r( p1 a0 d. ^: J6 y) v7 [ Q6 O, T
- Display_Price();- M* \( ?. d) ~9 _$ _
- 2 l ~" U( f8 j, d! \
- while(1)1 O! d; M+ B8 j1 Q/ Z' |1 g
- {
" H8 @- |" N2 o+ i$ L - //每0.5秒称重一次
5 @0 H+ n, P O; S8 U c' P, m: I - if (test_interval ++ > 25)
9 i; y* L2 O6 m+ t - {
0 f% g& p& n# U& d) r - test_interval = 0;9 U* {; q7 R C
- //称重,得到重量值weight,单位为g
5 a5 {; [ c" r6 u! W - get_weight();% g, @, y' J4 k- n8 I" X9 b
7 O0 X# p: s; V% E- //如果超量程,显示‘-.---’( v! F5 [5 r* S4 S( S z( _
- if (weight >= 10000)) P, ~, E* }2 a# R- l2 A% o9 f0 N
- {
: m: L2 v% k' e. J - pre_weight = 10000;
% y$ z2 H& N, |+ z" L) v - LCD1602_write_com(0x83);
( j2 J4 }+ ~3 Z {' v1 \ - LCD1602_write_word("-.---");& y! Q5 y' a& x- M" }3 N
- }& U: f# W+ r; w6 X b7 z
- //如果不超量程, f# o' C9 p) J2 Q# n' O- @
- else
/ h H( S2 e6 g2 m: }! \3 v$ @ - {2 s& k- }8 V) Y A
- //显示重量值3 n8 P# f8 v/ V7 O, b
- if (pre_weight != weight). \3 z; ]/ _/ \: k# d- F
- {
) Q' ], [# I/ T4 v$ o4 x - pre_weight = weight;
/ `; z1 P1 i* ~3 i. Q - Display_Weight();
3 E" F; Y6 |) V - }
H, F! ~! B% S0 ?* n" Q* s x - //如果单价设定好了,则计算价格$ t5 |; l* `3 P, C( o Y
- if (FlagSetPrice == 1)# D; o( ~% t9 q& ~* O0 _4 M5 r
- {
+ X; p, P$ J, ~( h6 @ - money = weight*price/1000; //money单位为分
! x) C7 V5 h# \- ?% D - //显示总金额: s* a/ U% |7 A8 O4 f6 g5 V0 I
- if (pre_money != money)3 _ E) z2 ]3 y+ S: `( j7 t
- {3 {7 _0 L8 h! I& C( w7 G
- pre_money = money;
, P" y0 ^% {. v0 i. E* u# T - Display_Money();
6 l" _& R" G- w9 V7 Q6 y - }
! u3 o6 J# H8 W4 h - }
# @1 ] o- O, u2 J5 e4 }$ ^ - else9 f1 W7 H& M" T
- {* F+ S9 A" I4 w& o4 j) o
- LCD1602_write_com(0x80+0x40+4);3 ?! U: e4 D; p( z" s
- LCD1602_write_word(" . ");
. l0 b; Y9 N# T X1 _ - }2 y/ V7 G+ I4 v( w
- }
^" U$ s2 W0 G' K3 \) w2 }( N5 q- u* u - }: |* j* L; F) |* t' ^3 ? T& ^
- //获取按键
& c1 b! v8 u' Q- B/ u; } - keycode = KEYSCAN();
! a s1 t1 S* g+ ~( [+ H - //有效键值0-159 \ c+ @! t; x- `5 S
- if ((keycode<16)&&(FlagKeyPress==0))
- U. m& N4 f, A7 u9 y8 L+ [ - { E; [) a$ h$ H$ ]6 W7 Y
- FlagKeyPress = 1;
* u) v% R# t1 ~: V# I! A - KeyPress(keycode);
+ K/ H) e& z5 \9 P2 Q - FlagKeyPress = 0;
' c: T3 ?" Z0 x1 W6 v - delay(100);9 @4 q+ ?# |0 U- D( P
- }0 X* w$ _4 M: r* p! t
- delay(1);
6 Y; Z2 V+ s }: P( \ - }
W2 A+ w- C$ n - % H, }! U1 c2 r4 G; _
- }$ z' `* w* ~- G- [: x& L6 }& |4 k A
复制代码
1 m1 x5 f5 n" l( n& m6 y* C: X2 ?/ I$ S/ G! J
- r! U0 F1 N8 f1 r; p4 G6 Z |