找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1911|回复: 0
收起左侧

基于STM32、STM8、Arduino 51单片机的简易电子秤仿真程序资料

[复制链接]
ID:1017118 发表于 2022-4-10 00:25 | 显示全部楼层 |阅读模式
基于STM32、STM8、Arduino的简易电子秤附带各种所需资料与原理图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
注意:按键定义名称是根据程序控制的,可以修改的,所以按键需要什么功能,自己修改程序来实现。

51hei.gif 仿真效果图.png

电路原理图如下:
1649521403(1).jpg

5KG压力传感器和HX711模块接法.jpg 安装方法1.png

单片机源程序如下:
  1. /**********************************************************************

  2. ***********************************************************************/

  3. #include "main.h"
  4. #include "HX711.h"
  5. #include "uart.h"
  6. #include "LCD1602.h"

  7. #define   uchar unsigned char
  8. #define   uint unsigned int
  9. unsigned long HX711_Buffer = 0;
  10. unsigned long Weight_Maopi = 0;
  11. long Weight_Shiwu = 0;
  12. long Weight_warn = 0;

  13. unsigned char flag = 0;
  14. bit Flag_ERROR = 0;
  15. sbit speak= P1^7;         //蜂鸣器
  16. sbit jiare= P3^0;        //继电器接口
  17. uchar Ncunchu[5];
  18. unsigned char num1,num2;
  19. //校准参数
  20. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
  21. //当发现测试出来的重量偏大时,增加该数值。
  22. //如果测试出来的重量偏小时,减小改数值。 不过该值也可以通过按键开修改,该程序中有体现出来的 ?
  23. //该值可以为小数

  24. uint GapValue= 430;

  25. #include "eeprom52.h"


  26. /******************把数据保存到单片机内部eeprom中******************/
  27. void write_eeprom()
  28. {  

  29.         
  30.         Ncunchu[0] = Weight_warn/256;
  31.         Ncunchu[1] = Weight_warn%256;
  32.         
  33.          num1=GapValue/256;
  34.         num2=GapValue%256;
  35.         
  36.         SectorErase(0x2000);
  37.         byte_write(0x2011,Ncunchu[0]);
  38.         byte_write(0x2012,Ncunchu[1]);
  39.         
  40.         byte_write(0x2001,  num1);
  41.         byte_write(0x2002,  num2);



  42.   byte_write(0x2060, a_a);        
  43. }

  44. /******************把数据从单片机内部eeprom中读出来*****************/
  45. void read_eeprom()
  46. {
  47.   num1   = byte_read(0x2001);
  48.         num2   = byte_read(0x2002);

  49.         
  50.         Ncunchu[0] = byte_read(0x2011);
  51.         Ncunchu[1] = byte_read(0x2012);
  52.         
  53.         Weight_warn  = Ncunchu[0]*256+Ncunchu[1];
  54.         GapValue= num1*256+num2;


  55.         
  56.     a_a      = byte_read(0x2060);
  57. }

  58. /**************开机自检eeprom初始化*****************/
  59. void init_eeprom()
  60. {
  61.         read_eeprom();                //先读
  62.         if(a_a != 156)                //新的单片机初始单片机内问eeprom
  63.         {
  64.            a_a =156;
  65.            Weight_warn = 100;
  66.                  GapValue= 430;
  67.      write_eeprom();
  68.         }        
  69.         
  70.         
  71.         
  72. }

  73. //****************************************************
  74. //主函数
  75. //****************************************************
  76. void main()
  77. {
  78.    // Uart_Init();
  79.    // Send_Word("Welcome to use!\n");
  80.    // Send_Word("Made by Beetle Electronic Technology!\n");
  81.         
  82.         Init_LCD1602();
  83.         LCD1602_write_com(0x80);
  84.         LCD1602_write_word("Weight  Warning");
  85.         init_eeprom();                              //读eeprom数据

  86.         Delay_ms(1000);                 //延时,等待传感器稳定
  87.         Get_Maopi();                                //称毛皮重量
  88.     Delay_ms(100);                 
  89.         Get_Maopi();                                //称毛皮重量
  90.         Delay_ms(100);                 
  91.         Get_Maopi();                                //多次去皮有利于稳定
  92.         
  93.         while(1)
  94.         {
  95.                 EA = 0;
  96.                 Get_Weight();                        //称重
  97.                 EA = 1;

  98.                 Scan_Key();

  99.                 //显示当前重量
  100.                 if( Flag_ERROR == 1)
  101.                 {
  102.          //   Send_Word("ERROR\n");
  103.                         
  104.                         LCD1602_write_com(0x80+0x40);
  105.                         LCD1602_write_word("ERROR ");
  106.                         speak=0;
  107.                 }               
  108.                 else
  109.                 {         
  110.                
  111.             LCD1602_write_com(0x80+0x40);
  112.                         LCD1602_write_data(Weight_Shiwu/1000 + 0X30);
  113.             LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);
  114.             LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);
  115.             LCD1602_write_data(Weight_Shiwu%10 + 0X30);
  116.                         LCD1602_write_word(" g");

  117.                         LCD1602_write_com(0x80+0x40+8);
  118.                         LCD1602_write_data(Weight_warn/1000 + 0X30);
  119.             LCD1602_write_data(Weight_warn%1000/100 + 0X30);
  120.             LCD1602_write_data(Weight_warn%100/10 + 0X30);
  121.             LCD1602_write_data(Weight_warn%10 + 0X30);
  122.                         LCD1602_write_word(" g");
  123.                 }
  124.                
  125.         }
  126. }

  127. //扫描按键
  128. void Scan_Key()
  129. {
  130.         if(KEY1 == 0  && KEY2 == 1 && KEY3 ==1)
  131.         {
  132.                 Delay_ms(5);
  133.                 if(KEY1 == 0  && KEY2 == 1 && KEY3 ==1)
  134.                 {
  135.                     Get_Maopi();
  136.                 }        
  137.         }

  138.         if(KEY2 == 0 && KEY1 == 1 && KEY3 ==1)
  139.         {
  140.                 Delay_ms(20);
  141.                 if(KEY2 == 0 && KEY1 == 1 && KEY3 ==1)
  142.                 {
  143.                 //        while(KEY2 == 0);
  144.                    if(Weight_warn<=5000)         { Weight_warn+=1;}
  145.                     write_eeprom();       //保存数据
  146.                 }        
  147.         }

  148.         if(KEY3 == 0 && KEY2 == 1 && KEY1 ==1)
  149.         {
  150.                 Delay_ms(20);
  151.                 if(KEY3 == 0 && KEY2 == 1 && KEY1 ==1)
  152.                 {
  153.                 //        while(KEY3 == 0);
  154.                     if(Weight_warn>=2)        Weight_warn-=1;
  155.                          write_eeprom();       //保存数据
  156.                 }        
  157.         }
  158.   
  159.         
  160.         //=======================对实物进行重量校正================================
  161.         if(KEY1 == 0 && KEY2 == 0 && KEY3 ==1)
  162.         {
  163.                 Delay_ms(25);
  164.                 if(KEY1 == 0 && KEY2 == 0 && KEY3 ==1)
  165.                 {

  166.                     if(GapValue<9999)  { GapValue++; }
  167.                            write_eeprom();       //保存数据

  168.                 }        
  169.         }

  170.         if(KEY1 == 0 && KEY2 == 1 && KEY3 ==0)
  171.         {
  172.                 Delay_ms(25);
  173.                 if(KEY1 == 0 && KEY2 == 1 && KEY3 ==0)
  174.                 {         

  175.                     if(GapValue>1)  {         GapValue--; }
  176.                           write_eeprom();       //保存数据


  177.                 }        
  178.         }
  179.         
  180.     if(Weight_Shiwu<Weight_warn)   {jiare=1; speak=1;}         //继电器关闭
  181.           if(Weight_Shiwu>=Weight_warn)  {jiare=0; speak=0; }         //继电器打开
  182. }

  183. //****************************************************
  184. //称重
  185. //****************************************************
  186. void Get_Weight()
  187. {
  188.         Weight_Shiwu = HX711_Read();
  189.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //获取净重
  190.         if(Weight_Shiwu > 0)                        
  191.         {        
  192.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //计算实物的实际重量
  193.                                                                                                                                                 
  194.                                                                                                                                                 
  195.                 if(Weight_Shiwu > 5000)                //超重报警
  196.                 {
  197.                         Flag_ERROR = 1;        
  198.                 }
  199.                 else
  200.                 {
  201.                         Flag_ERROR = 0;
  202.                 }
  203.         }
  204.         else
  205.         {
  206.                 Weight_Shiwu = 0;
  207.         //        Flag_ERROR = 1;                                //负重报警
  208.         }
  209.         
  210. }

  211. //****************************************************
  212. //获取毛皮重量
  213. //****************************************************
  214. void Get_Maopi()
  215. {
  216.         Weight_Maopi = HX711_Read();        
  217. }

  218. //****************************************************
  219. //MS延时函数(12M晶振下测试)
  220. //****************************************************
  221. void Delay_ms(unsigned int n)
  222. {
  223.         unsigned int  i,j;
  224.         for(i=0;i<n;i++)
  225.                 for(j=0;j<123;j++);
  226. }
复制代码
51hei.png

所有资料51hei附件下载:
压力传感器资料包.7z (5.62 MB, 下载次数: 64)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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