/这个程序是网友提供,里面有个 "读HX711 AD数据子程序" 仅供参考,
//本店不做任何注释说明,大家能用就用 不能用就删
//有客户反应说:发现这个函数Sampling出现问题,各位看着办,酌情使用
HX711单片机源程序:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- sbit ADDO=P2^0;
- sbit ADSK=P2^1;
- sbit led1=P2^4;
- sbit led2=P2^5;
- sbit led3=P2^6;
- sbit led4=P2^7;
- //unsigned char key;
- unsigned char code disp_code[] =
- {
- //显示码数组
- 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88,
- 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf
- };
- unsigned char code seg[]={0x7f,0xbf,0xdf,0xef};//分别对应相应的数码管点亮
- /**********************************************************
- 延时子函数
- **********************************************************/
- void delayms(unsigned int ms)
- {
- unsigned char t;
- while (ms--)
- {
- for (t = 0; t < 114; t++)
- ;
- }
- }
- /**********************************************************
- x*0.14MS 延时子函数
- **********************************************************/
- void delayus(unsigned char x)
- {
- unsigned char i;
- while (x--)
- {
- for (i = 0; i < 14; i++)
- {
- ;
- }
- }
- }
- /**********************************************************
- 读711 AD数据子程序
- **********************************************************/
- unsigned long ReadCount(void)
- {
- unsigned long Count;
- unsigned int ADval;
- unsigned char i;
- ADDO=1;
- ADSK=0;
- Count=0;
- while(ADDO);
- for(i=0;i<24;i++) //读24个bit
- {
- ADSK=1;
- Count=Count<<1;
- ADSK=0;
- if(ADDO)Count++;
- }
- ADSK=1; //发送第25个脉冲,表示下次转换使用A通道128db
- // Count=Count^0x800000;
- ;
- ADSK=0;
- /* if((Count & 0x800000) == 0x800000)
- {
- Count = ~(Count - 1);
- } */
- // ADval = (int)(Count >> 8);//取高十六位有效值
- ADval = (int)(Count>>8);
- // ADDO=1;
- return(ADval);
- }
- /**********************************************************
- AD采样处理——算术平均数字滤波
- **********************************************************/
- unsigned long Sampling(void)
- {
- unsigned int Sam[12],tmpmax,tmpmin,sum=0,Average;
- unsigned char i;
-
- for(i=0;i<12;i++)
- {
- Sam[i]=ReadCount();
- if(i==0)
- {
- tmpmax=Sam[0];
- tmpmin=Sam[0];
- }
- if(i>0)
- {
- if(Sam[i]>tmpmax)tmpmax=Sam[i];
- if(Sam[i]<tmpmin)tmpmin=Sam[i];
- }
- }
- for(i=0;i<12;i++)
- {
- if(!(Sam[i]==tmpmax||Sam[i]==tmpmin))
- {
- sum=sum+Sam[i];
- }
- }
- Average=sum/10;
- return(Average);
- }
- /**********************************************************
- 重量值数码管显示子程序
- **********************************************************/
- void displayheight(void)
- {
- unsigned int Lheight;
- float Tempheight;
- unsigned char i,j,height[2],discode[4];
-
- // while(1)
- {
- Lheight = ReadCount()-1500;
- if(Lheight<0)Lheight=0;
- Tempheight=(float)(Lheight/1.4);
- Lheight=(int)(Tempheight);
-
- /* discode[0]=Lheight%16;
- discode[1]=(Lheight%256)/16;
- discode[2]=(Lheight%4096)/256;
- discode[3]=(Lheight%65536)/4096; */
-
- // tmp10=discode[3]*4096+discode[2]*256+discode[1]*16+discode[0];
- discode[0]=Lheight%10;
- discode[1]=(Lheight%100)/10;
- discode[2]=(Lheight%1000)/100;
- discode[3]=(Lheight%10000)/1000;
- for(j=0;j<250;j++)
- {
- for(i=0;i<4;i++)
- {
- if(i==0){led1=0;led2=1;led3=1;led4=1;}
- if(i==1){led1=1;led2=0;led3=1;led4=1;}
- if(i==2){led1=1;led2=1;led3=0;led4=1;}
- if(i==3){led1=1;led2=1;led3=1;led4=0;}
- P0 = disp_code[discode[i]];
- delayms(2);
- }
- }
- led1=1;led2=1;led3=1;led4=1;
- Lheight=0;
- }
- }
- /**********************************************************
- 主函数
- **********************************************************/
- void main(void)
- {
- // unsigned long Lheight;
- unsigned char i;
- P2 = 0x0f; //数码管初始显示"-"
- P1 = 0xff;
- P0 = 0xbf;
- while (1)
- {
- displayheight();
- /* for(i=0;i<4;i++)
- {
- P2 = seg[i];
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
程序.rar
(1.41 KB, 下载次数: 43)
|