在使用proteus仿真HX711模块,使用stm32单片机控制的过程中,遇到了很多的问题。

首先网站上很少使用原始模块的,然后就是很多都使用51,因此,本人踩了不少坑。

现在打算记录一下,至少能够正常显示了,以后有问题再慢慢修改。

首先,硬件电路,一定要记得是5V供电,然后VFB引脚的电阻记得修改成一个20k,一个8.2k。,

DOUT、PD_SCK只需配置通用io口即可。

下面是初始化函数:(标准库)

void HX711_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
    
    // 配置HX711引脚
    // PC0: DOUT (输入)
    // PC1: PD_SCK (输出) 
	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 下拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    // 4. 初始化HX711时钟线为低电平
    GPIO_ResetBits(GPIOC, GPIO_Pin_1);
}

然后就是激动人心的称重函数!

int32_t HX711_Read_Weight(void)
{
    uint32_t data = 0;
    uint8_t i;
    HX711_SCK_CLR();
 

		for (i = 0; i < 24; i++)
    {
			  HX711_SCK_SET();    // 时钟上升沿
        HX711_Delay();
        data <<= 1;  			// 左移一位
			  HX711_SCK_CLR();
        if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0))
        {
            data++;
        }
            // 时钟下降沿
        HX711_Delay();
    }
    HX711_SCK_SET();
		HX711_Delay(); 
		data = data^0x00800000; // 如果是负数(最高位为1)
		HX711_SCK_CLR();
		HX711_Delay();
    
    return (int32_t)data;
}

至此,已经可以显示在LCD屏幕上了。

主函数:

float current_weight;
char weight_buffer[16]; 
LCD1602_Init();
	  HX711_Init();
	  while(1){
		current_weight=HX711_Read_Weight();
	  sprintf(weight_buffer, "W:%.2fg", current_weight/83886.08);  // 纯数字
		LCD1602_Show_Str(7, 1, weight_buffer);
		delay_ms(100); }

ok,睡觉

更多推荐