久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17125|回復: 25
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
具體看附件了,注釋寫的很細。
有個小BUG,重新上電LCD只開背光無顯示。對調試無大影響,不影響稱重部分。估計是由于delay頭文件的問題,不建議折騰。


STM32單片機源程序如下:
  1. //傳感器用的是8Kg  2.0mV/V的如果其它規格,更改轉換公式即可。
  2. //檢測參數通過串口發送的電腦。
  3. //可以做程序在電腦上直接顯示。
  4. //串口選用USART1
  5. //PB11接HX711數據口浮空輸入
  6. //PB12接HX711CLK
  7. //PA11為測試程序時用過的。可刪除
  8. //HX711輸入電子稱電壓調稱為22K 10K 調壓為4V輸出
  9. //輸出結果最后一位為0.1g

  10. //我們的傳感器50kg,靈敏度1mv/v
  11. //HX711模塊R1=20k歐,R2=8.2k歐,所以HX711給傳感器供電電壓為(20+8.2)/8.2*1.25=4.3V,注意萬用表測得會比這個值低,模塊為了降低功耗只在采樣時會用到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. //----------------函數聲明--------------------
  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   //執行主函數之前的調試函數,不影響最終的release版

  49.     //------------初始化------------下面三個初始化
  50.         delay_init();
  51.         LCD_Init();
  52.     RCC_Configuration();//RCC指時鐘控制預分頻器
  53.     GPIO_Configuration();//初始化GPIO口狀態
  54.     USART_Configuration( );  //初始化串口配置
  55.        
  56.         //uart_init(9600);                 //串口初始化為9600
  57.        
  58.                 POINT_COLOR=RED;//設置字體為紅色
  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;//設置字體為藍色
  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)  //恒運行下面的程序
  68.     {
  69.         Delay_MS(1000);//延時1s,可能是為了等讀數穩定(這個延時是為了穩定,也可以留時間濾波)
  70.         
  71.                 adcx=filter();//adcx值由這個子函數讀出,這個數需要由下面兩句轉kg值
  72.                 adcx=8388608-adcx;
  73.                 LCD_ShowxNum(156,130,adcx,8,16,0);//顯示ADC轉換后的24位二進制數轉十進制數值
  74.                
  75.                 adcx=adcx/100;//為節省運算量,將AD值固定縮小100倍
  76.                 weight=(float)adcx/429.496+0.005;  //實際用的時候需要調試,429.496由于傳感器差異這個系數一般在400到500之間,加0.005是為了四舍五入
  77.                 adcx=weight;
  78.                 LCD_ShowxNum(156,150,adcx,3,16,0);//顯示重量值整數部分
  79.         
  80.                 weight-=adcx;
  81.                 weight*=1000;
  82.                 LCD_ShowxNum(188,150,weight,3,16,0X80);//顯示重量值小數部分
  83.                
  84.                
  85.         //GPIO_SetBits(GPIOA,GPIO_Pin_11);   //沒看懂,大概是對PA11進行設置,但不清楚作什么設置  從后面推敲應該set置1,reset置0           
  86.         //printf("%d\n",weight);   //打印weight值,串口調試用的       
  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)    //重復定義。。!問題已解決,在delay.c中注釋掉該定義
  103. {
  104.     u16 i;
  105.     for(i=dly1;i>0;i--);    //這個延時函數的作用是延時dly1個微秒,但這個延時器用來干嘛不清楚
  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芯片輸出的數據。
  115. {
  116.         unsigned long val = 0; //long型32位
  117.         unsigned char i = 0;               
  118.                                           //DOUT指串行數據輸出,SCK指的是PD_SCK串行時鐘輸入
  119.         GPIO_SetBits(GPIOB,GPIO_Pin_11);    //DOUT=1 ,PB11接HX711數據口浮空輸入,還是不懂什么叫浮空輸入,但是連線的話把HX711的數據線口接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執行下面
  123.     for(i=0;i<24;i++)
  124.         {
  125.                 GPIO_SetBits(GPIOB,GPIO_Pin_12);    //SCK=1
  126.                 val=val<<1; //左移1位,右補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. //下面這個濾波函數是一個去最大最小后取平均的函數,要使用它,需要將前面的延時1us改為5us,增大采樣時間。
  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);        //使能外部的高速時鐘
  189.         while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);        //等待外部高速時鐘使能就緒
  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.         //---------打開相應外設時鐘--------------------
  201.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);        //使能APB2外設的GPIOA的時鐘        
  202.                   //開啟串口時鐘
  203.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  204.                  
  205. }

  206. /*******************************************************************************
  207. * Function Name  : GPIO_Configuration
  208. * Description    : 初始化GPIO外設
  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;                //聲明一個結構體變量

  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為復合推挽輸出
  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    : 設置串口USART1
  248. * Input          : ch,*f
  249. * Output         : None
  250. * Return         : None
  251. *******************************************************************************/
  252. void USART_Configuration(void)
  253. {
  254.           //串口配置: 波特率 115200 數據位 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.   //啟動串口
  264.   USART_Cmd(USART1, ENABLE);
  265. }
  266. /*******************************************************************************
  267. * Function Name  : fputc
  268. * Description    : 重定向這個C庫(stdio)printf函數  文件流——》串口USART1
  269. * Input          : ch,*f
  270. * Output         : None
  271. * Return         : None
  272. *******************************************************************************/
  273. int fputc(int ch, FILE *f)     //fputc重復定義!。。∫呀鉀Q

  274. {

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

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

  277. return (ch);

  278. }

  279. // 接收數據

  280. int GetKey (void) {

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

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

  283. }


復制代碼

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


評分

參與人數 1黑幣 +5 收起 理由
我是輝大爺 + 5 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:88606 發表于 2017-12-4 12:59 | 只看該作者
下載學習。!
回復

使用道具 舉報

板凳
ID:288218 發表于 2018-3-9 15:38 | 只看該作者
求轉發源碼給我學習,剛進來下載不了。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:302252 發表于 2019-1-25 15:26 | 只看該作者
相互學習!
回復

使用道具 舉報

10#
ID:508986 發表于 2019-4-10 18:16 | 只看該作者
學習學習!!
回復

使用道具 舉報

11#
ID:340302 發表于 2019-4-29 15:58 | 只看該作者
能調試出嘛
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

14#
ID:542393 發表于 2019-5-19 21:50 | 只看該作者
下載學習
回復

使用道具 舉報

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

使用道具 舉報

16#
ID:328121 發表于 2019-7-18 11:29 | 只看該作者
下載學習,謝謝樓主
回復

使用道具 舉報

17#
ID:586345 發表于 2019-7-18 14:21 | 只看該作者
正在做電子秤,下載學習。
回復

使用道具 舉報

18#
ID:395676 發表于 2019-7-20 21:05 | 只看該作者
看不懂 也調試不出來想要的結果 5555
回復

使用道具 舉報

19#
ID:561918 發表于 2019-7-22 17:42 | 只看該作者
學習了。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

23#
ID:221571 發表于 2020-5-29 10:55 | 只看該作者
求轉發源碼給我學習,剛進來下載不了。
回復

使用道具 舉報

24#
ID:27482 發表于 2022-8-8 10:21 | 只看該作者
正在做電子秤,下載學習。
回復

使用道具 舉報

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

使用道具 舉報

26#
ID:884711 發表于 2022-9-12 20:52 | 只看該作者
收藏,準備以后學習,謝謝分享!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美在线 | 久久免费大片 | 免费在线a视频 | 中文字幕亚洲精品在线观看 | 欧美在线不卡 | 国产精品久久久久久久午夜 | 日日爱夜夜操 | 成人性视频免费网站 | 日韩在线一区二区三区 | 自拍偷拍亚洲欧美 | 国产精品毛片一区二区在线看 | 久久尤物免费一区二区三区 | 一区二区三区在线播放视频 | 国产激情偷乱视频一区二区三区 | 国产精品久久久久久久久久久久午夜片 | 影音先锋中文字幕在线观看 | 中文在线一区二区 | 欧美a区 | 婷婷色成人 | 欧美激情第一区 | 欧美日韩成人影院 | 久草资源在线视频 | 99免费在线 | 国内av在线 | 91精品国产91久久久久久 | 嫩草网| 涩涩视频在线观看 | 中文在线视频观看 | 免费看国产a | 久久精品中文 | 超碰网址 | 黄视频免费在线 | 性高朝久久久久久久3小时 av一区二区三区四区 | 日本精品一区二区在线观看 | 337p日本欧洲亚洲大胆 | 国产精品电影网 | 日本在线网址 | 国产成人精品免费 | 久草免费在线视频 | 蜜桃官网| 国产永久免费 |