找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 17288|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

STM32與HX711作200KG電子秤源碼 帶詳細(xì)注釋

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
具體看附件了,注釋寫的很細(xì)。
有個(gè)小BUG,重新上電LCD只開(kāi)背光無(wú)顯示。對(duì)調(diào)試無(wú)大影響,不影響稱重部分。估計(jì)是由于delay頭文件的問(wèn)題,不建議折騰。


STM32單片機(jī)源程序如下:
  1. //傳感器用的是8Kg  2.0mV/V的如果其它規(guī)格,更改轉(zhuǎn)換公式即可。
  2. //檢測(cè)參數(shù)通過(guò)串口發(fā)送的電腦。
  3. //可以做程序在電腦上直接顯示。
  4. //串口選用USART1
  5. //PB11接HX711數(shù)據(jù)口浮空輸入
  6. //PB12接HX711CLK
  7. //PA11為測(cè)試程序時(shí)用過(guò)的�?蓜h除
  8. //HX711輸入電子稱電壓調(diào)稱為22K 10K 調(diào)壓為4V輸出
  9. //輸出結(jié)果最后一位為0.1g

  10. //我們的傳感器50kg,靈敏度1mv/v
  11. //HX711模塊R1=20k歐,R2=8.2k歐,所以HX711給傳感器供電電壓為(20+8.2)/8.2*1.25=4.3V,注意萬(wàn)用表測(cè)得會(huì)比這個(gè)值低,模塊為了降低功耗只在采樣時(shí)會(huì)用到4.3輸出電壓
  12. /*Include---------------------------*/
  13. #include <stm32f10x.h>                //包含所有的頭文件
  14. #include <stdio.h>
  15. #include "sys.h"
  16. #include "usart.h"
  17. #include "lcd.h"
  18. //#include "adc.h"
  19. //#include "led.h"
  20. //#include "delay.h"

  21. //----------------函數(shù)聲明--------------------
  22. void Delay_MS(u16 dly);
  23. void delay_us(u16 dly1);
  24. void RCC_Configuration(void);
  25. void GPIO_Configuration(void);
  26. unsigned long Read_HX711(void);
  27. void USART_Configuration(void);
  28. int fputc(int ch,FILE *f);
  29. int GetKey (void);
  30. long double filter(void);
  31. USART_InitTypeDef USART_InitStructure;
  32. ErrorStatus HSEStartUpStatus;


  33. //void u32tostr(unsigned long dat,char *str) ;

  34. /*******************************************************************************
  35. * Function Name  : main
  36. * Description    : Main program.
  37. * Input          : None
  38. * Output         : None
  39. * Return         : None
  40. *******************************************************************************/
  41. int main(void)
  42. {

  43.     u32 adcx;
  44.         float weight;
  45.         
  46.         #ifdef DEBUG
  47.     debug();
  48.     #endif   //執(zhí)行主函數(shù)之前的調(diào)試函數(shù),不影響最終的release版

  49.     //------------初始化------------下面三個(gè)初始化
  50.         delay_init();
  51.         LCD_Init();
  52.     RCC_Configuration();//RCC指時(shí)鐘控制預(yù)分頻器
  53.     GPIO_Configuration();//初始化GPIO口狀態(tài)
  54.     USART_Configuration( );  //初始化串口配置
  55.        
  56.         //uart_init(9600);                 //串口初始化為9600
  57.        
  58.                 POINT_COLOR=RED;//設(shè)置字體為紅色
  59.             LCD_ShowString(60,50,200,16,16,"Mini STM32");       
  60.                 LCD_ShowString(60,70,200,16,16,"WEIGHT SCALE");       
  61.                 LCD_ShowString(60,90,200,16,16,"ZHILV@EIGER");
  62.                 LCD_ShowString(60,110,200,16,16,"2017/11/25");       

  63.                 POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
  64.                 LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");       
  65.                 LCD_ShowString(60,150,200,16,16,"ADC_CH1_WEI:000.000kg");                        
  66.                
  67.         while(1)  //恒運(yùn)行下面的程序
  68.     {
  69.         Delay_MS(1000);//延時(shí)1s,可能是為了等讀數(shù)穩(wěn)定(這個(gè)延時(shí)是為了穩(wěn)定,也可以留時(shí)間濾波)
  70.         
  71.                 adcx=filter();//adcx值由這個(gè)子函數(shù)讀出,這個(gè)數(shù)需要由下面兩句轉(zhuǎn)kg值
  72.                 adcx=8388608-adcx;
  73.                 LCD_ShowxNum(156,130,adcx,8,16,0);//顯示ADC轉(zhuǎn)換后的24位二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù)值
  74.                
  75.                 adcx=adcx/100;//為節(jié)省運(yùn)算量,將AD值固定縮小100倍
  76.                 weight=(float)adcx/429.496+0.005;  //實(shí)際用的時(shí)候需要調(diào)試,429.496由于傳感器差異這個(gè)系數(shù)一般在400到500之間,加0.005是為了四舍五入
  77.                 adcx=weight;
  78.                 LCD_ShowxNum(156,150,adcx,3,16,0);//顯示重量值整數(shù)部分
  79.         
  80.                 weight-=adcx;
  81.                 weight*=1000;
  82.                 LCD_ShowxNum(188,150,weight,3,16,0X80);//顯示重量值小數(shù)部分
  83.                
  84.                
  85.         //GPIO_SetBits(GPIOA,GPIO_Pin_11);   //沒(méi)看懂,大概是對(duì)PA11進(jìn)行設(shè)置,但不清楚作什么設(shè)置  從后面推敲應(yīng)該set置1,reset置0           
  86.         //printf("%d\n",weight);   //打印weight值,串口調(diào)試用的       
  87.         }               
  88. }

  89. /*******************************************************************************
  90. * Function Name  : Delay_Ms
  91. * Description    : delay 1 ms.
  92. * Input          : dly (ms)
  93. * Output         : None
  94. * Return         : None
  95. *******************************************************************************/
  96. void Delay_MS(u16 dly)
  97. {
  98.         u16 i,j;
  99.     for(i=0;i<dly;i++)
  100.     for(j=1000;j>0;j--);
  101. }

  102. void delay_us(u16 dly1)    //重復(fù)定義!�。�!問(wèn)題已解決,在delay.c中注釋掉該定義
  103. {
  104.     u16 i;
  105.     for(i=dly1;i>0;i--);    //這個(gè)延時(shí)函數(shù)的作用是延時(shí)dly1個(gè)微秒,但這個(gè)延時(shí)器用來(lái)干嘛不清楚
  106. }
  107. /*******************************************************************************
  108. * Function Name  : Read_HX711
  109. * Description    : Read weigh
  110. * Input          : None
  111. * Output         : None
  112. * Return         : None
  113. *******************************************************************************/

  114. unsigned long Read_HX711(void)  //讀HX711芯片輸出的數(shù)據(jù)。
  115. {
  116.         unsigned long val = 0; //long型32位
  117.         unsigned char i = 0;               
  118.                                           //DOUT指串行數(shù)據(jù)輸出,SCK指的是PD_SCK串行時(shí)鐘輸入
  119.         GPIO_SetBits(GPIOB,GPIO_Pin_11);    //DOUT=1 ,PB11接HX711數(shù)據(jù)口浮空輸入,還是不懂什么叫浮空輸入,但是連線的話把HX711的數(shù)據(jù)線口接STM的PB11口
  120.         GPIO_ResetBits(GPIOB,GPIO_Pin_12);    //SCK=0 ,PB12接HX711CLK

  121.         while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11));   //等待DOUT=0  
  122.     delay_us(1); //等1us執(zhí)行下面
  123.     for(i=0;i<24;i++)
  124.         {
  125.                 GPIO_SetBits(GPIOB,GPIO_Pin_12);    //SCK=1
  126.                 val=val<<1; //左移1位,右補(bǔ)0
  127.                 delay_us(1);  
  128.                 GPIO_ResetBits(GPIOB,GPIO_Pin_12);    //SCK=0
  129.                 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))   //DOUT=1
  130.                 val++;
  131.                 delay_us(1);
  132.         }

  133.         GPIO_SetBits(GPIOB,GPIO_Pin_12);
  134.         val=val^0x800000;//異或。
  135.         delay_us(1);
  136.         GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  137.         delay_us(1);  
  138.         return val;  
  139. }
  140. /*******************************************************************************
  141. * Function Name  : FILTER
  142. * Description    : 限幅中位均值濾波
  143. * Input          : None
  144. * Output         : None
  145. * Return         : None
  146. *******************************************************************************/

  147. //下面這個(gè)濾波函數(shù)是一個(gè)去最大最小后取平均的函數(shù),要使用它,需要將前面的延時(shí)1us改為5us,增大采樣時(shí)間。
  148. long double filter(void)  //?????ù?????¨·¨????????
  149. {
  150.         unsigned long max=0,min=0,SUM,BUF[12],Average;
  151.         int i=0;


  152.         for(i=0;i<12;i++)
  153.         {
  154.                 BUF[i]=Read_HX711();
  155.                 //printf("%ld\r\n",BUF);
  156.                 if(i==0)
  157.                 {
  158.                         max=BUF[0];
  159.                         min=BUF[0];
  160.                 }
  161.                 if(i>0)
  162.                 {
  163.                         if(BUF[i]>max) max=BUF[i];
  164.                         if(BUF[i]<min) min=BUF[i];
  165.                 }
  166.         }
  167.         for(i=0;i<12;i++)
  168.         {
  169.                 if(!(BUF[i]==max||BUF[i]==min))
  170.                 {
  171.                         SUM=SUM+BUF[i];       
  172.                 }
  173.         }
  174.         Average=SUM/(12-2);
  175.         return Average;

  176. }
  177. /*******************************************************************************
  178. * Function Name  : RCC_Configuration
  179. * Description    : Configures the different system clocks.
  180. * Input          : None
  181. * Output         : None
  182. * Return         : None
  183. *******************************************************************************/
  184. void RCC_Configuration(void)
  185. {
  186.         //----------使用外部RC晶振-----------
  187.         RCC_DeInit();                        //初始化為缺省值
  188.         RCC_HSEConfig(RCC_HSE_ON);        //使能外部的高速時(shí)鐘
  189.         while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);        //等待外部高速時(shí)鐘使能就緒
  190.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   
  191.     FLASH_SetLatency(FLASH_Latency_2);
  192.         RCC_HCLKConfig(RCC_SYSCLK_Div1);                //HCLK = SYSCLK
  193.         RCC_PCLK2Config(RCC_HCLK_Div1);                        //PCLK2 =  HCLK
  194.         RCC_PCLK1Config(RCC_HCLK_Div2);                        //PCLK1 = HCLK/2
  195.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);        //PLLCLK = 8MHZ * 9 =72MHZ
  196.         RCC_PLLCmd(ENABLE);                        //Enable PLLCLK

  197.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);        //Wait till PLLCLK is ready
  198.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //Select PLL as system clock
  199.         while(RCC_GetSYSCLKSource()!=0x08);                //Wait till PLL is used as system clock source        
  200.         //---------打開(kāi)相應(yīng)外設(shè)時(shí)鐘--------------------
  201.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);        //使能APB2外設(shè)的GPIOA的時(shí)鐘        
  202.                   //開(kāi)啟串口時(shí)鐘
  203.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  204.                  
  205. }

  206. /*******************************************************************************
  207. * Function Name  : GPIO_Configuration
  208. * Description    : 初始化GPIO外設(shè)
  209. * Input          : None
  210. * Output         : None
  211. * Return         : None
  212. *******************************************************************************/
  213. void GPIO_Configuration(void)
  214. {
  215.         //CLK:PB5  CLR:PE11  Data:PE10
  216.         GPIO_InitTypeDef        GPIO_InitStructure;                //聲明一個(gè)結(jié)構(gòu)體變量

  217.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;         //選擇PC.10(TXD) 和 PC.11
  218.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管腳頻率為50MHZ
  219.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;         //輸出模式為推挽輸出
  220.         GPIO_Init(GPIOB,&GPIO_InitStructure);                                 //初始化PB5

  221.            //配置USART1_Tx為復(fù)合推挽輸出
  222.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  223.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  224.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  225.           GPIO_Init(GPIOA, &GPIO_InitStructure);
  226.         
  227.           //配置 USART1_Rx 為浮空輸入
  228.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  229.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  230.           GPIO_Init(GPIOA, &GPIO_InitStructure);

  231.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;         //選擇PC.10(TXD) 和 PC.11
  232.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //浮空輸入
  233.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度為50MHz
  234.         GPIO_Init(GPIOB,&GPIO_InitStructure);                                 //初始化PB5

  235.            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  236.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管腳頻率為50MHZ
  237.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
  238.         GPIO_Init(GPIOB,&GPIO_InitStructure);                                 //初始化PB5

  239.         
  240.            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;         //選擇PC.10(TXD) 和 PC.11
  241.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管腳頻率為50MHZ
  242.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
  243.         GPIO_Init(GPIOA,&GPIO_InitStructure);                                 //初始化PB5
  244. }
  245. /*******************************************************************************
  246. * Function Name  : USART_Configuration
  247. * Description    : 設(shè)置串口USART1
  248. * Input          : ch,*f
  249. * Output         : None
  250. * Return         : None
  251. *******************************************************************************/
  252. void USART_Configuration(void)
  253. {
  254.           //串口配置: 波特率 115200 數(shù)據(jù)位 8 停止位 1  奇偶位 NONE  
  255.   USART_InitStructure.USART_BaudRate = 9600;
  256.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  257.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  258.   USART_InitStructure.USART_Parity =  USART_Parity_No ;
  259.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  260.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  261.     //初始化串口
  262.   USART_Init(USART1, &USART_InitStructure);
  263.   //啟動(dòng)串口
  264.   USART_Cmd(USART1, ENABLE);
  265. }
  266. /*******************************************************************************
  267. * Function Name  : fputc
  268. * Description    : 重定向這個(gè)C庫(kù)(stdio)printf函數(shù)  文件流——》串口USART1
  269. * Input          : ch,*f
  270. * Output         : None
  271. * Return         : None
  272. *******************************************************************************/
  273. int fputc(int ch, FILE *f)     //fputc重復(fù)定義�。。�!已解決

  274. {

  275. USART_SendData(USART1, (unsigned char) ch);// USART1 可以換成 USART2 等

  276. while (!(USART1->SR & USART_FLAG_TXE));   //->指針,傳遞值的一種方式;!邏輯非;&邏輯與

  277. return (ch);

  278. }

  279. // 接收數(shù)據(jù)

  280. int GetKey (void) {

  281. while (!(USART1->SR & USART_FLAG_RXNE));

  282. return ((int)(USART1->DR & 0x1FF));

  283. }


復(fù)制代碼

所有資料51hei提供下載:
傳感器稱重及LCD顯.rar (352.37 KB, 下載次數(shù): 502)


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
我是輝大爺 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:88606 發(fā)表于 2017-12-4 12:59 | 只看該作者
下載學(xué)習(xí)�。�!
回復(fù)

使用道具 舉報(bào)

板凳
ID:288218 發(fā)表于 2018-3-9 15:38 | 只看該作者
求轉(zhuǎn)發(fā)源碼給我學(xué)習(xí),剛進(jìn)來(lái)下載不了。
回復(fù)

使用道具 舉報(bào)

地板
ID:394133 發(fā)表于 2018-9-5 16:50 | 只看該作者
備注的很詳細(xì),贊
回復(fù)

使用道具 舉報(bào)

5#
ID:427502 發(fā)表于 2018-11-16 08:59 | 只看該作者
發(fā)給HX711的脈沖過(guò)不去這是怎么回事
回復(fù)

使用道具 舉報(bào)

6#
ID:435906 發(fā)表于 2018-11-29 17:24 | 只看該作者
我正好需要這個(gè),非常感謝
回復(fù)

使用道具 舉報(bào)

7#
ID:397292 發(fā)表于 2018-12-1 18:57 | 只看該作者
謝謝大神分享
回復(fù)

使用道具 舉報(bào)

8#
ID:72576 發(fā)表于 2018-12-2 10:25 | 只看該作者
備注的很詳細(xì),贊
回復(fù)

使用道具 舉報(bào)

9#
ID:302252 發(fā)表于 2019-1-25 15:26 | 只看該作者
相互學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

10#
ID:508986 發(fā)表于 2019-4-10 18:16 | 只看該作者
學(xué)習(xí)學(xué)習(xí)�。�!
回復(fù)

使用道具 舉報(bào)

11#
ID:340302 發(fā)表于 2019-4-29 15:58 | 只看該作者
能調(diào)試出嘛
回復(fù)

使用道具 舉報(bào)

12#
ID:496304 發(fā)表于 2019-4-30 17:15 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

13#
ID:346927 發(fā)表于 2019-5-17 21:11 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:542393 發(fā)表于 2019-5-19 21:50 | 只看該作者
下載學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

15#
ID:448652 發(fā)表于 2019-6-28 08:11 | 只看該作者
多謝大神分享
回復(fù)

使用道具 舉報(bào)

16#
ID:328121 發(fā)表于 2019-7-18 11:29 | 只看該作者
下載學(xué)習(xí),謝謝樓主
回復(fù)

使用道具 舉報(bào)

17#
ID:586345 發(fā)表于 2019-7-18 14:21 | 只看該作者
正在做電子秤,下載學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

18#
ID:395676 發(fā)表于 2019-7-20 21:05 | 只看該作者
看不懂 也調(diào)試不出來(lái)想要的結(jié)果 5555
回復(fù)

使用道具 舉報(bào)

19#
ID:561918 發(fā)表于 2019-7-22 17:42 | 只看該作者
學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

20#
ID:379683 發(fā)表于 2019-8-7 09:40 | 只看該作者
資料很贊
回復(fù)

使用道具 舉報(bào)

21#
ID:611445 發(fā)表于 2019-9-14 16:33 | 只看該作者
感謝大佬
回復(fù)

使用道具 舉報(bào)

22#
ID:585435 發(fā)表于 2019-10-11 16:58 | 只看該作者
那個(gè)讀取HX711之后,為啥還要用8388608減去它
回復(fù)

使用道具 舉報(bào)

23#
ID:221571 發(fā)表于 2020-5-29 10:55 | 只看該作者
求轉(zhuǎn)發(fā)源碼給我學(xué)習(xí),剛進(jìn)來(lái)下載不了。
回復(fù)

使用道具 舉報(bào)

24#
ID:27482 發(fā)表于 2022-8-8 10:21 | 只看該作者
正在做電子秤,下載學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

25#
ID:977934 發(fā)表于 2022-8-18 17:04 | 只看該作者
直接下載,贊
回復(fù)

使用道具 舉報(bào)

26#
ID:884711 發(fā)表于 2022-9-12 20:52 | 只看該作者
收藏,準(zhǔn)備以后學(xué)習(xí),謝謝分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表