|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的电子秤设计 原理图和PCb图 源代码
( D S$ X* w+ G: o6 V$ i
" V% d" Z h7 `: y V+ U& T
% {6 K- N! U f" \$ e i) D1 m原理图:: z4 D J& T1 o2 R7 R% }
# l0 E8 _* M; Q/ L
. T2 r' G6 ?5 A. k单片机源程序:
$ x( S' ?" \& @& [//程序采用的是模块化写法,你写论文时也分开写两个小标题把代码粘贴进去就行了。
8 u& j( P- z7 q" K( ^' p& D# M s
4 ?$ J* b7 R0 u4 B& z2 T/ |' y: G' v) p5 R% j
5 z* q+ h" @: c" Z
4 G; l& |" V T% A& a, Q
+ d: U7 a" V# j' w9 C9 T
//HX711的AD转换代码
* |' @* a0 i( A9 M" K) e2 s! W$ [1 K4 |- U) i6 }3 L+ n
/ w0 N" J+ u: ]1 L#include "HX711.h"
" m% v) o& T% [ g& T
# `* b7 X$ v8 F# l7 i& Y8 d; g# ]1 F! l2 I
7 f% m* }! M( ~$ r
2 y% ], Y" @" Q5 T- @, c//****************************************************
0 t6 M: g$ ^- G( U//延时函数
6 o$ c& p9 f7 U* N2 A3 t% m//****************************************************
0 ]7 H% \( T) Fvoid Delay__hx711_us(void)
/ h$ d. _/ x ?2 C. Z' }9 I5 {/ n5 s1 j{1 E* s. [- [, B% @2 A% \. A( O
_nop_();1 R' Q1 Y9 P8 e8 j$ B# e2 ?
_nop_();
- } ^) U+ e/ P; q}6 L8 d' l V" ^( \, E& Z. f' l
' l4 F! t3 Q* ~* r9 s7 _3 j
7 S3 K' I, d' G6 s0 Y9 M
//***************************************************** b6 c; D, R7 n( |; c: R# s+ k
//读取HX711
& n! O+ D4 G2 |3 T. ~//****************************************************
: f( B' r# h% E# U; Wunsigned long HX711_Read(void) //增益128$ m; ], H. s, U' n
{
: D" T5 A4 h( [$ [: W. O unsigned long count; $ n6 L% q& w; ~0 v) |
unsigned char i; $ @( }% O8 v% t# X5 o, P3 |5 x
HX711_DOUT=1;
" N# w. n6 X3 z* U0 d Z Delay__hx711_us();
+ m" n* g% ~: _6 H HX711_SCK=0;
; m: @, b* }$ U count=0; 6 N; n) F8 P+ a* ]
while(HX711_DOUT); N$ ?2 Q! Y! i8 Q
for(i=0;i<48;i++): N* @7 h8 z; w" A
{ ! a9 {1 b: n$ K! f8 }, B
HX711_SCK=1; ' v1 t+ m. I' d
count=count<<1; + W1 U/ K% D$ b* o: V
HX711_SCK=0; 0 F+ \5 j. ]. P- j6 S
if(HX711_DOUT)
. u1 H0 j! ?* r. Q count++;
& {- f+ R3 {1 J/ G% C5 R } . K) V/ n' s+ d( ?! d. a) T
HX711_SCK=1;
5 w. F2 _- }$ a1 h6 n count=count^0x008000;//第25个脉冲下降沿来时,转换数据" M* i; m' H9 v: ]3 \3 R4 a' j
Delay__hx711_us();) ?6 h# W2 _! E! [& c1 u; {- H
HX711_SCK=0;
2 C* s; ^; L$ G) |" U c6 b6 V' x+ e return(count);2 c$ z& Z- O1 m( D% n+ b: {( z
}2 x! a1 t( i9 u9 _/ A
* x/ d' P5 e; S
$ H. w1 Q7 ?- H& C) J9 R; d; F3 s( r6 X, o/ S) x/ h' B
, c1 P7 k5 l! ^- k# ?0 _ ]& C, W6 |主函数程序3 ?5 m" Z; C! v. h7 b
( t- S, {2 X, u/ o; @0 ^
: }. x) Y- P% e! u K
#include <reg52.h>5 j: K& o' w5 k4 H/ x
#include <intrins.h>3 `8 D1 Q; {( {
#include <string.h>8 b) {% k+ |9 a% P" ]' J
#include "main.h"
" z4 H; q8 Y N8 S#include "HX711.h"- I* P# Z# {/ _7 n) ?/ @9 x
#include "eeprom52.h"
' j$ y! v' u. L& R; [* ?
$ z0 A! O* b+ E4 y& S4 O9 D1 E: U- _2 g9 L
#define uchar unsigned char
9 [* f C- b+ L$ R#define uint unsigned int, |2 L" i2 E- k4 t' m: n
uchar qianwei,baiwei,gewei,shiwei;. U/ I$ w0 j) b
unsigned long HX711_Buffer = 0;
9 S, }/ u( `( S3 n+ uunsigned long Weight_Maopi = 0;
2 i2 O; S$ I' b$ j( Punsigned long Weight_Maopi_0 = 0;. b% f( @2 ~2 o, R8 n
long Weight_Shiwu = 0; Y8 {- o3 {0 D) L; y# P* b# w/ k
unsigned int qupi=0;
% Q, N6 t! o7 y/ y5 g" Z* dunsigned char p=0;$ ^1 U8 g" ?. ~- ~2 D4 K
//键盘处理变量& z' v9 P& n* M0 V* T
unsigned char keycode;
7 C, f% U. Z3 h6 n1 W% uunsigned char key_press_num=0;$ {8 e9 `% F9 B% f+ E7 {
" n; `9 t W, e# ]' ]4 o# [+ C& F
% [$ Y, ]) c/ k m" R5 l, y* N1 ^uint GapValue,GapValue1;
( ]4 [# ^& ^8 Q+ I1 `/ d! cbit flag_cz=0;
/ R0 L1 p1 L; U9 u2 a3 D: o1 f+ L6 ^8 ~& j, [
/ k0 p3 [& v( v" h2 Q' ^( l2 w7 M
//uchar code LEDData[]={0x5F,0x44,0x9D,0xD4,0xC6,0xD3,0xDB,0x57,0xDF,0xD7,0xCF,0xaA,0x9B,0xDC,0x9B,0x8B}; //数码管显示码表
& z9 @* t% b) c& C//定义标识
& Q% t. p! S4 ] g1 p0 \volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清00 W o6 h! v& _) i
volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清03 L) }* r5 {9 E
//校准参数5 W% c( S3 k; O$ M5 |" n
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。" E: F( g4 n% `1 o% I: E, {; L) | ~6 `
//当发现测试出来的重量偏大时,增加该数值。( X0 ?% T H; m7 L+ m/ ~0 D" X
//如果测试出来的重量偏小时,减小改数值。
4 _4 M9 E$ I# }, N# i1 p) y//该值可以为小数
0 i+ Y# w3 m/ c' Y% L" V; R//#define GapValue 3492 l. D" \4 a' B
sbit LED=P1^1;
) q% Z7 k/ h: | C# wsbit ROW1=P3^0;
; V' s' @! v9 T7 Rsbit ROW2=P3^1;
) i9 j- }- E P6 c" M* wsbit ROW3=P3^2;! I T" w9 k9 D( D
sbit ROW4=P3^3;
1 C5 @) w3 g* w" I//sbit DIAN = P0^6; //小数点- G$ | T; ~ w+ i
sbit rs=P0^7;
$ Z; a9 f9 ?6 Z) usbit rw=P0^6;
7 [# M. Q+ d1 l+ a \0 ksbit en=P0^5;8 ~/ w6 ]3 n; `6 q5 N0 ]
sbit D1=P2^0;4 u% G* a' r+ B- R( _, ^
/ j# x- O) ?- h: _( ?1 ]/ |; a
_0 D0 n1 _ n3 l
volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂
* \: J7 S9 V# e9 U/ u3 k. l; }- e+ n) N
0 k+ B7 c C# }& h4 Z3 X6 K4 X- c1 o
/******************把数据保存到单片机内部eeprom中******************/
5 N9 j5 Y# I1 Q2 V+ D1 |2 Lvoid write_eeprom()% _' c7 b: O7 Y/ g* B. g
{6 ~+ M" ?2 k, c8 o4 C
SectorErase(0x1080);
1 w- \1 B0 {7 y1 T6 P7 S+ B GapValue1=GapValue&0x00ff;5 Z( Y# y" b3 F. b+ e a" S
byte_write(0x1000, GapValue1);
& W3 J( l+ g9 J* Z GapValue1=(GapValue&0xff00)>>8;" O- v z$ G( _" T
byte_write(0x1001, GapValue1);$ _& Y; R- j4 K# o* {
byte_write(0x1060, a_a);
6 I; Z7 S: G* |7 m}
2 K) B: J& x% A: M2 v) N2 ]8 e3 |) T8 p* p) a7 Q
3 m$ c, c1 H: {; M8 v( o! B* o, z! f6 G' c/******************把数据从单片机内部eeprom中读出来*****************/
+ ]- K3 ^7 ?$ A) |void read_eeprom()
5 }) @ B) U" C, \! ~$ O{& g( A) O* h) l
GapValue = byte_read(0x1001);
2 W* U/ L& h9 o! p" q9 B# n GapValue = (GapValue<<8)|byte_read(0x1000);
0 A% m; k* J" O5 u# G Z6 U7 T% X a_a = byte_read(0x1060);+ x! Z2 p$ t+ Y6 R0 r; t
}4 w- l3 N7 I2 ]7 X+ O c
+ q( ~6 C" ?/ l6 S# u- a7 B. ?' b1 z2 z" Z+ N$ O% U
/**************开机自检eeprom初始化*****************/
/ P/ H5 i) `$ W1 \& N9 ^void init_eeprom()
# F$ T& D' X, P; O{
) ?: a' y" `, j* } read_eeprom(); //先读- g2 J n& r- x9 p/ Y6 }9 G: e
if(a_a == 1) //新的单片机初始单片机内问eeprom
' I- ~5 S" K5 {) j y ]5 R {! |1 Y" h& s+ b; A
GapValue = 3500;
) D, o z. N( i% [/ b$ {' I a_a = 1;
$ P0 o: }: N9 S2 g; m- o8 X write_eeprom(); //保存数据
( u7 p1 S. p) V5 t( U- G" E% e } 5 Q" M1 l0 _% Z/ r2 ^ P$ C4 H
}
4 i( Z) w- N* M8 V/ V2 Fvoid delayms(uint xms) //延时
2 m! T7 D* q9 ] {+ G4 ~2 V4 Z, h" u
uchar i,j;& L0 c \: |. o, ?' i; X5 N$ s
for(i=xms;i>0;i--)
/ p0 i% L7 C o4 ~3 B for(j=110;j>0;j--);
5 t. r+ L7 l+ Y% {% G t }9 l. a& c2 ]7 T2 U# j& W g
void write_com(uchar com) //写命令: l8 Y; F0 q2 f L! e* K5 x
{
$ {* h6 j4 f: R0 J9 j* x rs=0;
/ K+ H! P; d/ |) F/ U2 m- O; m// P2=change(com);
3 o2 V$ v8 p, J& W2 O- B5 \8 f1 v P2=com;
5 w: e+ P' w+ P( ^7 r1 f: N delayms(50);
% b, q+ s6 A. c$ x en=1;
' c8 q# X) O( Z4 O0 u6 k. F; ` delayms(50);/ T' Y* E$ N8 [% i2 ^
en=0; . S" p& S% `2 ]! c( ]+ w4 ?$ x
} ?% x+ z) v) o6 N, i M: A
void write_dat(uchar dat) //写数据
* P( \6 S: L& c {
3 a0 t0 b3 e# ]# c' u rs=1;
) A* e1 F6 g, J1 Z7 g/ a// P2=change(dat); 5 o+ n2 H" l9 F& T! |4 D
P2=dat;
& c6 r3 x* ]# [. i: ` en=1;
5 G+ I% w* y6 E9 q' m delayms(50);
0 y: R- Y9 e8 r4 g( P1 @6 z en=0;
: j$ T" N0 |4 Y }) L+ ]8 F! i: M3 v* m
void init() //液晶初始化5 K8 m, j( W' g0 X. {* ~- q
{
3 K; l: h0 v9 R1 H rw=0;& }( j+ A; I% \; g9 K. r7 `
write_com(0x38); 0 L" T8 h+ N( S2 z1 _
write_com(0x0c); 7 L+ ]/ `" ^* x& f. j0 G
write_com(0x06);
# O1 _) C9 [0 p. b5 {! A' h" J //write_com(0x01);
) \, t* S. c( y# @- G }
, O* x& V9 l" |3 s8 Y/*****显示开机初始化等待画面*****/
! c/ |' n- S' ~0 s- [/*- u5 o, P/ d& S% m9 Y2 z
void Disp_init(void) 8 y8 m) n- o5 T- ]/ x
{6 Q5 L b I" _; t0 X
P0 = 0x80; //显示----1 ~/ P; u0 ^+ W: a- J; R
P2 = 0xBF; //依次打开各位
! Q2 h" |7 v7 f5 a! w& J' Y Delay_ms(1); //延时
0 o5 A1 C/ n f P2 = 0xEF;, }; @! d" H$ c1 p! j
Delay_ms(1);
1 `/ R7 T& w u2 Q P2 = 0xFB;
n z) k3 u1 f7 H* k Delay_ms(1);4 y. P! x; N7 E6 h& C
P2 = 0xFE;3 D. @2 w, ^5 S& Q3 {8 i3 f
Delay_ms(1);
o6 t) d+ P e5 }) K+ m P2 = 0xFF; //关闭显示1 G3 }9 O8 I* n
}
9 R7 S9 u$ k7 p! P, X. W2 C*/+ z/ W0 V6 C( V" i* y" J, T6 u+ F
//显示重量,单位kg,两位整数,三位小数
/ t6 U% {1 V* h: @, a1 ovoid Display_Weight()
' w$ h: ?$ Q. M{ ;
9 I" C) B$ {4 F. t; ^2 R4 U5 K" x- K qianwei=Weight_Shiwu/1000%10;
, c$ L Y( ~. `/ M% ^# s& m baiwei=Weight_Shiwu/100%10; ;+ l3 {# {+ H" q0 R: L4 k- ~' U
shiwei=Weight_Shiwu%100/10;
0 ^; v! \5 c8 {1 z2 `9 w; h gewei=Weight_Shiwu%100%10;
0 A; S4 r# u/ R2 j: q, o S write_com(0x80+2);
$ E6 J. @9 f8 R, W2 W! d
4 e+ w. w- `* M8 o2 e3 @
* D% l& U0 y9 |. T6 t: T' ]" S write_dat(qianwei+'0');
5 k5 h- l9 ^8 w: Q7 { write_dat('.');
4 }* C- d- ?& `! K write_dat(baiwei+'0');
: s3 l1 W4 K/ g1 ^ B write_dat(shiwei+'0'); 1 e$ s6 Z* R$ n
write_dat(gewei+'0');
2 K M8 G1 V- f0 h/ R" M ! X- n7 l" B9 T" ~9 Q6 D' k/ p* x6 O
' c2 P0 f3 m5 z# \8 ] K5 E; M9 Z
} " q$ A6 b- _# X2 d/ R1 s
- k2 k$ |; U1 w, R
! m. K/ n* ` ]2 P//定时器0初始化' [4 u1 Y2 M; \% a' B; {8 E
void Timer0_Init()
7 e; J# K+ P, z, k{
- w6 P$ R" D1 W" Z4 }" [ ET0 = 1; //允许定时器0中断1 R+ k6 r1 k" X/ `- X+ E# x# F( D9 V
TMOD = 1; //定时器工作方式选择
; y2 Q8 r: p7 T TH0 = 0xb0;
+ T/ y: l) Q; M7 v TL0 = 0x3c; //定时器赋予初值
# W* ~. Q9 X- v TR0 = 1; //启动定时器/ S+ j, d: u% q
}
8 s+ D9 B" i4 D, P/ ? G
& n& J2 u" Z! S9 S+ P+ D3 ]8 L. t; N" {7 r% {$ `4 U
//定时器0中断 o& ]# B4 }% U) W6 q7 B: [
void Timer0_ISR (void) interrupt 1 using 0
1 R( X* W( ]' A8 S/ Q& @& G6 t& D( X8 O& x{
/ j( {! E1 d7 D* B+ ]$ Z8 ^uchar Counter;' T5 e. n% N& U; y; k& d
TH0 = 0xb0;
9 m& L1 T: g$ T0 R TL0 = 0x3c; //定时器赋予初值; m8 f% ^8 O) s4 c
5 h$ w1 J; U) }+ {6 N9 ]5 N$ }, U& m$ \
//每0.5秒钟刷新重量1 m+ u7 G1 o* _ L! ~
Counter ++;
8 O8 X2 Y1 w% |$ S; B2 W if (Counter >= 10)
! c* M$ y7 Z& u3 M' x4 j {% s# D7 k9 l2 V- X. ?3 [; i' G
FlagTest = 1;
6 ?1 O0 E' o% {/ |! l& N Counter = 0;2 E" k2 H; E) I$ C
}
% w# J. g1 ?- r4 k: Q* |}& s/ P4 P" E& Y' |) ~0 U9 S% _
9 r Y- P5 k1 w- ~9 Y2 W
" K9 |2 N4 F7 I
2 l7 W: A( i0 \2 X% H! n; L: p
) |3 U7 j& }% M//按键响应程序,参数是键值
4 f' S( ^% j! ~/ Z# Q/ a//返回键值:7 D8 w% x9 h, _/ \
// 7 8 9 10(清0): K7 i* c6 K, D t1 c$ x4 B
// 4 5 6 11(删除)- ] D0 D3 t7 O! ?
// 1 2 3 12(未定义)
/ H0 G5 K1 I4 z5 w5 N// 14(未定义) 0 15(.) 13(确定价格)1 F; b8 {: l& S2 M$ o# \
! R8 D) F5 D2 M& N* M' R& t+ Z1 Q& @* W* y1 L6 B
void KeyPress()
( L( @& S) y! Y) d8 @{
" c/ p( p% T4 H2 [ if(ROW1==0) //清零键% m9 |# i( V S& a# d! x: ~
{
6 K/ T1 S7 C" w7 `* U8 W Display_Weight();
3 s& O4 |% ^& s if(ROW1==0)
) m6 U0 s' z" v9 r" m0 g k {
" n5 @7 e6 s/ o$ g$ A# |! S if(qupi==0)
$ p! A) [+ `9 z. X, P: C3 ^ qupi=Weight_Shiwu;
% j$ r- f7 N& z6 N else
: a8 E5 W6 G0 g, H" E& J qupi=0;
9 o, R/ V+ O9 j9 D @ Buzzer=1;
" \: R& }% x q- o5 { for(p=0;p<10;p++)$ M1 ~. F; y6 q1 [, k+ h8 G
Display_Weight();# @' b; X/ z/ @$ d2 D; ?4 x
Buzzer=0; s* l5 _/ `0 }9 m/ x
while(ROW1==0) Display_Weight();
: p$ r0 b2 W- k7 u2 a }
0 b" ?$ n l6 h' U' @; o$ _1 \4 b( n }1 s- u8 ?) C* `$ R4 l
if(ROW2==0) //加
# A. |) h% D! T' M6 v {8 z+ S; {7 a4 i* p' q
Display_Weight();3 h8 c' ^0 Z/ L8 t
if(ROW2==0)
9 I& O8 A; g! f3 x, Q7 F2 v& C* }0 x {
' z, a/ i2 ^% K, D/ R# y# Q while(!ROW2)4 d* d! `/ O) l% r
{! `7 A8 L! R6 n
key_press_num++;3 y5 ^2 q- Y3 h
if(key_press_num>=100)/ u7 @- q7 P6 r/ b' t
{
2 {6 K2 o* i2 H4 `, ], H0 | key_press_num=0;! z, ?" e; ~! `' E
while(ROW2)
2 L: M) }7 N$ a' b# f {. X2 r1 k0 W8 q
if(GapValue<10000)( S- L1 V* F0 C5 }- v
GapValue++; C, A4 [" n4 o1 P
Buzzer=0;
- |8 _5 Z; \% a8 P3 ~ for(p=0;p<2;p++); |. ]/ y, u3 t7 M0 i% W& _
Display_Weight();' H5 m& u$ ~* z7 k: i7 O) \% E& x
Buzzer=1;; ~$ g8 m) X, h) s; @: q* {
for(p=0;p<2;p++): H" P" \4 \2 x; U: ]+ l
Display_Weight();
$ I9 q0 |) N0 V Get_Weight();* p7 \" J+ o( c9 t6 V! N! h) f
}
3 X, O8 n" G6 b P }
Z" ]5 h+ e) {2 U$ ] Display_Weight();
1 |0 Q* p9 ~' t" [ Delay_ms(8);3 ?! B$ z! k9 l3 ~# i
}' v% h" L% \: L. {% Z6 F
if(key_press_num==0)
' @! w( o" u+ ?9 {2 Z* g$ P {
$ h8 X3 o: L+ C: {' l" F6 k key_press_num=0;4 I/ M7 `+ ~: k( m: A" k
if(GapValue>10000)
- O% w4 m# l A GapValue++;% X( B" \9 [5 S! ?( z0 D, ?1 \
Buzzer=0;9 X7 C" ^9 w: T3 I* X8 ^4 x6 d8 R
for(p=0;p<10;p++)2 V$ i# K. R) o* ?
Display_Weight();" K( G, W0 K) P& ]% z/ T3 b9 G; z" k
Buzzer=1;6 }" V, O3 w( B6 h: M: Q
}
& S" ~/ B6 D/ P& c [ u write_eeprom();
4 G6 r/ K" R6 A* t8 O }' @3 s3 T8 Z8 D; e/ Q% ]/ c# v
}
9 n0 |# u$ m6 L2 j" k if(ROW3==0) //减
& f/ z0 ^; b1 q {
$ A+ S1 N% n- u9 S/ Z- g Display_Weight();2 g- d% ^& @: d( D& P+ `0 F) {
if(ROW3==0)
" O% B8 F6 {/ S9 k% t) ?* ]% Y% ~' L1 @ {
; ~4 p2 ^1 S! s" `1 Z# ]+ [- W7 } while(ROW3)2 W9 a* i. ^0 F. {+ Q! J
{. `; ^4 s# C, ^% m6 h, s( d
key_press_num++;. K# Q7 J$ G+ x8 g4 `
if(key_press_num>=100); h9 k4 D! ]% @, G8 v2 v; _9 G
{5 u |6 Y6 Z& z0 [# M2 k* u
key_press_num=0;1 w( T1 x' N- h3 w4 K
while(ROW3)# I! w5 G8 ]$ ^1 Y3 W# N6 H
{
: t b* y) v) K" z) Y if(GapValue>1)9 q9 O( E( j0 m E: x+ j
GapValue--;/ a# S1 z& r/ a$ @
Buzzer=0;4 O8 K/ P+ K5 e, o
for(p=0;p<2;p++)
/ }! Q4 G5 h0 W; y2 E7 g# p$ F Display_Weight();( m% n( j: q) s" l1 {
Buzzer=1;
& [ P9 l* g) x8 a) O; @ for(p=0;p<2;p++)9 O; i9 q4 N3 g* e5 h$ A0 G8 J
Display_Weight();8 X+ n% ?1 M2 q1 i% v( R8 n7 c
Get_Weight();
; ~$ h; D4 U* V0 b3 Y3 c; r$ U2 f }
" a3 Z1 G7 A- o, n }
. e9 o2 o+ i! W: E2 U: {- f3 N4 b9 w Display_Weight();$ ~# Z1 e# e- a1 @+ a0 ^4 G6 T
Delay_ms(8);
7 ?& |2 V- Z* B; S, n. s }. S* A }. W3 b5 G: r
if(key_press_num!=0)
6 U6 @) ?: B, F& e ? {
1 ?6 q/ c3 q; h5 n2 e( o key_press_num=0;+ L! P8 C( N4 g2 V b3 B
if(GapValue>1)7 Y) b7 x7 b, e8 H3 w# _1 G* i
GapValue--;" W* _# z: ?6 G; l7 \$ V
Buzzer=0;
8 S9 Y% ?) j8 l for(p=0;p<10;p++); s9 Z/ F4 Q7 l4 V0 G& q; R8 t
Display_Weight();0 M8 v+ p& {6 b5 ?
Buzzer=1;
* D& [9 x V* Z6 n( P! k }- B- k% V( Z8 R5 Z! }
write_eeprom(); //保存数?4 I% A- M9 r3 o$ {0 A; q7 D4 i
} ~' n/ \3 E5 l1 j2 q8 S' t
}
`7 p( R u4 Q}
( J1 w% e- x3 P8 e6 v' q: j//**************************************************** o) Z- {- J7 @) `% w
//主函数' U' |1 ]- U$ y- P" S
//****************************************************# D" i0 Z1 E, n
void main()6 ^) w, G6 E o4 N% _
{ % u3 m6 F) `& c9 g+ H. y! `4 j* H
init();
2 G1 D9 Q' ^ e6 B9 R2 h6 X. {% } init_eeprom(); //开始初始化保存的数据
, J. ]9 ^& Q, t: e+ J+ G! R; p+ d EA = 0;
* r; g( D9 r# g8 C Timer0_Init();% f& p" | s8 [$ v0 h+ O8 [* U& j0 W
//初中始化完成,开断
l ?2 R. b# e/ `* l1 z& d8 ?6 ?2 v+ X EA = 0;* _4 ?. P1 [. x+ b) L: M6 U; X3 t
write_com(0x80+7);
* n5 o' r* O5 ]% l write_dat('K');
% Z+ ]# j* Q6 \6 q# @' K7 i write_dat('g');
. J* K& N0 j$ [# c2 V! Z" k while(1)
4 u' n0 O8 [) A0 i F4 H- n { //每0.5秒称重一次
! w) F/ H$ c, N/ A& r4 B1 i5 k2 Z
# J. Y( L& u2 ?! Y& S: r if (FlagTest==1)
8 _" c9 I1 G, Z- o3 x+ {+ Q' u {
+ h1 m4 ?% {5 M8 G. [. N: x Get_Weight();% ~1 r, u% c4 i( N4 Y, z
FlagTest = 0;. P) P* ^4 p: x% P
}
8 }" H6 }+ x3 O- a3 T! D- T _- J+ J if(flag_cz==1)8 o# c/ Y* z) C
{+ C @) e3 k/ Z( }/ G( j
write_com(0x80+2);
8 X. M4 j+ V1 w6 T5 E0 { write_dat('0');8 z/ T; z5 C; @, ^, L$ ^6 `: F
write_dat('.');
4 Z7 K( _' v' \- a: E write_dat('0');
/ C; \& r# S+ L) O write_dat('0');0 R0 j2 ]+ i. ]2 C T
write_dat('0');
) }! b" [. n& B' G& P write_dat('K');
3 G6 t/ q1 D; {) \; V write_dat('g');
# ]1 ^' C. `9 J# R4 v+ z$ d }3 j" v" t, L& ] I X
5 D8 w `1 l* r. w
Display_Weight(); ' C G) }5 a9 M; Q1 B
KeyPress();
( ~+ v) G- g8 f Z0 K$ Z `+ R6 e }$ h# [0 s8 t' x ^8 n7 e6 u' ?6 X
}* V) ^' E5 j6 o' R0 S6 N
//****************************************************
% ~* E9 B! d. c; I8 L6 m- g//称重
/ P! s, ^* ^# t3 m6 F$ d7 E2 I' l//****************************************************
$ l- O0 f, s; O G8 kvoid Get_Weight()
0 Q7 ]$ z/ T! r( @& }7 X{: A% b( S Y) R
Weight_Shiwu = HX711_Read();
% ^9 @/ a2 t# w! c6 o( c Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重; X" Q6 g* i- H* U0 I7 ?* I
/ ~2 }2 }4 [) ]! p2 m6 ^( Y; n6 `
Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi; //计算实物的实际重量
# _; T% Y6 \$ C; q if(Weight_Shiwu <= 10000) //超重报警2 P( c! v" a5 m, b
{
$ T) S( b) S2 H9 h: h Buzzer = !Buzzer; 0 h1 t. k" Y( t; w: {0 v6 `6 U
LED=!LED;1 ~) ?8 `* R S$ `8 B
flag_cz=0;- Y- i) B. P* C7 ]: M6 d g9 G* z
}
# _ K6 K+ \0 R0 \ else- i# h+ q5 T; Y( Z+ Q$ [" Y5 Q
{/ x% o2 E0 m2 D( j: g! Q: Z* |
if(Weight_Shiwu==0)9 x. d* d3 l$ K* \
LED=0;" p2 A3 P1 }9 z7 a7 \2 A
else if(Weight_Shiwu>0)$ d# H. ?( c) M; s9 z$ Q
LED=1;
. c; n; P9 t/ G" s0 S/ i Buzzer = 1;% `& x9 |( Z0 V% ~. l8 h0 C
flag_cz=0;+ {: m8 Q3 I# D$ z$ Z
}
9 j b) S- R5 B6 K2 ?* [}8 B$ p0 |, N! E6 G* x- Z O
…………限于本文篇幅 余下代码请从论坛下载附件…………
4 s! ^. i8 I( t: t# `- z) `; @5 O' T4 ]4 ?
: `, e( ` W) U1 \ X
0 z7 z2 v- z T4 F# o7 X4 ?) a; e4 Z. h! t+ h* J l3 l4 c5 y, V9 `
: X) |: K7 d0 A/ O6 [
3 n* m6 U# _9 R0 O6 A4 K* g# x& O3 r/ k- L* X+ I" {4 H
|
|