大佬們,上面是.c文件和main.c文件,接線我檢查過了沒有問題,就是不知道為什么OLED上面顯示一直是9316g如圖1,數據不變嗚嗚
圖片可以看檢查到我的接線~(圖4就手捏著的四根線接HX711)球球大家幫我康康
1
2
3
4
- ***********main.c********************************************************************************************
- #include "stm32f10x.h"
- #include "Delay.h"
- #include "HX711.h"
- #include "OLED.h"
- #include "NVIC.h"
- #include "key.h"
- u32 zong=0; //總的飲水量
- u8 gongzuo_status=1;//檢測狀態,0的時候不檢測,1的時候檢測
- /*
- KEY0的作用是初始化稱重目標,比如按下KEY0就代表此時的重量成了我們還沒喝水時候的重量
- KEY1的作用是累加飲水量,按一下保存當前的飲水量,然后按下KEY0繼續開始繼續檢測
- */
- int main(void)
- {
- u8 key=0; //定義按鍵掃描狀態
- HX711_Init(); //HX711傳感器初始化
- Key_Init(); //按鍵初始化
- //delay_init(); //延時初始化
- SysTick_Delay_Init();
- User_NVIC_Config(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- //uart_init(9600); //串口初始化為9600
- OLED_Init();
- Get_Maopi(); //稱取初始化狀態,此狀態下可獲得最開始的值
- Delay_ms(1000);
- Get_Maopi(); //重新獲取初始化狀態
-
- OLED_ShowString(1, 1, "Wei:");
- OLED_ShowString(1, 9, "g");
- OLED_ShowString(2, 1, "zon:");
- OLED_ShowString(2, 9, "g");
- OLED_ShowString(3, 1, "swu:");
- OLED_ShowString(3, 9, "g");
- while(1)
- {
- key=Key_GetNum();//毛皮KEY0-(key=0)-B10,KEY1-key=1-B11,
- if(key==0) //判斷KEY0按鍵按下
- {
- Delay_ms(20);
- if(key==0)
- {
- Get_Maopi(); //設置當前重量為初始重量(毛皮重量)
- zong=0; //清空飲水量,重新進行計算
- gongzuo_status=1;
- }
- }
- else if(key==1)//判斷KEY1按鍵按下
- {
- Delay_ms(20);
- if(key==1)
- {
- zong+=Weight_Shiwu;//設置當前飲水量給總體//a+=b就是a=a+b
- gongzuo_status=0; //工作狀態為0
- }
- }
- else if(key==2)//判斷KEY2按鍵按下
- {
- Delay_ms(20);
- if(key==2)
- {
- Get_Maopi(); //設置當前重量為初始重量
- gongzuo_status=1; //工作狀態為1
- }
- }
-
- if(gongzuo_status==0)
- {Weight_Shiwu=0; } //如果工作狀態為0,則檢測到的飲水量一直為0
-
- else Get_Weight(); //如果工作狀態為1,則檢測飲水量大小
- OLED_ShowNum(1,5,(zong+Weight_Shiwu),4); //打印總水量
- OLED_ShowNum(2,5,zong-7296,4); //打印總水量
- OLED_ShowNum(3,5,Weight_Shiwu,4); //打印總水量
- Delay_ms(1000);
- }
- }
復制代碼- *******************HX711.C**********************************************************************************
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- u32 HX711_Buffer;
- u32 Weight_Maopi;
- s32 Weight_Shiwu;
- u8 Flag_Error=0;
- //校準參數
- //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
- //當發現測試出來的重量偏大時,增加該數值。
- //如果測試出來的重量偏小時,減小改數值。
- //該值可以為小數
- #define GapValue 900
- #define HX711_DOUT GPIO_Pin_12
- void HX711_Init(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口時鐘
- GPIO_InitTypeDef GPIO_InitStructure;
- //HX711_SCK
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB
-
- //HX711_DOUT
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //輸入上拉
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_13); //初始化設置為0
- }
- u32 HX711_Read(void) //增益128
- {
- unsigned long count=0;
- unsigned char i=0;
- //當數據輸出管腳DT為高電平,AD轉化器還未準備好,此時SCK為低電平,因此先對管腳電平進行初始化
-
- GPIO_SetBits(GPIOB,GPIO_Pin_12);//HX711_DOUT=1;
- Delay_us(1);
- GPIO_ResetBits(GPIOB,GPIO_Pin_13);//HX711_SCK=0;
- Delay_us(1);
-
- while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0);
- for(i=0;i<24;i++)
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_13);//HX711_SCK=1;
- count=count<<1; //DT左移一位
- Delay_us(1);
- GPIO_ResetBits(GPIOB,GPIO_Pin_13);//HX711_SCK=0;
- Delay_us(1);
- if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1)
- {
- count++;
- }
- Delay_us(1);
- }
-
- GPIO_SetBits(GPIOB,GPIO_Pin_13);//HX711_SCK=1;
- count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
- Delay_us(1);
- GPIO_ResetBits(GPIOB,GPIO_Pin_13); //HX711_SCK=0;
- Delay_us(1);
- return count;
- }
- void Get_Maopi(void)
- {
- Weight_Maopi = HX711_Read();
- }
- //****************************************************
- //稱重
- //****************************************************
- void Get_Weight(void)
- {
- HX711_Buffer = HX711_Read();
- if(HX711_Buffer <= Weight_Maopi)
- {
- Weight_Shiwu = 0;
- Weight_Shiwu = Weight_Maopi-Weight_Shiwu; //獲取實物的AD采樣數值。
- Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); //計算實物的實際重量
- //因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的GapValue這個除數。
- //當發現測試出來的重量偏大時,增加該數值。
- //如果測試出來的重量偏小時,減小改數值。
- }
- }
- //void Get_Weight2(void)
- //{
- // Weight_Shiwu =HX711_Read()/GapValue;
- //if(Weight_Shiwu>=Weight_Maopi)
- // {
- // Weight_Shiwu=Weight_Shiwu-Weight_Maopi;
- // Weight_Shiwu -= 18305;
- // if(Weight_Shiwu < 0 )
- // Weight_Shiwu = 0;
- // }
- //else
- // Weight_Shiwu = 0;
- //}
復制代碼 |