找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机电子秤设计(程序,原理图分享)

[复制链接]
ID:747209 发表于 2020-5-8 20:53 | 显示全部楼层 |阅读模式
可去皮,重量微调,语音播报重量。

单片机源程序如下:
  1. #include "main.h"
  2. #include "LCD1602.h"
  3. #include "HX711.h"
  4. //#include"eeprom.h"

  5. unsigned long HX711_Buffer = 0;
  6. unsigned int Weight_Maopi = 0,Weight_Shiwu = 0;
  7. char Price_Count = 0;
  8. unsigned char KEY_NUM = 0;
  9. unsigned char Price_Buffer[3] = {0x00,0x00,0x00};
  10. unsigned long Money = 0;
  11. bit Flag_OK = 0;
  12. unsigned int Weight=10,s1num=0; //报警值初始化 按键计数标志
  13. float m__1=2.90;


  14. //语音播报程序
  15. sbit MUSIC_REST =P2^2;//语音芯片复位脚                                       
  16. sbit MUSIC_DATA =P2^1;//语音芯片脉冲识别
  17. sbit bus =P2^0;//语音芯片工作状态识别信号  
  18. unsigned char bbh,xm1,xm2,xm0,xm3;

  19. void delay_us(unsigned int us)
  20. {
  21.     while(us--)
  22.     {
  23.             _nop_();
  24.             _nop_();                 
  25.             _nop_();
  26.             _nop_();
  27.     }
  28. }
  29. void Music(unsigned char music_count)
  30. {
  31.     MUSIC_REST=1;
  32.     delay_us(200);
  33.     MUSIC_REST=0;
  34.     delay_us(200);

  35.     while(music_count>0)
  36.     {
  37.         MUSIC_DATA=1;
  38.         delay_us(100);
  39.         MUSIC_DATA=0;
  40.         delay_us(100);
  41.                 music_count--;
  42.     }
  43. }

  44. void Msc()
  45. {
  46.     if((xm0+xm1+xm2+xm3)!=0)                   //当超出测量范围时不进行播报
  47.         {
  48.                 Music(16);                                        //播报:“ 重量    ”
  49.                 while(!bus);
  50.                 if(xm0==0)
  51.                 {
  52.                               Music(2);                         //播报:“千位数具体值”          0
  53.                         while(!bus);       
  54.                 }                   
  55.                    else Music(xm0+2);                         //播报:“千位数具体值”
  56.                 while(!bus);
  57. //                Music(14);                                        //播报:“点”
  58. //                while(!bus);

  59.                 if(xm1==0)
  60.                 {
  61.                               Music(2);                         //播报:“百位数具体值”          0
  62.                         while(!bus);       
  63.                 }                   
  64.                    else Music(xm1+2);                         //播报:“千位数具体值”
  65.                 while(!bus);

  66.                 if((xm2+xm3)!=0)
  67.                 {          
  68.                        
  69.                         Music(xm2+2);                                //播报:“十分位的具体值”
  70.                         while(!bus);                               
  71.                         Music(xm3+2);                                //播报:“百分位的具体值”
  72.                         while(!bus);                   
  73.                         Music(15);                                //播报:“单位”
  74.                         while(!bus);
  75.                 }
  76.                 else
  77.                 {
  78.                         Music(15);                                //播报:“单位”
  79.                         while(!bus);       
  80.                 }
  81.         }          
  82. }
  83. //****************************************************
  84. //主函数
  85. //****************************************************
  86. void main()
  87. {
  88.         Init_LCD1602();                                                                        //初始化LCD1602

  89.         LCD1602_write_com(0x80);                                                //指针设置
  90.         LCD1602_write_word("Welcome to use! ");                        //开机画面第一行


  91.         Delay_ms(2000);                 //延时2s   

  92.         Price_Buffer[0] = 0;
  93.         Price_Buffer[1] = 0;
  94.         Price_Buffer[2] = 0;
  95.         Flag_OK = 0;

  96.         LCD1602_write_com(0x80);                                                //指针设置
  97.         LCD1602_write_word("  Test weight   ");//重量检测仪
  98.         LCD1602_write_com(0x80+0x40);                                //指针设置
  99.         LCD1602_write_word("weight:    g    ");

  100.        

  101.        
  102.         Get_Maopi();                                //称毛皮重量

  103.         while(1)
  104.         {
  105.                
  106.                         Get_Weight();                        //称重
  107.                         KEY_Scan();       
  108.         }
  109. }

  110. //****************************************************
  111. //称重
  112. //****************************************************
  113. void Get_Weight()
  114. {
  115.         HX711_Buffer = HX711_Read();
  116.         HX711_Buffer = HX711_Buffer/100;
  117.         if(HX711_Buffer > Weight_Maopi)                       
  118.         {
  119.                 Weight_Shiwu = HX711_Buffer;
  120.                 Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                                //获取实物的AD采样数值。
  121.        
  122.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/m__1+0.05);         //计算实物的实际重量
  123.                                                                                                                                                 //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的4.30这个除数。
  124.                                                                                                                                                 //当发现测试出来的重量偏大时,增加该数值。
  125.                                                                                                                                                 //如果测试出来的重量偏小时,减小改数值。
  126.                                                                                                                                                 //该数值一般在4.0-5.0之间。因传感器不同而定。
  127.                                                                                                                                                 //+0.05是为了四舍五入百分位
  128.        

  129.                    if(Weight_Shiwu >500 )Weight_Shiwu=500;
  130.                         if(Weight_Shiwu < 5)Weight_Shiwu=0;

  131.                         xm0=Weight_Shiwu/1000 ;
  132.                         xm1=Weight_Shiwu%1000/100;
  133.                         xm2=Weight_Shiwu%100/10;
  134.                         xm3=Weight_Shiwu%10;
  135.                         LCD1602_write_com(0x80+0x40+7);
  136.                         LCD1602_write_data(xm0+ 0x30);
  137.                         LCD1602_write_data(xm1 + 0x30);
  138.                         LCD1602_write_data(xm2 + 0x30);
  139.                         LCD1602_write_data(xm3 + 0x30);
  140.                        
  141.         }
  142.                                                   
  143.        
  144. }
  145. void delay(unsigned int x) //毫秒级延时函数
  146. {
  147.   unsigned int i,j;
  148.   for(i=x;i>0;i--)
  149.      for(j=110;j>0;j--);
  150. }
  151. void KEY_Scan()
  152. {
  153.           while(!k4)
  154.           {
  155.                   bbh=1;
  156.       }
  157.           if(bbh==1)                                        //bb=1调用一次播报程序
  158.           {
  159.                    bbh=0;
  160.                    Msc();
  161.            }
  162.             if(key1==0)                        //
  163.                 {
  164.                         delay(10);
  165.                         if(key1==0)
  166.                         {       
  167.                                 while(!key1);        //
  168.                                 Get_Maopi();                        //去皮       
  169.                         }
  170.                 }
  171.                 if(key2==0)                        //
  172.                 {
  173.                
  174.                         delay(10);
  175.                         if(key2==0)
  176.                         {       
  177.                                 while(!key2);        //        微调重量-
  178.                                 m__1=m__1+0.10;
  179.                                 if(m__1>=5.10)m__1=5.00;
  180.                                
  181.                         }
  182.                
  183.                 }
  184.                 if(key3==0)                        //
  185.                 {
  186.                
  187.                         delay(10);
  188.                         if(key3==0)
  189.                         {       
  190.                                 while(!key3);        // 微调重量+
  191.                                 m__1=m__1-0.10;
  192.                                 if(m__1<=1.10)m__1=2.50;
  193.                                
  194.                         }
  195.        
  196.                 }
  197. }

  198. //****************************************************
  199. //获取毛皮重量
  200. //****************************************************
  201. void Get_Maopi()
  202. {
  203.         HX711_Buffer = HX711_Read();
  204.         Weight_Maopi = HX711_Buffer/100;               
  205. }

  206. //****************************************************
  207. //MS延时函数(12M晶振下测试)
  208. //****************************************************
  209. void Delay_ms(unsigned int n)
  210. {
  211.         unsigned int  i,j;
  212.         for(i=0;i<n;i++)
  213.                 for(j=0;j<123;j++);
  214. }
复制代码

所有资料51hei提供下载:
电子称设计.zip (174.55 KB, 下载次数: 60)


回复

使用道具 举报

ID:774657 发表于 2020-6-12 17:24 | 显示全部楼层
做的真棒,点个赞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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