找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4954|回复: 1
收起左侧

基于51单片机HX711的数码电子秤Proteus仿真程序

[复制链接]
ID:436996 发表于 2020-2-15 15:26 | 显示全部楼层 |阅读模式
制作出来的实物图如下:
0.jpg 0.jpg

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

电子秤元件清单

1)    7*9万用板
2)    STC89C51单片机
3)    40脚IC座
4)    12MHz晶振
5)    30pF瓷片电容*2
6)    10uF电解电容
7)    100uF电解电容
8)    0.36四位一体共阳数码管
9)    5V有源蜂鸣器
10)    9012三极管*5
11)    5mm红发红LED
12)    按键*4
13)    10k电阻*3
14)    2.2k电阻*6
15)    HX711模块
16)    4P单排母座
17)    6P单排母座
18)    压力传感器(含支架)
19)    自锁开关
20)    DC电源插座
21)    USB电源线
22)    导线
23)    焊锡

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

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

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

  18. uint GapValue,GapValue1;
  19. bit flag_cz=0;

  20. uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //数码管显示码表
  21. //定义标识
  22. volatile bit FlagTest = 0;                //定时测试标志,每0.5秒置位,测完清0
  23. volatile bit FlagKeyPress = 0;  //有键按下标志,处理完毕清0
  24. //校准参数
  25. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值更准确。
  26. //当发现测试出来的重量偏大时,增加该数值。
  27. //如果测试出来的重量偏小时,减小改数值。
  28. //该值可以为小数
  29. sbit LED=P1^1;
  30. sbit ROW1=P3^0;
  31. sbit ROW2=P3^1;
  32. sbit ROW3=P3^2;
  33. sbit DIAN = P0^5;                        //小数点

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

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

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

  52. /**************开机自检eeprom初始化*****************/
  53. void init_eeprom()
  54. {
  55.         read_eeprom();                //先读
  56.         if(a_a != 1)                //新的单片机初始单片机内问eeprom
  57.         {
  58.                 GapValue  = 3500;
  59.                 a_a = 1;
  60.                 write_eeprom();           //保存数据
  61.         }        
  62. }
  63. /*****显示开机初始化等待画面*****/
  64. void Disp_init(void)   
  65. {
  66.         P0 = ~0x80;      //显示----
  67.         P2 = 0xBF;                 //依次打开各位
  68.         Delay_ms(1);                 //延时
  69.         P2 = 0xEF;
  70.         Delay_ms(1);   
  71.         P2 = 0xFB;
  72.         Delay_ms(1);
  73.         P2 = 0xFE;
  74.         Delay_ms(1);
  75.         P2 = 0xFF;         //关闭显示
  76. }

  77. //显示重量,单位kg,两位整数,三位小数
  78. void Display_Weight()
  79. {
  80.     P0 = ~LEDData[Weight_Shiwu%10];      //
  81.         P2 = 0xBF;                 //打开位
  82.         Delay_ms(1);                 //延时
  83.         P2 = 0xff;         //关闭显示
  84.         P0=~LEDData[Weight_Shiwu%100/10];    //显示个位
  85.         P2 = 0xEF;
  86.         Delay_ms(1);
  87.         P2 = 0xff;         //关闭显示
  88.         P0 =~LEDData[Weight_Shiwu%1000/100];    //显示十位
  89.         P2 = 0xFB;
  90.         Delay_ms(1);
  91.         P2 = 0xff;         //关闭显示
  92.         P0 =~LEDData[Weight_Shiwu%10000/1000];    //显示百位
  93.         DIAN = 0;         //显示小数点
  94.         P2 = 0xFE;
  95.         Delay_ms(1);
  96.         P2 = 0xff;         //关闭显示
  97. }

  98. //定时器0初始化
  99. void Timer0_Init()
  100. {
  101.         ET0 = 1;        //允许定时器0中断
  102.         TMOD = 1;       //定时器工作方式选择
  103.         TL0 = 0xb0;     
  104.         TH0 = 0x3c;     //定时器赋予初值
  105.         TR0 = 1;        //启动定时器
  106. }

  107. //定时器0中断
  108. void Timer0_ISR (void) interrupt 1 using 0
  109. {
  110. uchar Counter;
  111.         TL0 = 0xb0;
  112.         TH0 = 0x3c;     //定时器赋予初值

  113.         //每0.5秒钟刷新重量
  114.     Counter ++;
  115.     if (Counter >= 10)
  116.     {
  117.        FlagTest = 1;
  118.            Counter = 0;
  119.     }
  120. }

  121. void KeyPress()
  122. {
  123.         if(ROW1==0)   //清零键
  124.         {
  125.                 Display_Weight();
  126.                 if(ROW1==0)
  127.                 {
  128.                         if(qupi==0)
  129.                         qupi=Weight_Shiwu;
  130.                         else
  131.                         qupi=0;
  132.                         Buzzer=0;
  133.                         for(p=0;p<10;p++)
  134.                         Display_Weight();
  135.                         Buzzer=1;        
  136.                         while(ROW1==0) Display_Weight();
  137.                 }
  138.         }
  139.         if(ROW2==0)           //加
  140.         {
  141.                 Display_Weight();
  142.                 if(ROW2==0)
  143.                 {
  144.                         while(!ROW2)
  145.                         {
  146.                                 key_press_num++;
  147.                                 if(key_press_num>=100)
  148.                                 {
  149.                                         key_press_num=0;
  150.                                         while(!ROW2)
  151.                                         {
  152.                                                 if(GapValue<10000)
  153.                                                 GapValue+=10;
  154.                                                 Buzzer=0;
  155.                                                 for(p=0;p<2;p++)
  156.                                                 Display_Weight();
  157.                                                 Buzzer=1;
  158.                                                 for(p=0;p<2;p++)
  159.                                                 Display_Weight();
  160.                                                 Get_Weight();
  161.                                         }
  162.                                 }
  163.                                 Display_Weight();
  164.                                 Delay_ms(8);
  165.                         }
  166.                         if(key_press_num!=0)
  167.                         {
  168.                                 key_press_num=0;
  169.                                 if(GapValue<10000)
  170.                                 GapValue++;
  171.                                 Buzzer=0;
  172.                                 for(p=0;p<10;p++)
  173.                                 Display_Weight();
  174.                                 Buzzer=1;
  175.                         }
  176.                         write_eeprom();               
  177.                 }
  178.         }
  179.         if(ROW3==0)  //减
  180.         {
  181.                 Display_Weight();
  182.                 if(ROW3==0)
  183.                 {
  184.                         while(!ROW3)
  185.                         {
  186.                                 key_press_num++;
  187.                                 if(key_press_num>=100)
  188.                                 {
  189.                                         key_press_num=0;
  190.                                         while(!ROW3)
  191.                                         {
  192.                                                 if(GapValue>1)
  193.                                                 GapValue-=10;
  194.                                                 Buzzer=0;
  195.                                                 for(p=0;p<2;p++)
  196.                                                 Display_Weight();
  197.                                                 Buzzer=1;
  198.                                                 for(p=0;p<2;p++)
  199.                                                 Display_Weight();
  200.                                                 Get_Weight();
  201.                                         }
  202.                                 }
  203.                                 Display_Weight();
  204.                                 Delay_ms(8);
  205.                         }
  206.                         if(key_press_num!=0)
  207.                         {
  208.                                 key_press_num=0;
  209.                                 if(GapValue>1)
  210.                                 GapValue--;
  211.                                 Buzzer=0;
  212.                                 for(p=0;p<10;p++)
  213.                                 Display_Weight();
  214.                                 Buzzer=1;
  215.                         }
  216.                         write_eeprom();                           //保存数?
  217.                 }
  218.         }
  219. }
  220. //****************************************************
  221. //主函数
  222. //****************************************************
  223. void main()
  224. {
  225.         init_eeprom();  //开始初始化保存的数据
  226.    EA = 0;
  227.    Timer0_Init();
  228.    //初中始化完成,开断
  229.    EA = 1;
  230.    Get_Maopi();

  231.         while(1)
  232.         {
  233. //每0.5秒称重一次
  234.                 if (FlagTest==1)
  235.                 {
  236.                         Get_Weight();
  237.                         FlagTest = 0;
  238.                 }
  239.                 if(flag_cz==1)
  240.                 Disp_init();
  241.                 else
  242.                 Display_Weight();         
  243.                 KeyPress();
  244.         }
  245. }
  246. //****************************************************
  247. //称重
  248. //****************************************************
  249. void Get_Weight()
  250. {
  251.         Weight_Shiwu = HX711_Read();
  252.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //获取净重
  253.         
  254.         Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi;         //计算实物的实际重量                                                                                                                                
  255.         if(Weight_Shiwu >= 10000)                //超重报警
  256.         {
  257.                 Buzzer = !Buzzer;        
  258.                 LED=!LED;
  259.                 flag_cz=1;
  260.         }
  261.         else
  262.         {
  263.                 if(Weight_Shiwu==0)
  264.                 LED=0;
  265.                 else if(Weight_Shiwu>0)
  266.                 LED=1;
  267.                 Buzzer = 1;
  268.                 flag_cz=0;
  269.         }
  270. }

  271. //****************************************************
  272. //获取毛皮重量
  273. //****************************************************
  274. void Get_Maopi()
  275. {
  276.         unsigned char clear,f;
  277. mm:        Weight_Maopi_0 = HX711_Read();
  278.         for(clear=0;clear<10;clear++)
  279.         {
  280.                 Buzzer=1;
  281.                 LED=0;
  282.                 for(f=0;f<40;f++)
  283.                 Disp_init();
  284.                 LED=1;
  285.                 for(f=0;f<40;f++)
  286.                 Disp_init();        
  287.         }
  288.         Weight_Maopi = HX711_Read();
  289.         if((Weight_Maopi*10)/GapValue!=(Weight_Maopi_0*10)/GapValue)
  290.         goto mm;
  291.         Buzzer=0;
  292.         for(f=0;f<10;f++)
  293.         Disp_init();
  294.         Buzzer=1;
  295. }

  296. //****************************************************
  297. //MS延时函数(12M晶振下测试)
  298. //****************************************************
  299. void Delay_ms(unsigned int n)
  300. {
  301.         unsigned int  i,j;
  302.         for(i=0;i<n;i++)
  303.                 for(j=0;j<121;j++);
  304. }
复制代码

所有资料51hei提供下载:
电子称(数码管).7z (3.52 MB, 下载次数: 164)

评分

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

查看全部评分

回复

使用道具 举报

ID:220599 发表于 2020-4-29 22:56 | 显示全部楼层
有仿真的源程序吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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