当前位置:   article > 正文

203 基于51单片机HX711精密智能电子秤设计_xh711

xh711

本设计采用模块化设计法,以51单片机为核心设计一款高精度电子秤,当被称物体放置在秤台上时,称重传感器产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系的电信号。该电信号先通过前端信号处理电路,然后经过A/D转换电路转换成数字信号送入到主控电路的单片机中,单片机通过扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行判断、分析和控制,来完成各种运算和显示功能。

其硬件结构主要包括:数据采集模块、最小系统模块、超重报警模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统部分主要包括AT89S51、晶振电路和复位电路;键盘由4X4位矩阵键盘组成,可以控制显示重量和价钱等信息;显示部分由LCD1602液晶显示。软件部分由C语言编程,实现对各部分的控制。该电子秤可以实现称重、置零、计价和显示等功能。其称重范围为0~10Kg,分度值为0.001g。整个系统结构简单,使用方便。

利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。

按照本设计功能的要求,系统由5个部分组成:控制器部分、测量部分、数据显示部分、键盘部分、和电路电源部分

基于51单片机的电子秤设计

功能:

  • 1.可以实现为去皮按键。
  • 2.可以进行校准。
  • 3.精度要求高。

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1Ctpfq03UD7_Onp7yCZFaCg?pwd=8888

部分代码展示

  1. //定义标识
  2. volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0
  3. volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0
  4. //校准参数
  5. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
  6. //当发现测试出来的重量偏大时,增加该数值。
  7. //如果测试出来的重量偏小时,减小改数值。
  8. //该值可以为小数
  9. //#define GapValue 349
  10. sbit LED=P1^1;
  11. sbit ROW1=P3^0;
  12. sbit ROW2=P3^1;
  13. sbit ROW3=P3^2;
  14. sbit ROW4=P3^3;
  15. volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0
  16. /******************把数据保存到单片机内部eeprom中******************/
  17. void write_eeprom()
  18. {
  19. SectorErase(0x2000);
  20. GapValue1=GapValue&0x00ff;
  21. byte_write(0x2000, GapValue1);
  22. GapValue1=(GapValue&0xff00)>>8;
  23. byte_write(0x2001, GapValue1);
  24. byte_write(0x2060, a_a);
  25. }
  26. /******************把数据从单片机内部eeprom中读出来*****************/
  27. void read_eeprom()
  28. {
  29. GapValue = byte_read(0x2001);
  30. GapValue = (GapValue<<8)|byte_read(0x2000);
  31. a_a = byte_read(0x2060);
  32. }
  33. /**************开机自检eeprom初始化*****************/
  34. void init_eeprom()
  35. {
  36. read_eeprom(); //先读
  37. if(a_a != 1) //新的单片机初始单片机内问eeprom
  38. {
  39. GapValue = 3500;
  40. a_a = 1;
  41. write_eeprom(); //保存数据
  42. }
  43. }
  44. //显示重量,单位kg,两位整数,三位小数
  45. void Display_Weight()
  46. {
  47. LCD1602_write_com(0x80+0x40+8);
  48. if(Weight_Shiwu/10000==0)
  49. LCD1602_write_data(' ');
  50. else
  51. LCD1602_write_data(Weight_Shiwu/10000 + 0x30);
  52. LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);
  53. LCD1602_write_data('.');
  54. LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
  55. LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
  56. LCD1602_write_data(Weight_Shiwu%10 + 0x30);
  57. }
  58. //定时器0初始化
  59. void Timer0_Init()
  60. {
  61. ET0 = 1; //允许定时器0中断
  62. TMOD = 1; //定时器工作方式选择
  63. TL0 = 0xb0;
  64. TH0 = 0x3c; //定时器赋予初值
  65. TR0 = 1; //启动定时器
  66. }
  67. //定时器0中断
  68. void Timer0_ISR (void) interrupt 1 using 0
  69. {
  70. uchar Counter;
  71. TL0 = 0xb0;
  72. TH0 = 0x3c; //定时器赋予初值
  73. //0.5秒钟刷新重量
  74. Counter ++;
  75. if (Counter >= 10)
  76. {
  77. FlagTest = 1;
  78. Counter = 0;
  79. }
  80. }
  81. //按键响应程序,参数是键值
  82. //返回键值:
  83. // 7 8 9 10(清0)
  84. // 4 5 6 11(删除)
  85. // 1 2 3 12(未定义)
  86. // 14(未定义) 0 15(.) 13(确定价格)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号