找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6160|回复: 3
收起左侧

51单片机HX711传感器电子秤设计(原理图、程序源码、BOM等)

[复制链接]
ID:353033 发表于 2020-4-7 12:12 | 显示全部楼层 |阅读模式
基于51单片机HX711传感器电子秤设计制作出来的实物图如下:
0.jpg

元件型号    元件名称    元件标号    数量
蜂鸣器    Bell    B1    1
10uF    电容    C1    1
20pF    电容    C2, C3    2
LCD1602    液晶     LCD1    1
Header 2    电源接口    P1    1
9012    三极管    Q5    1
2.7K    电阻    R1    1
10K    电阻    R2    1
SW-PB    按键    S1, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18    17
sw-灰色    电源开关    SW1    1
U1    单片机    U1    1
12M    晶振    Y1    1

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. #define ulong unsigned long

  5. #include<intrins.h>

  6. uchar code table_num[]="0123456789abcdefg";

  7. sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  8. sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  9. sbit e =P1^2;         //片选信号   下降沿触发

  10. sbit hx711_dout=P2^1;
  11. sbit hx711_sck=P2^0;

  12. sbit beep = P1^3;     //蜂鸣器

  13. long weight;

  14. uint temp,qi_weight;
  15. bit chaozhong_flag;
  16. bit leiji_flag;
  17. bit flag_300ms ;

  18. ulong price,z_price;   //单价 总价
  19. uchar flag_p;

  20. /***************
  21. 删除键
  22. 去皮
  23. 价格清零

  24. ***************/

  25. /******1ms延时函数***12M晶振**************/
  26. void delay_1ms(uint q)
  27. {
  28.         uint i,j;
  29.         for(i=0;i<q;i++)
  30.                 for(j=0;j<120;j++);
  31. }

  32. /********************************************************************
  33. * 名称 : delay_uint()
  34. * 功能 : 小延时。
  35. * 输入 : 无
  36. * 输出 : 无
  37. ***********************************************************************/
  38. void delay_uint(uint q)
  39. {
  40.         while(q--);
  41. }

  42. /********************************************************************
  43. * 名称 : write_com(uchar com)
  44. * 功能 : 1602命令函数
  45. * 输入 : 输入的命令值
  46. * 输出 : 无
  47. ***********************************************************************/
  48. void write_com(uchar com)
  49. {
  50.         e=0;
  51.         rs=0;
  52.         rw=0;
  53.         P0=com;
  54.         delay_uint(3);
  55.         e=1;
  56.         delay_uint(25);
  57.         e=0;
  58. }

  59. /********************************************************************
  60. * 名称 : write_data(uchar dat)
  61. * 功能 : 1602写数据函数
  62. * 输入 : 需要写入1602的数据
  63. * 输出 : 无
  64. ***********************************************************************/
  65. void write_data(uchar dat)
  66. {
  67.         e=0;
  68.         rs=1;
  69.         rw=0;
  70.         P0=dat;
  71.         delay_uint(3);
  72.         e=1;
  73.         delay_uint(25);
  74.         e=0;        
  75. }


  76. /***********************lcd1602上显示这字符函数************************/
  77. void write_string(uchar hang,uchar add,uchar *p)
  78. {
  79.         if(hang==1)   
  80.                 write_com(0x80+add);
  81.         else
  82.                 write_com(0x80+0x40+add);
  83.         while(1)                                                                                                                 
  84.         {
  85.                 if(*p == '\0')  break;
  86.                 write_data(*p);
  87.                 p++;
  88.         }        
  89. }

  90. /***********************lcd1602初始化设置************************/
  91. void init_1602()         //lcd1602初始化设置
  92. {
  93.         write_com(0x38);        //
  94.         write_com(0x0c);
  95.         write_com(0x06);
  96.         delay_uint(1000);
  97. }

  98. ////////////////在指定位置显示指定字符//////////
  99. void write_zifu(uchar hang,uchar add,uchar dat)
  100. {
  101.         if(hang==1)   
  102.                 write_com(0x80+add);
  103.         else
  104.                 write_com(0x80+0x40+add);
  105.         write_data(dat);
  106. }

  107. /********************************************************************
  108. * 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
  109. * 功能 : 显示价格
  110. * 输入 : 行,列,需要输入1602的数据
  111. * 输出 : 无
  112. ***********************************************************************/
  113. void write_sfm4_price(uchar hang,uchar add,uint date)
  114. {
  115.         if(hang==1)   
  116.                 write_com(0x80+add);
  117.         else
  118.                 write_com(0x80+0x40+add);
  119.         write_data(0x30+date/1000%10);
  120.         write_data(0x30+date/100%10);
  121.         write_data('.');
  122.         write_data(0x30+date/10%10);
  123.         write_data(0x30+date%10);        
  124. }

  125. /****************开机液晶显示函数 初始化液晶的内容********************************/
  126. void init_1602_dis_csf()  //初始化液晶
  127. {                                                                    
  128.         write_string(1,0,"   W:0.000kg    ");
  129.         write_string(2,0,"P:00.00  Z:00.00");
  130.         write_zifu(2,7,0x5c);        //¥               
  131. //        write_zifu(2,15,0x5c);        //¥               

  132. }

  133. /*******************压力显示程序***********************/
  134. void write_1602_yl(uchar hang,uchar add,uint date)
  135. {
  136.         if(hang==1)   
  137.                 write_com(0x80+add);
  138.         else
  139.                 write_com(0x80+0x40+add);
  140.         write_data(0x30+date/1000%10);
  141.         write_data('.');
  142.         write_data(0x30+date/100%10);
  143.         write_data(0x30+date/10%10);
  144.         write_data(0x30+date%10);        
  145.         
  146. }


  147. void Delay__hx711_us(void)
  148. {
  149.         _nop_();
  150.         _nop_();
  151. }

  152. ulong ReadCount(void)        //增益128
  153. {
  154.         ulong count,value = 0;
  155.         uchar i;
  156.           hx711_dout=1;
  157.         Delay__hx711_us();
  158.           hx711_sck=0;
  159.           count=0;
  160.           while(hx711_dout)          ;
  161.           for(i=0;i<24;i++)
  162.         {
  163.                   hx711_sck=1;
  164.                   count=count<<1;
  165.                 hx711_sck=0;
  166.                   if(hx711_dout)
  167.                         count++;
  168.         }
  169.          hx711_sck=0;
  170.         Delay__hx711_us();
  171.         hx711_sck=1;  
  172.         return(count);
  173. }

  174. void get_pizhong()          //获取皮重,秤盘重量
  175. {
  176.         ulong hx711_dat;
  177.         hx711_dat=ReadCount();                //HX711AD转换数据处理
  178.         temp=(uint)(hx711_dat/100);        
  179. }

  180. void get_weight()          //获取被测物体重量
  181. {
  182.         ulong hx711_data,a;
  183.         uint get,aa;        
  184.         hx711_data=ReadCount();                   //HX711AD转换数据处理
  185.         get=(uint)(hx711_data/100);
  186.         if(get>temp)
  187.         {
  188.                 a=ReadCount();
  189.                 aa=(uint)(a/100)-temp;
  190.                 weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改
  191.         }
  192. }

  193. /************************************************/
  194. /*  由于称重传感器线性度参数的不同,而对获得的重量数据处理,
  195. 此处可能会根据不同称重传感器,程序的代码会有所不同      */        
  196. /************************************************/


  197. /*************定时器0初始化程序***************/
  198. void time_init()         
  199. {
  200.         EA   = 1;                   //开总中断
  201.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  202.         ET0  = 1;                  //开定时器0中断
  203.         TR0  = 1;                  //允许定时器0定时
  204. }

  205. /********************独立按键程序*****************/
  206. uchar key_can;         //按键值

  207. void key()         //独立按键程序
  208. {
  209.         static uchar key_new = 0, key_l;
  210.         key_can = 20;                   //按键值还原
  211.         P3 = 0x0f;
  212.         if((P3 & 0x0f) != 0x0f)                //按键按下
  213.         {
  214.                 delay_1ms(1);                     //按键消抖动
  215.                 if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
  216.                 {                                                //确认是按键按下
  217.                         key_new = 0;
  218.                         key_l = P3 | 0xf0;   //矩阵键盘扫描
  219.                         P3 = key_l;
  220.                         switch(P3)
  221.                         {
  222.                                 case 0xee:  key_can = 1;  break;  //得到按键值
  223.                                 case 0xde:  key_can = 4;  break;   //得到按键值
  224.                                 case 0xbe:  key_can = 7;  break;   //得到按键值
  225.                                 case 0x7e:  key_can = 10;  break;   //得到按键值
  226.         
  227.                                 case 0xed:  key_can = 2;  break;  //得到按键值
  228.                                 case 0xdd:  key_can = 5;  break;   //得到按键值
  229.                                 case 0xbd:  key_can = 8;  break;   //得到按键值
  230.                                 case 0x7d:  key_can = 0;  break;   //得到按键值
  231.         
  232.                                 case 0xeb:  key_can = 11;  break;  //得到按键值
  233.                                 case 0xdb:  key_can = 9;  break;   //得到按键值
  234.                                 case 0xbb:  key_can = 6;  break;   //得到按键值
  235.                                 case 0x7b:  key_can = 3;  break;   //得到按键值
  236.         
  237.                                 case 0xe7:  key_can = 15;  break;  //得到按键值
  238.                                 case 0xd7:  key_can = 14;  break;  //得到按键值
  239.                                 case 0xb7:  key_can = 13;  break;   //得到按键值
  240.                                 case 0x77:  key_can = 12;  break;  //得到按键值         
  241.                         }        
  242.                         beep = 0;  //蜂鸣器叫一声
  243.                         delay_1ms(100);
  244.                         beep = 1;
  245.                 }                        
  246.         }
  247.         else
  248.                 key_new = 1;        
  249. }

  250. /************按键控制函数*************/
  251. void key_with()
  252. {
  253.         if(key_can <= 9)   //数字键
  254.         {
  255.                 if(flag_p >= 4)
  256.                 {
  257.                         flag_p = 0;
  258.                 }
  259.                 if(flag_p == 0)
  260.                         price = key_can;
  261.                 else
  262.                 {
  263.                         price = price * 10 + key_can;            
  264.                 }           
  265.                 write_sfm4_price(2,2,price);        //显示单价               
  266.                 flag_p ++;
  267.         }
  268.         if(key_can == 15)   //删除键
  269.         {   
  270.                 if(price != 0 )
  271.                 {
  272.                         flag_p --;
  273.                         price /= 10;                 //删除
  274.                         write_sfm4_price(2,2,price);//显示单价                                
  275.                 }
  276.         }
  277.         if(key_can == 14)   //去皮
  278.         {
  279.                 get_pizhong();          //获取皮重,秤盘重量
  280.         }
  281.         if(key_can == 13)   //价格清零
  282.         {
  283.                 flag_p = 0;
  284.                 price = 0;
  285.                 write_sfm4_price(2,2,price);//显示单价                                
  286.         }
  287. }

  288. /*****************主函数********************/
  289. void main()
  290. {        
  291.         beep = 0;  //蜂鸣器叫一声
  292.         delay_1ms(100);
  293.         P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
  294.         time_init();                    //初始化定时器
  295. ……………………

  296. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于51单片机HX711传感器电子秤设计(原理图、程序源码、BOM等).rar (6.97 MB, 下载次数: 165)
回复

使用道具 举报

ID:64765 发表于 2020-4-10 14:35 | 显示全部楼层
描述很详细,的确为学习HX711应用的好资料,谢楼主分享。
回复

使用道具 举报

ID:510933 发表于 2020-4-20 16:30 | 显示全部楼层
非常感谢,资料很详尽,正好需要hx711方面的
回复

使用道具 举报

ID:582255 发表于 2020-4-20 22:58 来自手机 | 显示全部楼层
点赞,不知道有木有仿真?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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