#include "hx711.h" #include "gpio.h" uint32 hx711_last_read_value[10]; void hx711_init() { gpio_mode(HX711_DT_PIN, GPIO); // 设置DT引脚为推挽输出 gpio_mode(HX711_SCK_PIN, GPIO); // 设置SCK引脚为推挽输出 gpio_set_level(HX711_SCK_PIN, 0); // 初始化SCK为低电平 gpio_set_level(HX711_DT_PIN, 1); // 初始化DT为高电平 } uint32 hx711_read_set(HX711_ch_enum next_ch,uint8 avg_times) { uint32 result = 0; uint8 i; if(avg_times > 10) /* 限制平均次数最大值为10 */ { avg_times = 10; } gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平开始读数据 */ gpio_set_level(HX711_DT_PIN, 1); /* 确保DT高电平,等待HX711准备好数据 */ while(gpio_get_level(HX711_DT_PIN) == 1); /* 等待HX711准备好数据 */ for(i = 0; i < 24; i++) { gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */ result <<= 1; /* 左移一位 */ if(gpio_get_level(HX711_DT_PIN) == 1) { result |= 0x01; /* 如果DT为高电平,设置最低位为1 */ } gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */ } for(i = 0; i < next_ch; i++) { gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */ _nop_(); _nop_(); gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */ } for(i = 0; i < 9; i++) { hx711_last_read_value[i] = hx711_last_read_value[i + 1]; /* 将之前的读取值向前移动 */ } hx711_last_read_value[9] = result; /* 将当前读取的值存入最后一个位置 */ result = 0; for(i = 0; i < avg_times; i++) { result += hx711_last_read_value[i]/avg_times; /* 累加读取的值 */ } return result; /* 返回读取到的数据 */ } uint8 hx711_single_read_non_blocking(HX711_ch_enum next_ch) { uint32 result = 0; uint8 i; gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平开始读数据 */ gpio_set_level(HX711_DT_PIN, 1); /* 确保DT高电平,等待HX711准备好数据 */ if(gpio_get_level(HX711_DT_PIN) == 1) { return 0; /* 如果DT为高电平,表示HX711未准备好数据 */ } for(i = 0; i < 24; i++) { gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */ result <<= 1; /* 左移一位 */ if(gpio_get_level(HX711_DT_PIN) == 1) { result |= 0x01; /* 如果DT为高电平,设置最低位为1 */ } gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */ } for(i = 0; i < next_ch; i++) { gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */ _nop_(); _nop_(); gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */ } for(i = 0; i < 9; i++) { hx711_last_read_value[i] = hx711_last_read_value[i + 1]; /* 将之前的读取值向前移动 */ } hx711_last_read_value[9] = result; /* 将当前读取的值存入最后一个位置 */ return 1; }