|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
HX711电子秤单片机源程序 已经投入实际应用. K) U# D* u# N' `7 S* N2 ^0 v
/这个程序是网友提供,里面有个 "读HX711 AD数据子程序" 仅供参考,
* g1 ]4 N0 a/ q/ h X( i& c//有客户反应说:发现这个函数Sampling出现问题,各位看着办,酌情使用
3 S; S6 p2 V8 {; u s/ Z. O x0 P# ^; V1 b: T; J2 M- P: E
HX711单片机源程序: |
( C9 o- R7 F# Z1 L3 k5 P; M#include <reg52.h>' [# v' [! m6 e. E: n, s
#include <intrins.h>
' W% T7 ^, M, z3 g9 W7 {4 N( A#include <stdio.h>
( m0 @/ k: Z& i
5 E# |9 f! j$ E( E8 X" bsbit ADDO=P2^0; & Y! @" ], z# W
sbit ADSK=P2^1;; y8 T7 l! D, ~- w
sbit led1=P2^4;7 n# f( Z. u- N) u
sbit led2=P2^5;
- t) x* D8 e3 ^0 Tsbit led3=P2^6;8 ^+ e) }& v6 |
sbit led4=P2^7;
6 A' r/ t3 {* b
5 y, R) z: ~: ? o: R! c//unsigned char key;: L5 Z- i* l) {# M# j
: M7 a3 l2 `; d4 F9 junsigned char code disp_code[] =
L0 | v0 p) |6 V* ^* d{# u# T6 P2 K, n/ Z! ]8 n
//显示码数组6 Q' u& i7 m$ u. A1 ?4 K4 x, J
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, : B# L. v1 T. ~, U# i r* e6 V
0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf3 \+ A: j0 F; h7 @; j1 u
};: G+ \9 K* m- u; m
3 T; b* d0 l3 E, g4 X1 h
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef};//分别对应相应的数码管点亮1 m2 }( ]" o7 m3 P
) u& F9 S1 }7 q# e
/**********************************************************
& h. t$ K+ m8 V
0 t0 g$ I, a2 m5 P* q3 \* q5 ]延时子函数6 J& G P- Y: ]8 }5 m$ [
( q2 B" n* j/ ^( U& k3 _4 t
**********************************************************/6 j/ [1 c1 k+ E' g$ x
void delayms(unsigned int ms)/ w, ]0 ^! F0 j
{+ ^: W2 h7 F: K: b! Z; r$ b# a
unsigned char t;
( M# t# t3 X2 c7 ^ while (ms--)7 Z w2 ^9 J- c+ n' n
{$ O0 r/ c8 ]9 ?: R+ N/ F$ n
for (t = 0; t < 114; t++)9 k# u& Z0 l8 G- j$ \
;
! _8 ]2 b3 Q$ C! i8 L" Q5 @: V }; O1 d) [2 l- ?- v5 e
}$ H& ], N3 r, ~0 }5 R. D+ r
. }+ v/ x* ]6 p4 M& Y( ~/**********************************************************1 D9 h+ Y! g* D) b$ A8 R; N
4 n F4 O8 V6 v$ ]x*0.14MS 延时子函数
H) {+ ^% _2 T0 r" i: N2 d$ a
5 i( `/ h1 R+ m3 C$ r0 d **********************************************************/
% v7 d; v7 ]. E1 G8 T" X+ b8 Nvoid delayus(unsigned char x)
; H% s/ ]- }4 e2 b/ ~ O{5 \4 z- h7 m! L, M& e1 q1 d
unsigned char i;
* |1 Y j* [8 u9 T2 W7 T1 o while (x--)
) o8 [7 M' @- k. L {
5 A2 g# q" F* b: x W for (i = 0; i < 14; i++)
; ^' x( p, ^' p5 L6 h# h {
3 q C. V8 P8 T& m) \3 {8 d ;
1 K: v' o; i/ M' |3 S1 V }
, ?0 J! j, v: k1 Y! L! b }4 u- F# p4 Y# k$ n
}
- R3 `! E x: e6 G# M* V' \3 [! d7 l9 M% x5 ^0 A( i1 N+ k; o
/**********************************************************
2 k: [+ _6 ~9 I+ [# Q' z4 t1 d4 ?2 F
读711 AD数据子程序
% Y. @& m/ h6 r8 x7 d
* d% R, D1 ]* H c6 U **********************************************************/
2 z' N' j+ H) W3 t% h2 bunsigned long ReadCount(void)
9 m+ d3 d" J, {{ & _: l6 Y% H6 g% \
unsigned long Count;
1 }2 D, I. l; E- O0 T- V* @; A unsigned int ADval;
7 `8 p6 ^. r+ b4 f# E unsigned char i; 2 E3 u; N: V: q
ADDO=1; , l0 y. W0 E: `0 Z; R
ADSK=0; 3 ?8 L1 L/ M; V5 E3 H
Count=0;
; g1 G) Y% A4 ] X$ | while(ADDO); " O. Y7 v' U2 V s8 s
for(i=0;i<24;i++) //读24个bit. Z0 {/ Q( \9 i( i+ y2 U$ p( s6 ^
{
1 n% e% x, u( n% S4 e4 h ADSK=1; J; G5 ]* n" Q
Count=Count<<1; ! T2 L: m4 U7 i! @" X3 C; P9 D
ADSK=0;
8 c7 }' y0 T) B) m/ A3 C* L6 c. L2 N if(ADDO)Count++; 1 ^9 T$ \: {1 K# f/ o9 a1 L4 l# c
} 2 {. p* `. @" {$ r8 U
ADSK=1; //发送第25个脉冲,表示下次转换使用A通道128db) n/ U8 ?' H7 n
// Count=Count^0x800000; - \+ }/ S; `- c: f
;; u3 E2 }! n/ O: B
ADSK=0; . [/ E/ F3 L- S/ `0 B, n+ l- P
/* if((Count & 0x800000) == 0x800000)" z; M4 x3 q7 v
{
$ m: z9 p! Y# |! ~0 M! v- a9 [. S Count = ~(Count - 1);$ d6 u8 z" l9 t1 K
} */- q$ m+ z7 I, i( d. _
// ADval = (int)(Count >> 8);//取高十六位有效值
+ H- I) a% R1 d! l ADval = (int)(Count>>8);5 ^& [0 f0 m5 e1 E8 ~/ `+ {3 z
// ADDO=1;; H) l2 n: e6 O4 |# H
return(ADval);
' B" X- A4 [4 a& D% K} 5 S+ F# C" k+ ^, U4 `
! s$ @. M% n6 m- g2 w D+ f/**********************************************************: N" m0 C1 l8 i' D# J' [8 P
: v5 C% |, G2 C8 f6 s* i# {AD采样处理——算术平均数字滤波' P' D+ g! E( ?0 C9 ~
, b5 r+ m9 v8 D4 L4 j/ \5 U5 a' H. F **********************************************************/
( y: S r3 k* }7 ^' yunsigned long Sampling(void)- l- N3 ~6 N' Y5 S) h
{ - ?- G/ Y% h: N- p/ U. n& W
unsigned int Sam[12],tmpmax,tmpmin,sum=0,Average;
5 X' u, m' G5 f! A8 U unsigned char i;
- ~9 U+ X* Z1 z4 t3 C" Q0 v
* j/ B3 Q# ?% N* x for(i=0;i<12;i++)8 Z2 {+ D {: G; ~" g
{7 r6 ~. g+ X( C, G6 ~. i
Sam=ReadCount();
' B O2 p9 x9 q9 n1 @# b9 X5 d8 \4 G if(i==0)5 L4 F+ h4 B) \) Y, N L7 N( L
{. f' O- j# y0 I0 X, F
tmpmax=Sam[0];
* V" [7 h0 F! r tmpmin=Sam[0];
. Z) J' p' d1 Y }( R, I. ~: w4 Q1 ~) \
if(i>0); s9 j7 | r6 e9 A/ B g! g
{
; R1 K' X/ g* Q% b- p if(Sam>tmpmax)tmpmax=Sam;7 H( m- k- X6 d9 h: D7 D, l
if(Sam<tmpmin)tmpmin=Sam;
/ Y$ M0 s& t. i6 {1 P% j }
2 M- S' n) w" }5 a& O }
+ N& O$ B) b& u9 B& W4 V: n! t# b+ h6 _; [3 \. ^2 V
for(i=0;i<12;i++)4 ?7 A) T D7 S! T, U- c
{
* F$ b# ]! M2 I# E# |6 ~/ u if(!(Sam==tmpmax||Sam==tmpmin))
$ X& P; C: o# g* T2 \ { `1 O* q' u j
sum=sum+Sam; . \$ i% `8 k7 }, v$ T
}" I: s E9 z) _8 b. g: u! L" H8 i8 i" u
}
% q8 o, I& f4 e( _' w7 E Average=sum/10;, \2 D9 z7 y: A! q8 a; z
) ~! }2 a! O' r* m( B5 t2 N$ l
return(Average);
1 P1 N4 _% x5 E6 g- @; `} : f% h% f+ |& R! P) y
8 p7 C/ ]8 C9 x+ ~0 s/**********************************************************# F4 H" g- H! G$ E! }1 Q3 v
$ |4 a+ i; u; |" o E& p
重量值数码管显示子程序) F5 }3 J9 K( b5 v6 ^0 _
7 x5 U; d$ H, u2 O, y
**********************************************************/9 _7 Q! C2 x' S" s* a! S7 m% m
void displayheight(void)
, }- N9 N( D3 p# A9 ~{% E8 `" }; J8 E) c; m: M
unsigned int Lheight;* e- K6 V Z( a
float Tempheight;
7 c' C0 H3 \+ o unsigned char i,j,height[2],discode[4];
2 I% H" q2 \: R1 ]0 r
2 J, U9 n3 A' @6 F4 d7 v& l1 ~
* q; H# }& r0 m6 R6 m8 }0 `! w// while(1)
% \/ M0 U! g2 k S3 k {
. p/ h0 {6 a% ~ Lheight = ReadCount()-1500;5 q( f& Q# X; L2 ?/ l2 k* C
if(Lheight<0)Lheight=0;
; l' t! v$ G) S0 V Tempheight=(float)(Lheight/1.4);
! p; i4 z) ~4 T! d5 O Lheight=(int)(Tempheight);$ S: [2 ?4 J" w ^. w9 h
7 H S3 y% K9 g0 ^$ z: \& T( L
2 l* F' V& A2 I /* discode[0]=Lheight%16;* x" p7 T2 ~- {0 ]3 w
discode[1]=(Lheight%256)/16;) [/ D+ s7 o. G
discode[2]=(Lheight%4096)/256;
) e. D1 h; {5 H discode[3]=(Lheight%65536)/4096; */
! S+ H& R! v. K* R t; N! O8 _& S* X! N$ L" D
// tmp10=discode[3]*4096+discode[2]*256+discode[1]*16+discode[0]; : L1 J; O7 d+ J% G! f
0 Q: P$ r' k2 T4 v
discode[0]=Lheight%10;
* W( g% q6 K% ~1 v discode[1]=(Lheight%100)/10;3 ~. O8 U8 ], S- O) E; c; S2 t
discode[2]=(Lheight%1000)/100;+ X' @. [3 _. a/ O: ?+ g" B
discode[3]=(Lheight%10000)/1000;
- o5 M; \ [7 ` ?8 e/ |, @
, o% }1 _1 A# I" E1 [ @ for(j=0;j<250;j++)! N! K+ o$ K2 N. y, W9 B/ _
{5 j% Q. `) g; `& p
for(i=0;i<4;i++)
4 o) _1 @$ ^( Z/ b3 {5 `/ b {
' ?3 N- J2 a- i, ^- A+ [0 k( l3 t if(i==0){led1=0;led2=1;led3=1;led4=1;}
: g0 ^3 [) O$ k- s5 H( n: B if(i==1){led1=1;led2=0;led3=1;led4=1;}
$ d1 O6 K( R; J4 h, }' ^) {4 X+ U( L if(i==2){led1=1;led2=1;led3=0;led4=1;}
6 d2 a" d* v6 T& K% O if(i==3){led1=1;led2=1;led3=1;led4=0;}
/ F2 y1 |, g+ y# L2 B. |3 f! [+ O P0 = disp_code[discode]; 2 z7 w% v, R# a0 H
delayms(2);
, |: B& C; \; z9 C }2 E4 i. e( s0 h3 t, O
}
6 b! k- W6 ?% h: B2 ?" @; ]8 s led1=1;led2=1;led3=1;led4=1;
9 ?4 @3 O, x( {# Y4 d Lheight=0;
0 c3 \3 \% p. r, Q }+ m2 S' u4 ~& o8 X
}4 R+ G# n* j2 m( ]
0 @6 c8 H! Y* U- L
/**********************************************************
+ z6 a% l1 c! y0 u' u& E; P$ W' e, z! K7 G* W
主函数
& A$ S9 y. A8 T4 F3 V
) g$ [# [7 J5 K **********************************************************/
) k9 s! ?! j, ~/ ]& I8 Cvoid main(void)
( a* I, F% U) T" I; h) Q{& ?6 H3 w% O+ Q: `4 G
// unsigned long Lheight;$ ]# T5 P" j6 g& R
unsigned char i;
$ T w: c v5 Y P/ ~
, Z# G. n- B7 |0 W3 d9 ` P2 = 0x0f; //数码管初始显示"-"
7 E/ f- O8 U+ n: ^ P1 = 0xff;
/ `% J9 c8 h/ t( ~- z% z" u# `& s; x( w P0 = 0xbf;
8 \/ M, q# m" c+ B2 m7 E% n y/ C1 w
while (1)9 u9 K( j# y" B, \) d9 M! o5 `
{
4 z' h8 f8 A: i% o displayheight();
; D; P, {' A' }, i% v8 Z, L, _ /* for(i=0;i<4;i++)
( s+ p. f2 @1 a* B* o6 A w" t5 n {" ^5 W( d( G: L2 ~
P2 = seg;' i& Y9 N; y4 O/ i, X9 u6 r% S( a
8 S+ M' a, f- \' C- a
, y5 j9 Q6 n. a6 z% U9 z…………限于本文篇幅 余下代码请从论坛下载附件…………" ?# ^ E4 y. R+ E
0 O8 S3 r. a8 k7 f5 N# g; h
7 d3 p0 Q T$ u, |$ j( K |
|