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

標題: STM32與HX711作200KG電子秤源碼 帶詳細注釋 [打印本頁]

作者: azd1997    時間: 2017-12-2 16:19
標題: STM32與HX711作200KG電子秤源碼 帶詳細注釋
具體看附件了,注釋寫的很細。
有個小BUG,重新上電LCD只開背光無顯示。對調試無大影響,不影響稱重部分。估計是由于delay頭文件的問題,不建議折騰。


STM32單片機源程序如下:
  1. //傳感器用的是8Kg  2.0mV/V的如果其它規(guī)格,更改轉換公式即可。
  2. //檢測參數(shù)通過串口發(fā)送的電腦。
  3. //可以做程序在電腦上直接顯示。
  4. //串口選用USART1
  5. //PB11接HX711數(shù)據口浮空輸入
  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. //----------------函數(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ù)之前的調試函數(shù),不影響最終的release版

  49.     //------------初始化------------下面三個初始化
  50.         delay_init();
  51.         LCD_Init();
  52.     RCC_Configuration();//RCC指時鐘控制預分頻器
  53.     GPIO_Configuration();//初始化GPIO口狀態(tài)
  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,可能是為了等讀數(shù)穩(wěn)定(這個延時是為了穩(wěn)定,也可以留時間濾波)
  70.         
  71.                 adcx=filter();//adcx值由這個子函數(shù)讀出,這個數(shù)需要由下面兩句轉kg值
  72.                 adcx=8388608-adcx;
  73.                 LCD_ShowxNum(156,130,adcx,8,16,0);//顯示ADC轉換后的24位二進制數(shù)轉十進制數(shù)值
  74.                
  75.                 adcx=adcx/100;//為節(jié)省運算量,將AD值固定縮小100倍
  76.                 weight=(float)adcx/429.496+0.005;  //實際用的時候需要調試,429.496由于傳感器差異這個系數(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);   //沒看懂,大概是對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--);    //這個延時函數(shù)的作用是延時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芯片輸出的數(shù)據。
  115. {
  116.         unsigned long val = 0; //long型32位
  117.         unsigned char i = 0;               
  118.                                           //DOUT指串行數(shù)據輸出,SCK指的是PD_SCK串行時鐘輸入
  119.         GPIO_SetBits(GPIOB,GPIO_Pin_11);    //DOUT=1 ,PB11接HX711數(shù)據口浮空輸入,還是不懂什么叫浮空輸入,但是連線的話把HX711的數(shù)據線口接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位,右補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. //下面這個濾波函數(shù)是一個去最大最小后取平均的函數(shù),要使用它,需要將前面的延時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 數(shù)據位 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函數(shù)  文件流——》串口USART1
  269. * Input          : ch,*f
  270. * Output         : None
  271. * Return         : None
  272. *******************************************************************************/
  273. int fputc(int ch, FILE *f)     //fputc重復定義。。!已解決

  274. {

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

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

  277. return (ch);

  278. }

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

  280. int GetKey (void) {

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

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

  283. }


復制代碼

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



作者: tt98    時間: 2017-12-4 12:59
下載學習。!
作者: chen0263    時間: 2018-3-9 15:38
求轉發(fā)源碼給我學習,剛進來下載不了。
作者: 52angle    時間: 2018-9-5 16:50
備注的很詳細,贊
作者: wangkun123    時間: 2018-11-16 08:59
發(fā)給HX711的脈沖過不去這是怎么回事
作者: qq459497878    時間: 2018-11-29 17:24
我正好需要這個,非常感謝
作者: loboko    時間: 2018-12-1 18:57
謝謝大神分享
作者: yubo2007    時間: 2018-12-2 10:25
備注的很詳細,贊
作者: jc235    時間: 2019-1-25 15:26
相互學習!
作者: 635808093    時間: 2019-4-10 18:16
學習學習!!
作者: a371403687    時間: 2019-4-29 15:58
能調試出嘛

作者: 白歌    時間: 2019-4-30 17:15
感謝分享
作者: irisice008    時間: 2019-5-17 21:11
感謝分享
作者: luluxiu    時間: 2019-5-19 21:50
下載學習
作者: r757613823    時間: 2019-6-28 08:11
多謝大神分享
作者: hellowC8051    時間: 2019-7-18 11:29
下載學習,謝謝樓主
作者: zhaojun_xf    時間: 2019-7-18 14:21
正在做電子秤,下載學習。
作者: 一顆糖    時間: 2019-7-20 21:05
看不懂 也調試不出來想要的結果 5555
作者: stm32nb    時間: 2019-7-22 17:42
學習了。
作者: 魚主~    時間: 2019-8-7 09:40
資料很贊

作者: 拉卡拉    時間: 2019-9-14 16:33
感謝大佬
作者: aaronbin    時間: 2019-10-11 16:58
那個讀取HX711之后,為啥還要用8388608減去它
作者: 冰葑世紀    時間: 2020-5-29 10:55
求轉發(fā)源碼給我學習,剛進來下載不了。
作者: xeh073    時間: 2022-8-8 10:21
正在做電子秤,下載學習。
作者: 不吃香菜呀    時間: 2022-8-18 17:04
直接下載,贊
作者: haide1998    時間: 2022-9-12 20:52
收藏,準備以后學習,謝謝分享!




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久久久中文字幕 | 国产做爰免费观看视频 | 黄网站免费看 | 亚洲福利一区 | 91精品91久久久中77777 | 欧美性猛交xxxx免费看久久久 | 国产精品久久久久久妇女6080 | 97精品国产97久久久久久免费 | 96av视频| 91福利视频导航 | 一级片免费播放 | 色哟哟av| 91av在线看| 国产做爰视频免费播放 | 色婷婷久久综合 | 福利视频午夜 | 日韩美女一区二区三区 | 美女久久久久久 | 国产黄色录像 | 精品一区二区在线播放 | 狠狠干2018| 久操国产| 黄色片毛片 | 国产一级片网站 | 欧美精品一区二区三区四区 | 国产一级片网站 | 中文字幕精品在线观看 | 国产呦小j女精品视频 | 日本三级在线视频 | 亚洲h视频| 国产精品黄| 成人香蕉网 | 性欧美精品 | 亚洲三级av | 欧美日韩黄色片 | 欧美日韩一区二区三区视频 | 国产成人精品一区二区三区视频 | 99国产精品99久久久久久粉嫩 | 国产在线观看网站 | 欧美亚洲三级 | 久久精品一区 |