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