ST零点 发表于 2014-7-7 17:35

HX711_dout不能被拉低 一直等待 求帮助

一直在这里等待

MOn51 发表于 2014-7-7 18:17

//                               参考C程序:
//************************************************************************
#include "USE.H"
#include "Ver.h"
//************************************************************************
extern void Delay10(void);
//************************************************************************
sbit Hx711_DAT1=P2^1;
sbit Hx711_CLK1=P2^0;                       //P0.24和P0.25
#define Hx711_BUSY        (Hx711_DAT1)
//************************************************************************
#define Hx711_DAT(x)        ((x>0) ? (Hx711_DAT1=1) : (Hx711_DAT1=0));        //设置1,0
#define Hx711_CLK(x)        ((x>0) ? (Hx711_CLK1=1) : (Hx711_CLK1=0));        //设置1,0
/******************************************************************
。管脚PD_SCK 输入用来控制HX711
的断电。当PD_SCK 为低电平时,芯片处于正常工作状态。
读取HX711的AD值,依次是A,B
PD_SCK 脉冲数输入通道       增益
25      A                128
26      B                64
27      A                64
******************************************************************/

//*****************************************************************
void Ready_HX711(void){
        Hx711_DAT(1);
        Hx711_CLK(0);
}
/**************************************************************
查询HX711是否转换完毕   Hx711_DAT=0
***************************************************************/
unsigned char Jb_HX711_OK(void){
        return Hx711_DAT1;                                       
}
/*****************************************************************************
//控制通道和增益
//flag=0 不改变通道
//flag=1 A通道128
//flag=2 B通道        64
//flag=3 A通道        64
*******************************************************************************/
unsigned long Rd_Hx711_A_64(unsigned char ch){
        unsigned long Count;
        unsigned char i;
        Count=0;
        for(i=0;i<24;i++){
                Count<<=1;
                Hx711_CLK(1);
                Hx711_CLK(0)
                if(Jb_HX711_OK())        Count++;
        }
        Hx711_CLK(1)
        Hx711_CLK(0);//必须变0

        Hx711_CLK(1)
        Hx711_CLK(0);//必须变0

        if(ch==0){           // A通道=0,必须加入!
                Hx711_CLK(1)
                Hx711_CLK(0);//必须变0
        }
        return(Count);
}
/*********************************************************************
补吗处理程序 ,返回电压值!uV
**********************************************************************/
float GetFloat_BuMa(unsigned long dat){
        #define MAX_REF                        (3300)//单位MV
        float u,f;

        f=1;                                        //正负号的处理               
        if(dat & 0x00800000l){         //是补吗
                dat=~(dat-1);
                dat &=0x00ffffffl;
                f=-1;
        }
        u=(float)dat*MAX_REF/0x00800000l/64;           //只有一半的数据
        u *=f;
        return u*1000;                        //必须是uV
}
//*********************************************************************
//计算累加和
//*********************************************************************
unsigned long Count_AD(unsigned long ad,unsigned char no){
        return (ad/no);
}
/**********************************************************************
启动AD返回=0 没有数据;=1数据可用!
***********************************************************************/
unsigned char GetHX711(float *u0,float *u1){
        #define MAX_HX711_No        32                //采集的次数
        static charA_B_CH=0;                        //2个通道的转换
        static unsigned long xdata ad_Hx711={0,0};
        static unsigned charn=0,m=0;                        //采集的次数
        unsigned long ad;
        float u;

        //************************************************
        if(m==1){           //首次切换通道!
                if (Jb_HX711_OK()==0){
                        m=2;
                        A_B_CH=0;
                        Rd_Hx711_A_64(0);//读取A通道!
                        //tDelay(3);
                }
        }
        //********************************************
        if(m==3){           //切换B通道!
                if (Jb_HX711_OK()==0){
                        m=2;
                        Rd_Hx711_A_64(1);//读取A通道!
                        //tDelay(3);
                }
        }
        //********************************************
        if (m==0){
                Ready_HX711();        //首次上电先初始化HX711
                m=1;
        }
        //*********************************************
        //转化完毕则采集
        if(m ==2){
                if (Jb_HX711_OK()==0){
                        ad_Hx711 +=Rd_Hx711_A_64(A_B_CH);//读取A,B通道!
                        //***************************************************
                        if(++n >=MAX_HX711_No){
                                n=0;
                                //*************************************************
                                //计算AD值
                                ad=Count_AD(ad_Hx711,MAX_HX711_No);
                                ad_Hx711=0;                                  //清除原数据
                                //*************************************************
                                u=GetFloat_BuMa(ad);                         //补码数据处理
                                //*************************************************
                                if(A_B_CH==0) *u0=u;
                                if(A_B_CH==1) *u1=u; //传出数据
                                //*************************************************
                                A_B_CH = (++A_B_CH)%2;                                //切换
                                //必须从新切换通道!等待稳定!
                                if(A_B_CH==1)         m=3;//读取B通道!
                                if(A_B_CH==0){
                                        m=0;                                       
                                       return 1;                        //2个通道全部测量完毕 数据可用
                                }       
                        }
                }
        }
        return 0;
}
//***************************************************************
//计算数据
void CountAdData(float u,unsigned char ch){
        float u0;
        u0=Mp1.Pt.a*u+Mp1.Pt.b;
        //************************************
        //y=kx+b-->y=ax+b
        //************************************
        if(u0>AdData.Max) AdData.Max=u0;
        if(u0<AdData.Min) AdData.Min=u0;
        //************************************
        AdData.SUM +=u0;                                                         //计算累加值
        AdData.Mont = u0;                                                        //瞬时值!
        AdData.cnt++;                                                                //次数加一!
}
//****************************************************************
//标定AD转换的数据
unsigned charGetHx711Data(void){
        static float u0,u1;

        if(0==GetHX711(&u0,&u1)) return 0;
        //************************************
        //y=kx+b-->y=ax+b
        //************************************
        CountAdData(u0,0);
        CountAdData(u1,1);
        return 1;
}
//****************************************************************
//通讯完毕后,必须清空原来的参数
//****************************************************************
void ClrAdData(void){
        memset((unsigned char *)&AdData,0,sizeof(AD_DATA));
        memset((unsigned char *)&AdData,0,sizeof(AD_DATA));
        AdData.Max=AD_MIN;
        AdData.Max=AD_MIN;
        AdData.Min=AD_MAX;
        AdData.Min=AD_MAX;
}
//**********************************************************************
//ad采集
//**********************************************************************
void Get_Ad_Data(void){
       
        if(1==GetHx711Data()){ //采集完后返回1
                Wr_IAP_AD();        //写入EEROM
                Turn_PT_ON (OFF);
                Turn_AD_ON (OFF);
                LedMenu.Power=PWR_WAKEUP;        //等待               
//                Led_ON(1);
        }
}



MOn51 发表于 2014-7-7 18:17

这是正常使用的代码。希望有用。

xyz769 发表于 2014-7-7 21:32

楼主看错文档了,SCK才会被拉低,不是DOUT!

ST零点 发表于 2014-7-8 09:28

xyz769 发表于 2014-7-7 21:32 static/image/common/back.gif
楼主看错文档了,SCK才会被拉低,不是DOUT!

但是这条语句怎么办? while(hx711_dout); 跳转不出去。

ST零点 发表于 2014-7-8 09:29

#include "HX711.h"


//****************************************************
//延时函数
//****************************************************
void Delay__hx711_us(void)
{
        _nop_();
        _nop_();
}

//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)        //增益128
{
        unsigned long count;
        unsigned char i;
        HX711_DOUT=1;
        Delay__hx711_us();
        HX711_SCK=0;
        count=0;
        while(HX711_DOUT);
        for(i=0;i<24;i++)
        {
                  HX711_SCK=1;
                  count=count<<1;
                HX711_SCK=0;
                  if(HX711_DOUT)
                        count++;
        }
        HX711_SCK=1;
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
        Delay__hx711_us();
        HX711_SCK=0;
        return(count);
}

ST零点 发表于 2014-7-8 09:34

MOn51 发表于 2014-7-7 18:17 static/image/common/back.gif
这是正常使用的代码。希望有用。

嗯嗯谢谢诶:P

ayb_ice 发表于 2014-7-8 09:36

主程序的那个goto好猛啊

ST零点 发表于 2014-7-8 10:39

ayb_ice 发表于 2014-7-8 09:36 static/image/common/back.gif
主程序的那个goto好猛啊

能走到主程序那里了? 好厉害怎么做到的? 为什么我一直在 数据转换那里

ST零点 发表于 2014-7-8 10:44

ST零点 发表于 2014-7-8 10:39 static/image/common/back.gif
能走到主程序那里了? 好厉害怎么做到的? 为什么我一直在 数据转换那里 ...

在线等啊急求

ST零点 发表于 2014-7-9 11:15

@51armfpga :lol帮我看看呗

ST零点 发表于 2014-7-9 11:16

@21ic小跑堂 帮我看看呗 :lol

ST零点 发表于 2014-7-9 11:17

@21小跑堂

xyz549040622 发表于 2014-7-9 11:36

ST零点 发表于 2014-7-9 11:17 static/image/common/back.gif
@21小跑堂

:lol小跑堂还有这个作用,哈哈

xyz549040622 发表于 2014-7-9 11:37

Dout拉高后会自动拉低的,如果你的程序一直在哪里执行,请检查硬件

ST零点 发表于 2014-7-9 15:20

xyz549040622 发表于 2014-7-9 11:37 static/image/common/back.gif
Dout拉高后会自动拉低的,如果你的程序一直在哪里执行,请检查硬件

我也感觉是硬件出了问题。 那这样子的话就必须要重新做下硬件了啊?怎么确定HX711模块没有采集到数据呢

ST零点 发表于 2014-7-9 15:21

xyz549040622 发表于 2014-7-9 11:36 static/image/common/back.gif
小跑堂还有这个作用,哈哈

原谅我的@@@xyz549040622

ST零点 发表于 2014-7-9 15:24

while(HX711_DOUT); //问题就出在这条语句了   一直不能被拉低所以这个函数unsigned long HX711_Read(void)不能正常执行,然后直接导致重量传感器的数据不能被采集到。。。

xyz549040622 发表于 2014-7-9 15:28

ST零点 发表于 2014-7-9 15:20 static/image/common/back.gif
我也感觉是硬件出了问题。 那这样子的话就必须要重新做下硬件了啊?怎么确定HX711模块没有采集到数据呢 ...

只好读数据看了

ST零点 发表于 2014-7-10 11:09

xyz549040622 发表于 2014-7-9 15:28 static/image/common/back.gif
只好读数据看了

怎么读数据 还望版主大人指教。。。我是菜鸟。。。
页: [1] 2 3
查看完整版本: HX711_dout不能被拉低 一直等待 求帮助