找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15347|回复: 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重复定义!!!!已解决

  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, 下载次数: 496)


评分

参与人数 1黑币 +5 收起 理由
我是辉大爷 + 5 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶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 单片机教程网

快速回复 返回顶部 返回列表