找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+hx711电子秤的Proteus仿真程序

[复制链接]
ID:248898 发表于 2020-10-10 22:27 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #include "main.h"
  5. #include "LCD1602.h"
  6. #include "HX711.h"
  7. #include "eeprom52.h"

  8. #define uchar unsigned char
  9. #define uint  unsigned int

  10. unsigned long HX711_Buffer = 0;
  11. unsigned long Weight_Maopi = 0;
  12. unsigned long Weight_Maopi_0 = 0;
  13. long Weight_Shiwu = 0;
  14. unsigned int qupi=0;
  15. //键盘处理变量
  16. unsigned char keycode;
  17. unsigned char key_press_num=0;
  18. uint GapValue,GapValue1;

  19. //定义标识
  20. volatile bit FlagTest = 0;                //定时测试标志,每0.5秒置位,测完清0
  21. volatile bit FlagKeyPress = 0;  //有键按下标志,处理完毕清0
  22. //校准参数
  23. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
  24. //当发现测试出来的重量偏大时,增加该数值。
  25. //如果测试出来的重量偏小时,减小改数值。
  26. //该值可以为小数
  27. //#define GapValue 349
  28. sbit LED=P1^1;
  29. sbit ROW1=P3^0;
  30. sbit ROW2=P3^1;
  31. sbit ROW3=P3^2;
  32. sbit ROW4=P3^3;

  33. volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂

  34. /******************把数据保存到单片机内部eeprom中******************/
  35. void write_eeprom()
  36. {
  37.         SectorErase(0x2000);
  38.         GapValue1=GapValue&0x00ff;
  39.         byte_write(0x2000, GapValue1);
  40.         GapValue1=(GapValue&0xff00)>>8;
  41.         byte_write(0x2001, GapValue1);
  42.         byte_write(0x2060, a_a);        
  43. }

  44. /******************把数据从单片机内部eeprom中读出来*****************/
  45. void read_eeprom()
  46. {
  47.         GapValue   = byte_read(0x2001);
  48.         GapValue   = (GapValue<<8)|byte_read(0x2000);
  49.         a_a      = byte_read(0x2060);
  50. }

  51. /**************开机自检eeprom初始化*****************/
  52. void init_eeprom()
  53. {
  54.         read_eeprom();                //先读
  55.         if(a_a != 1)                //新的单片机初始单片机内问eeprom
  56.         {
  57.                 GapValue  = 3500;
  58.                 a_a = 1;
  59.                 write_eeprom();           //保存数据
  60.         }        
  61. }

  62. //显示重量,单位kg,两位整数,三位小数
  63. void Display_Weight()
  64. {
  65.         LCD1602_write_com(0x80+0x40+8);
  66.         if(Weight_Shiwu/10000==0)
  67.         LCD1602_write_data(' ');
  68.         else
  69.         LCD1602_write_data(Weight_Shiwu/10000 + 0x30);
  70.         LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);
  71.         LCD1602_write_data('.');
  72.         LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
  73.         LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
  74.         LCD1602_write_data(Weight_Shiwu%10 + 0x30);
  75. }

  76. //定时器0初始化
  77. void Timer0_Init()
  78. {
  79.         ET0 = 1;        //允许定时器0中断
  80.         TMOD = 1;       //定时器工作方式选择
  81.         TL0 = 0xb0;     
  82.         TH0 = 0x3c;     //定时器赋予初值
  83.         TR0 = 1;        //启动定时器
  84. }

  85. //定时器0中断
  86. void Timer0_ISR (void) interrupt 1 using 0
  87. {
  88.         uchar Counter;
  89.         TL0 = 0xb0;
  90.         TH0 = 0x3c;     //定时器赋予初值

  91.         //每0.5秒钟刷新重量
  92.     Counter ++;
  93.     if (Counter >= 10)
  94.     {
  95.        FlagTest = 1;
  96.            Counter = 0;
  97.     }
  98. }


  99. //按键响应程序,参数是键值
  100. //返回键值:
  101. //         7          8    9      10(清0)
  102. //         4          5    6      11(删除)
  103. //         1          2    3      12(未定义)
  104. //         14(未定义) 0    15(.)  13(确定价格)

  105. void KeyPress()
  106. {
  107.         if(ROW1==0)   //去皮键
  108.         {
  109.                 Delay_ms(5);
  110.                 if(ROW1==0)
  111.                 {
  112. //                        Get_Maopi();
  113.                         if(qupi==0)
  114.                         qupi=Weight_Shiwu;
  115.                         else
  116.                         qupi=0;
  117.                         Buzzer=0;
  118.                         Delay_ms(50);
  119.                         Buzzer=1;        
  120.                         while(ROW1==0);
  121.                 }
  122.         }
  123.         if(ROW2==0)           //加
  124.         {
  125.                 Delay_ms(5);
  126.                 if(ROW2==0)
  127.                 {
  128.                         while(!ROW2)
  129.                         {
  130.                                 key_press_num++;
  131.                                 if(key_press_num>=100)
  132.                                 {
  133.                                         key_press_num=0;
  134.                                         while(!ROW2)
  135.                                         {
  136.                                                 if(GapValue<10000)
  137.                                                 GapValue+=10;
  138.                                                 Buzzer=0;
  139.                                                 Delay_ms(10);
  140.                                                 Buzzer=1;
  141.                                                 Delay_ms(10);
  142.                                                 Get_Weight();
  143.                                         }
  144.                                 }
  145.                                 Delay_ms(10);
  146.                         }
  147.                         if(key_press_num!=0)
  148.                         {
  149.                                 key_press_num=0;
  150.                                 if(GapValue<10000)
  151.                                 GapValue++;
  152.                                 Buzzer=0;
  153.                                 Delay_ms(50);
  154.                                 Buzzer=1;
  155.                         }
  156.                         write_eeprom();               
  157.                 }
  158.         }
  159.         if(ROW3==0)  //减
  160.         {
  161.                 Delay_ms(5);
  162.                 if(ROW3==0)
  163.                 {
  164.                         while(!ROW3)
  165.                         {
  166.                                 key_press_num++;
  167.                                 if(key_press_num>=100)
  168.                                 {
  169.                                         key_press_num=0;
  170.                                         while(!ROW3)
  171.                                         {
  172.                                                 if(GapValue>1)
  173.                                                 GapValue-=10;
  174.                                                 Buzzer=0;
  175.                                                 Delay_ms(10);
  176.                                                 Buzzer=1;
  177.                                                 Delay_ms(10);
  178.                                                 Get_Weight();
  179.                                         }
  180.                                 }
  181.                                 Delay_ms(10);
  182.                         }
  183.                         if(key_press_num!=0)
  184.                         {
  185.                                 key_press_num=0;
  186.                                 if(GapValue>1)
  187.                                 GapValue--;
  188.                                 Buzzer=0;
  189.                                 Delay_ms(50);
  190.                                 Buzzer=1;
  191.                         }
  192.                         write_eeprom();                           //保存数?
  193.                 }
  194.         }
  195. }
  196. //****************************************************
  197. //主函数
  198. //****************************************************
  199. void main()
  200. {
  201.         init_eeprom();  //开始初始化保存的数据
  202.         Init_LCD1602();                                                                        //初始化LCD1602
  203.    EA = 0;
  204.    Timer0_Init();
  205.    //初中始化完成,开断
  206.    EA = 1;
  207.         
  208. //        Get_Maopi();
  209.         LCD1602_write_com(0x80);                                                //指针设置
  210.    LCD1602_write_word(" Welcome To Use ");        //  
  211.    LCD1602_write_com(0x80+0x40);                                                //指针设置
  212.    LCD1602_write_word("Electronic Scale");
  213. //   Delay_ms(2000);
  214.    Get_Maopi();
  215.    LCD1602_write_com(0x80);                                                //指针设置
  216.    LCD1602_write_word("The Weight:     ");
  217.    LCD1602_write_com(0x80+0x40);                                //指针设置
  218.    LCD1602_write_word("         0.000kg");
  219. //        Get_Maopi();                                //称毛皮重量

  220.         while(1)
  221.         {
  222. //每0.5秒称重一次
  223.                 if (FlagTest==1)
  224.                 {
  225.                         Get_Weight();
  226.                         FlagTest = 0;
  227.                 }         
  228.                 KeyPress();
  229.         }
  230. }
  231. //****************************************************
  232. //称重
  233. //****************************************************
  234. void Get_Weight()
  235. {
  236.         Weight_Shiwu = HX711_Read();
  237.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //获取净重
  238.         
  239.         Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi;         //计算实物的实际重量                                                                                                                                
  240.         if(Weight_Shiwu >= 10000)                //超重报警
  241.         {
  242.                 Buzzer = !Buzzer;        
  243.                 LED=!LED;
  244.                 LCD1602_write_com(0x80+0x40+8);
  245.            LCD1602_write_word("--.---");
  246.         }
  247.         else
  248.         {
  249.                 if(Weight_Shiwu==0)
  250.                 LED=0;
  251.                 else if(Weight_Shiwu>0)
  252.                 LED=1;
  253.                 Buzzer = 1;
  254.                 Display_Weight();
  255.         }
  256. }

  257. //****************************************************
  258. //获取毛皮重量
  259. //****************************************************
  260. void Get_Maopi()
  261. {
  262.         unsigned char clear;
  263. mm:        Weight_Maopi_0 = HX711_Read();
  264.         for(clear=0;clear<10;clear++)
  265.         {
  266.                 Buzzer=1;
  267.                 LED=0;
  268.                 Delay_ms(100);
  269.                 LED=1;
  270.                 Delay_ms(100);        
  271.         }
  272.         Weight_Maopi = HX711_Read();
  273.         if(Weight_Maopi/GapValue!=Weight_Maopi_0/GapValue)
  274.         goto mm;
  275.         Buzzer=0;
  276.         Delay_ms(500);
  277.         Buzzer=1;
  278. }

  279. //****************************************************
  280. //MS延时函数(12M晶振下测试)
  281. //****************************************************
  282. void Delay_ms(unsigned int n)
  283. {
  284.         unsigned int  i,j;
  285.         for(i=0;i<n;i++)
  286.                 for(j=0;j<121;j++);
  287. }
复制代码

所有资料51hei提供下载:
hx711仿真.rar (368.37 KB, 下载次数: 148)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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