|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
HX711电子秤单片机源程序 已经投入实际应用
" c% D- z1 U. B& Z/ x( T2 ^) t" x/这个程序是网友提供,里面有个 "读HX711 AD数据子程序" 仅供参考,7 M, c1 Q$ o/ }+ o2 ^" D/ R
//有客户反应说:发现这个函数Sampling出现问题,各位看着办,酌情使用
' r s( n W% e' ~8 n! K
3 U* ?; e. d% q7 i* kHX711单片机源程序: |
w; f9 p( w Q/ z: I0 b$ V" i#include <reg52.h>
, b. r6 v5 v* M4 t" D#include <intrins.h>5 g N0 @* r! a" R- p/ ]
#include <stdio.h>
4 F y; O& y7 J8 E" P
! Y+ p: ?; f3 r" [: a9 J' wsbit ADDO=P2^0;
1 t ?8 q8 r0 _$ ^6 ?sbit ADSK=P2^1;
- d# w' t/ R usbit led1=P2^4;- b1 ^* w" u9 a2 y6 T. p
sbit led2=P2^5;
4 e9 e5 _& L# M5 g" G- Dsbit led3=P2^6;
7 c: u6 _: r/ {* y0 @6 z0 Z7 psbit led4=P2^7; " @' m a" Z, \; F$ k5 X
4 p1 S+ G, t0 R7 I, l
//unsigned char key;
, ?1 u. _/ L/ E3 |' U8 H, `- e4 ` ~$ A- J
unsigned char code disp_code[] =. ^8 r2 }- T6 m6 @" ^- \. I
{
5 w/ l; E: A3 s& N9 Z2 C //显示码数组+ E% F" q+ z0 W) {$ p% f
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88,
, p# n5 ?* E6 r. C' h& | 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf
6 w* E2 Q9 o, W9 a. K+ {3 K};
: [( t# V& [/ T" o _6 u
7 m1 M+ @, v$ D' aunsigned char code seg[]={0x7f,0xbf,0xdf,0xef};//分别对应相应的数码管点亮
, V5 _" `5 i4 w+ U) i8 r a7 U; \4 F; C: C
/**********************************************************
1 A4 i5 F6 t' F& c0 w+ C. X( {* Y- Y% h
延时子函数& ~% a) m* _( W# c7 D: ^
8 |6 y* ?( W- u5 n7 Q+ s% k9 J! Q: d
**********************************************************/5 }- f* t% j/ V4 u
void delayms(unsigned int ms)
2 w; p' M9 v5 @' f4 Y{1 M1 X9 {. ^7 _! b& w' c
unsigned char t;
0 o1 \# A+ }2 s/ U while (ms--)
* i* h d0 J) f Z9 Q7 [ {
* ^" M+ G y$ q0 f; I1 g for (t = 0; t < 114; t++)- L: r$ S4 k6 h5 O+ [' s
;
/ g. G8 _* @& |. A }
, R6 B1 G# r8 T& l7 {/ J}
! _% i5 q' x0 S. M8 a- n# z r7 `5 ^8 V q1 ~* t# T
/**********************************************************& Y6 U: h- P* ?- ~" z7 L
0 G. I+ Z" \' i: V/ H! Cx*0.14MS 延时子函数
9 m8 ^) j' a' S4 Y' Z! @# \ V ^, L/ l$ h0 M
**********************************************************/& Z3 X1 ~7 t% U
void delayus(unsigned char x)' f: R1 ^* r2 _ Z/ F7 x
{/ \' u7 k5 b3 d4 J+ }' _5 D& @
unsigned char i;) A3 t5 T8 n: h* s& I% C0 W6 |4 _
while (x--)5 c5 e) S" `, ~8 T
{2 C# k2 B7 u L
for (i = 0; i < 14; i++)" y8 ^2 G) r! `* {! t( D8 T2 E" v& u+ C
{
6 x" G4 k, V8 j) V) Y& ~" d6 N8 d6 V ;
3 j q- ]+ N R( P" n }( J |, H( M$ e! o- o3 U
}
4 D( Y( k0 N- C' _0 w$ q}' x: o' ^% ]* v% b# i4 w; d2 N, f. H
! B7 t$ a( n& r7 l
/**********************************************************( |% T$ [* R+ {6 A k, p
3 J& Z0 w" M, ~& C4 T0 F W9 `" p读711 AD数据子程序, D3 `' C6 C3 S
/ x0 i$ E# v3 _' M
**********************************************************/# { h( o+ S/ @% \5 c+ K
unsigned long ReadCount(void)) j7 T* j1 C$ }. M- J! h
{
3 J5 v; Z5 q3 ^ unsigned long Count;
, l3 l2 g1 Y% l" \1 k& E unsigned int ADval;- n+ n- ?% M `6 K2 Y5 _
unsigned char i;
* f3 q' E9 [7 k ADDO=1;
$ r$ N! g! ]1 N$ b ADSK=0;
9 s- s+ A: W: F) u1 B" ^. p Count=0; ( Q- ?0 Y; h. |7 H( }$ |
while(ADDO);
' R# j3 L* J6 o$ `* r0 f4 w! u for(i=0;i<24;i++) //读24个bit
& g, ~' y. Z3 j7 a; p {
) ~+ b& l9 @9 z: l ADSK=1;
+ G. K, e9 Z2 g' s1 |- G9 A Count=Count<<1;
5 J3 x; J# R3 P# M0 {+ R. l( x3 I ADSK=0; - v/ d' X& Z" g$ J5 e* h
if(ADDO)Count++;
6 j/ K6 Z& Z9 E6 K5 |9 S! o! q/ ~! d }
0 E$ A) Y, J6 L( U+ V5 I ADSK=1; //发送第25个脉冲,表示下次转换使用A通道128db
* U, _7 D3 w9 `' {4 i// Count=Count^0x800000;
9 K& ?4 @! t& Q% ~$ V ;& ^1 O1 z4 d& y5 U% _
ADSK=0; ' F! t; I8 I4 |5 V7 Z0 Y
/* if((Count & 0x800000) == 0x800000)
+ N- E% ?- O- {6 p" E {* X' h) y' V0 u, L4 [
Count = ~(Count - 1);
; b7 s# z. Q' S } *// f- k* y) Z8 x1 Z% `' ?" o5 T5 u
// ADval = (int)(Count >> 8);//取高十六位有效值 3 D5 w/ `/ U3 A: _6 N" r2 ~
ADval = (int)(Count>>8);3 \" c, C- G) s% ?3 j! L$ \
// ADDO=1;3 Q# X' r5 U4 c4 O' Z a
return(ADval);
3 n' ~ w8 ?/ \: ?5 n} ! A1 `1 F J2 Z% g9 m, ~* _( V
' r; ~* M& n1 m1 w4 x, g6 a+ I7 U8 @, p3 T9 |
/**********************************************************
4 a& a" ]# O9 M0 O. g5 B1 [ n0 [
AD采样处理——算术平均数字滤波
. t/ T/ J0 m' s; _. @' J) T% G; i$ T0 I: @7 ]6 V
**********************************************************/, M: M0 |- i, h0 H, F) Z
unsigned long Sampling(void)3 n' U; q/ @% H; o6 G; ]& i8 T% d
{ " V& g; [1 g5 S: k4 g" m- w: O
unsigned int Sam[12],tmpmax,tmpmin,sum=0,Average;
. ^- U) R1 v- x( _) O5 m; w unsigned char i;
7 r( {# N- S4 f3 i0 l4 F) {4 f9 E% s; v7 Y6 H" u: M3 i
for(i=0;i<12;i++)
4 i/ ]: B9 T- Y- U0 D( [9 @ {5 s) V* h, S4 x' R9 O, U$ h3 W
Sam=ReadCount();
; v/ \# E, u t if(i==0)* s- t. {0 J/ @6 I
{' |2 D( V( _% B* T; v
tmpmax=Sam[0];7 o+ n- M+ \9 I! _3 Z/ J
tmpmin=Sam[0];0 A& A+ K8 ~4 C: I7 Y
}
3 x' V l5 j, P& i/ I if(i>0)) Y, t% d* ~6 K1 t/ ~0 T5 p
{
1 [7 \% Y( C/ g8 i4 j& D if(Sam>tmpmax)tmpmax=Sam;
3 I$ Y' @" ]& [ if(Sam<tmpmin)tmpmin=Sam;
$ |9 T% h$ J% d9 @! R }& d" B" x: ~! O: N, n- F1 w0 b
}* a, [" g1 ^6 y1 y
1 r k" u* {0 d' n% U7 g! ^" T
for(i=0;i<12;i++)1 l8 u! s& s( Q+ t6 o1 V
{
3 d$ O, A- B0 j( q1 l* m, r' D# E8 p if(!(Sam==tmpmax||Sam==tmpmin))/ n0 T" o/ d% K5 n5 _1 h+ J$ L
{% y- j7 d& V5 Y5 ^
sum=sum+Sam; ; x" q8 @/ K) M
}
0 i' d& u" Q8 U, U m }
6 |) A+ K2 Q* {& G" D9 q Average=sum/10;6 R; |1 B- W; |
+ I1 P, X4 E' M" ], l" j+ @$ O) C7 q! w
return(Average);
' H0 L Z/ V7 c: a4 z5 V. @9 O+ \5 L}
0 ]. [' J% ?8 B6 q9 H
: E+ [- ^- [2 c+ J/ y# \& Z; S/**********************************************************5 c# ?, a3 e) H# ]6 x( F+ _, O
4 H, _6 T5 M, `% W Y重量值数码管显示子程序
3 @& Z( u, m+ N3 c1 r+ A6 R0 ]1 R% `+ i
**********************************************************/
1 a6 }7 h' d7 X1 Uvoid displayheight(void)
1 |1 K' K. K5 @6 J{) X/ b2 F( V0 r0 O
unsigned int Lheight;
$ S: T' u+ T# U- H0 K$ d3 f float Tempheight;
% J# ~' w. h- d+ K& |0 N unsigned char i,j,height[2],discode[4];
, |) Z: J0 J+ W$ l' h/ A# N' ^1 ?6 e( W9 p3 q
% A$ s8 k5 }& k& C* o: Y// while(1)
2 X3 `1 M) ?! c5 f$ H$ x {
1 o4 }0 A1 S# K' o2 w7 f$ O- A Lheight = ReadCount()-1500;
% z( D3 k: `( L) v4 P! h5 Q! Q if(Lheight<0)Lheight=0;9 R q6 ~; V/ u
Tempheight=(float)(Lheight/1.4);
' J. t4 A: `8 ?4 B2 z Lheight=(int)(Tempheight);) B0 x+ N/ k% U M+ l$ c
% B+ ?# e: e* t
0 ^9 d$ K6 b2 \& ~+ Z9 M# } /* discode[0]=Lheight%16;
9 I0 |. V& Z: [4 I# W discode[1]=(Lheight%256)/16;# e+ b( U4 q( S. g8 }( X
discode[2]=(Lheight%4096)/256;
5 O5 e* |* q3 N9 _4 P, I% G- r discode[3]=(Lheight%65536)/4096; */
7 R% W. G; I3 M: v
2 J. S) q/ Q; @. n, s // tmp10=discode[3]*4096+discode[2]*256+discode[1]*16+discode[0]; + C% H# ~( S! ~" N$ B) a% [1 J! n
) Q3 M' _% _6 T3 c- M L9 h discode[0]=Lheight%10;, [5 Y" b/ Y T6 q) h
discode[1]=(Lheight%100)/10;
5 q( \; H- Y/ | s- p discode[2]=(Lheight%1000)/100;4 _0 r/ z, ^' R& Y* ]" }7 O
discode[3]=(Lheight%10000)/1000;
! x, h2 w, L9 `% I8 {6 \. S( p* |$ p
7 C0 J! D" P+ p4 F for(j=0;j<250;j++)& B* X) W! h3 e- N! H
{( n& f; |4 ?- e: N/ {
for(i=0;i<4;i++)
: R6 W) V- [- B {
" p1 G" R& u6 H: s# c( K if(i==0){led1=0;led2=1;led3=1;led4=1;}) {8 p8 q3 a+ z" Z
if(i==1){led1=1;led2=0;led3=1;led4=1;}
/ r" L* t: h+ ?3 M; o( S+ f' c# @. l if(i==2){led1=1;led2=1;led3=0;led4=1;}0 ]! ~) h+ l+ ?# M* n5 t
if(i==3){led1=1;led2=1;led3=1;led4=0;}
! I# p N7 T L' o m+ Y P0 = disp_code[discode]; 6 p7 c0 X" [# w L: u
delayms(2);! i) @3 R3 y5 M- ^
}
0 B3 ~4 Y1 c# d- { }- b6 O/ w: }" D0 j2 U
led1=1;led2=1;led3=1;led4=1;
9 V$ V0 J c+ ~/ ]$ I Lheight=0;
5 B9 O" g5 K: O, D7 p% W0 @ }
! X2 ~: E. W- D}1 Y# |3 a- |% u; Y* T1 N
7 c( g# v/ z W3 c- _5 v/**********************************************************
) @( _0 p& I' x4 ^* O/ Q: L! d$ d
* G& n0 ^' v& f o W主函数/ r! v! F+ J! R% N2 C0 B0 F
7 E, i9 p+ ^9 A
**********************************************************/
5 Z; L0 S9 S% fvoid main(void)+ ^4 n/ ]# v5 I- ]0 v
{
+ R" V. c. k$ K7 f% e6 x9 u" a// unsigned long Lheight;2 y. ]/ L }, @2 P1 B& ^
unsigned char i;; X) D, y( w( K" h7 e% U% `- D
+ a! ~& X5 O- C/ l6 E. T& W) m
P2 = 0x0f; //数码管初始显示"-"
$ Y! Y1 N \3 y: t0 A' m# z" s' Y P1 = 0xff;
" r- \- {. S' x1 b) ? P0 = 0xbf;
3 r9 H) V- }7 ?, y a% Q! O/ \4 s F7 u: J) C/ d1 k
while (1)% t) }8 q4 l8 V# s. v' x
{
# s: {$ d v4 ? displayheight();5 N: S5 p2 T/ s8 N0 s" A0 C
/* for(i=0;i<4;i++)* K' M, O. U/ e! l. h
{
! Q/ j9 F# s5 U# M" N7 a, o& b P2 = seg;
" t& \2 `8 q# y% F, F, A4 G
7 H5 O. \# p4 M. B8 e& k! D* P- S
…………限于本文篇幅 余下代码请从论坛下载附件…………9 Q) e" H( q) I- h
8 A3 v* N# O7 H4 L
; {1 k& B u9 y- \) O |
|