找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10727|回复: 16
收起左侧

分享一个基于51单片机的电子秤设计(LCD2864)的原理图及源码

  [复制链接]
ID:319175 发表于 2018-5-6 13:49 | 显示全部楼层 |阅读模式
电路原理图如下:

1.原理图

1.原理图


单片机源程序如下:
  1. /*************************************************************
  2.                       电子秤

  3. 补充说明:
  4. ***************************************************************/
  5. #include<reg52.h>//头文件
  6. #include<lcd12864.H>
  7. #include<HX711.h>
  8. #include<KEY.h>
  9. #include<math.h>
  10. #include<stdio.h>

  11. #define        MAX 3         //宏定义,单价最大输入3位数
  12. /************************引脚定义************************/
  13. sbit led=P3^2;         //超重指示灯
  14. /************************变量定义************************/
  15. uchar key;       //存储按键值
  16. double price=0;  //存储零时单价          
  17. double prices=0; //存储最终单价

  18. bit price_f=0;   //记录输入单价标志位
  19. bit price_w=0;   //记录输入单价完成标志位
  20. uchar price_z=0; //存储总价
  21. bit dian_f=0;    //小数单价标志位
  22. bit dian_w=0;    //小数单价标志位
  23. uchar n=0;             //记录当前输入了几位数
  24. /********************************************************
  25. 函数名称:void fixed_display()
  26. 函数作用:固定显示函数
  27. 参数说明:
  28. ********************************************************/
  29. void fixed_display()
  30. {  
  31.         LCD12864_display_string(2,1,"电子秤"); //2:表示第3列,1:表示第1行,所有关于显示都一样
  32.         LCD12864_display_string(0,2,"重量:");  //0:表示第1列,2:表示第2行,所有关于显示都一样
  33.         LCD12864_display_string(0,3,"单价: 0");
  34.         LCD12864_display_string(0,4,"总价:");


  35.         LCD12864_display_string(7,2,"g");
  36.         LCD12864_image3216(6,3,ASI);                   //6:表示第7列,3:表示第3行,显示【元/Kg】
  37.         LCD12864_display_string(7,4,"元");
  38. }
  39. /********************************************************
  40. 函数名称:void chuli_num(uchar keys)
  41. 函数作用:在输入单价的时候按下数字按键处理函数
  42. 参数说明:
  43. ********************************************************/
  44. void chuli_num(uchar keys)
  45. {
  46.         if((price_f==1&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判断是否为输入单价状态,并且输入未满最大整数位数或者小数未满一位,才可以继续输入
  47.         {
  48.                 if(dian_f==0)                    //判断是否为整数
  49.                 {
  50.                         price=price*10+keys;//单价计算
  51.                         n++;                                //输入的位数加1
  52.                         if(n==MAX)                        //判断是否输入完成
  53.                                 price_w=1;                //是的话标记输入完成               
  54.                 }
  55.                 else                                        //否者为小数
  56.                 {
  57.                         price=price+(float)keys/10;//单价计算         12+ 1/10=12.1
  58.                         dian_w=1;                                   //标记小数输入完成。因为单价最低也就0.1元,所以只能输入一位小数
  59.                         price_w=1;                                   //标记单价输入完成
  60.                 }
  61.         }       
  62. }
  63. /********************************************************
  64. 函数名称:void chuli()
  65. 函数作用:按键处理函数
  66. 参数说明:
  67. ********************************************************/
  68. void chuli()
  69. {
  70. /*****************按下数字键1~9键*****************/       
  71.         if(key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9')//判断当前按下是否为0~9的数字键
  72.                 chuli_num(key-0x30);
  73. /*********************按下‘0’键***********************/       
  74.         if(key=='0')
  75.         {
  76.                 if((price_f==1&&price!=0&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判断是否为输入单价状态,并且输入未满最大整数位或者小数未满一位,才可以继续输入
  77.                 {
  78.                         if(dian_f==0)                  //判断是否为整数
  79.                         {
  80.                                 price=price*10+0; //单价计算
  81.                                 n++;                          //输入位数加1
  82.                                 if(n==MAX)                  //判断是否输入四位完成
  83.                                         price_w=1;          //是,标记输入完成
  84.                         }
  85.                         else                                  //小数
  86.                         {
  87.                                 price=price+0.0;  //单价计算
  88.                                 dian_w=1;                  //标记小数输入完成。
  89.                                 price_w=1;                  //标记单价输入完成
  90.                         }       
  91.                 }
  92.         }
  93. /*********************按下‘.’键***********************/
  94.         if(key=='.')
  95.         {               
  96.                 if(price_f==1&&dian_f==0) //标记位当前单价是具有小数
  97.                         dian_f=1;
  98.         }
  99. /*********************按下‘去皮’键***********************/
  100.         if(key=='Q')
  101.         {
  102.                 if(price_f!=1)                          //重新获取初值,0kg对应的AD值
  103.                         init_val=fil();                  
  104.         }  
  105. /*********************按下‘单价’键***********************/
  106.         if(key=='D')
  107.         {
  108.                  price_f=1;                                  //标记位单价输入状态
  109.                  LCD12864_display_string(3,3,"        ");
  110.         }
  111. /*********************按下‘重输’键***********************/
  112.         if(key=='C')
  113.         {
  114.                 if(price_f==1)
  115.                 {
  116.                         price_f=1;                          //清除所以数据,重新输入单价
  117.                         price=0;
  118.                         n=0;
  119.                         price_w=0;
  120.                         dian_f=0;
  121.                         dian_w=0;
  122.                         LCD12864_display_string(3,3,"        ");
  123.                 }
  124.         }
  125. /*********************按下‘退格’键***********************/
  126.         if(key=='T')                                          //13
  127.         {
  128.                  if(price_f==1&&price!=0) //判断是否为输入状态,并且当前输入的单价不为0采集必要进行退格处理
  129.                  {
  130.                          if(dian_f==1)                  //小数
  131.                         {
  132.                                 price_w=0;
  133.                                 dian_w=0;
  134.                                 dian_f=0;
  135.                                 price=(ulong)price;       
  136.                                 LCD12864_display_string(3,3,"        ");
  137.                         }
  138.                         else                                  //整数
  139.                         {
  140.                                 n--;                          //输入的位数减1
  141.                                 price_w=0;                                                                 
  142.                                 price=(ulong)price/10;//单价计算
  143.                                 LCD12864_display_string(3,3,"        ");
  144.                         }
  145.                  }
  146.                  else
  147.                          if(price_f==0)
  148.                          {
  149.                                   prices=0;
  150.                                  //清空显示合计后的价格
  151.                                  LCD12864_display_string(3,3,"        ");
  152.                          }
  153.         }
  154. /*********************按下‘确认’键***********************/
  155.         if(key=='=')
  156.         {
  157.                 if(price_f==1)                          //按下确定键后,将输入的单价记录下来
  158.                 {
  159.                          prices=price;                  //记录单价
  160.                          price_f=0;                          //以下清除所有变量
  161.                          price=0;
  162.                          n=0;
  163.                          price_w=0;
  164.                          dian_f=0;
  165.                          dian_w=0;
  166.                  }
  167.         }
  168. }
  169. /********************************************************
  170. 函数名称:void main()
  171. 函数作用:主函数
  172. 参数说明:
  173. ********************************************************/
  174. void main()
  175. {
  176.         uchar weight_s[8];          //存储重量转换为字符串
  177.         uchar price_s[4]="0"; //存储单价转换为字符串
  178.         uchar z_s[8];
  179.         uchar wei,i;
  180.         LCD12864_init();

  181.         /*LCD12864_display_string(1,2,"初始化.");
  182.         init_val=fil2();
  183.         LCD12864_display_string(1,2,"初始化..");
  184.         init_val=(init_val+fil2())/2;
  185.         LCD12864_display_string(1,2,"初始化...");
  186.         init_val=(init_val+fil2())/2;*/
  187.         write_com(0x01);                                  //清除屏幕显示

  188.         LCD12864_image12864(num12864);        //开机显示启动画面
  189.         init_val=fil2();                                //读取0kg初始值
  190.         while(ii>=8000)                                        //判断模块是否插接好
  191.         {
  192.                 LCD12864_clear12864();                //清除开机画面       
  193.                 LCD12864_display_string(2,1,"☆警告☆");          
  194.                 LCD12864_display_string(1,2,"未检测到模块");
  195.                 LCD12864_display_string(0,3,"关闭电源后检测下");
  196.                 LCD12864_display_string(0,4,"HX711 是否插接好");               
  197.         }
  198.         init_val=(init_val+fil2())/2;        //读取0kg初始值,这里多次采集取平均值,为了提高测量精度
  199.         init_val=(init_val+fil2())/2;
  200.         init_val=(init_val+fil2())/2;
  201.         init_val=(init_val+fil2())/2;
  202.         init_val=(init_val+fil2())/2;
  203.         init_val=fil2();
  204.         init_val=(init_val+fil2())/2;
  205.         init_val=(init_val+fil2())/2;
  206.         init_val=(init_val+fil2())/2;
  207.         init_val=(init_val+fil2())/2;
  208.         init_val=fil2();
  209.         init_val=(init_val+fil2())/2;
  210.         init_val=(init_val+fil2())/2;
  211.         init_val=(init_val+fil2())/2;
  212.         LCD12864_clear12864();                        //清除开机画面
  213.         fixed_display();                                //显示固定内容
  214.         while(1)                                                //死循环
  215.         {
  216.                 if(price_f==0)                    //非单价输入状态
  217.                 {
  218.                         value=fil();            //采集实际AD
  219.                         if(value<init_val)
  220.                                 value=(init_val-value)/418.251;//转换成实际重量,其中最后一个数字是指1g所占的AD410.05
  221.                                 //value=(init_val-value)/41.220;//转换成实际重量,其中最后一个数字是指1g所占的AD值                          
  222.                         else
  223.                         {
  224.                                 value=0;                        //重量=0                       
  225.                                 led=1;                                //关闭led
  226.                         }
  227.                         if(value<=10000)            //判断是否超重
  228.                         //if(value<=100000)
  229.                         {
  230.                                 led=1;                    //关闭超重警示
  231.                                 //显示实际重量
  232.                             wei=sprintf(weight_s,"%ld",(ulong)value);
  233.                                 //wei=sprintf(weight_s,"%0.1f",(double)value/10);
  234.                                 for(i=wei/2+3;i<7;i++)
  235.                                         LCD12864_display_string(i,2,"  ");
  236.                                 LCD12864_display_string(3,2,weight_s);
  237.                                 //显示总价
  238.                                 wei=sprintf(z_s,"%0.1f",(double)value/1000*prices);
  239.                                 //wei=sprintf(z_s,"%0.1f",(double)value/10000*prices);
  240.                                 for(i=wei/2+3;i<7;i++)
  241.                                         LCD12864_display_string(i,4,"  ");
  242.                                 LCD12864_display_string(3,4,z_s);
  243.                         }
  244.                         else                                //超重
  245.                         {
  246.                                 led=0;                        //指示灯警示
  247.                                 LCD12864_display_string(3,2,"超重    ");//显示“超重”提示
  248.                         }                       
  249.                 }
  250.                 key=keyscan();//获取按键返回值
  251.        
  252.                 if(key!=0xff) //判断是否有按键按下
  253.                 {
  254.                         chuli();  //按键处理
  255.                         if(price_f==1)        //单价输入
  256.                         {
  257.                                 if(dian_f==1)
  258.                                 {
  259.                                         sprintf(price_s,"%0.1f",price);                   //将价格转换成字符,有小数
  260.                                         LCD12864_display_string(3,3,price_s);  //显示价格
  261.                                         LCD12864_clear3216(6,3);
  262.                                 }
  263.                                 else
  264.                                 {
  265.                                         sprintf(price_s,"%ld",(ulong)price);   //将价格转换成字符,整数
  266.                                         LCD12864_display_string(3,3,price_s);  //显示价格
  267.                                         LCD12864_clear3216(6,3);
  268.                                 }
  269.                         }
  270.                         else
  271.                         {
  272.                                 sprintf(price_s,"%0.1f",prices);                   //将价格转换成字符,最终的价格
  273.                                 LCD12864_display_string(3,3,price_s);           //显示价格
  274.                                 LCD12864_image3216(6,3,ASI);                           //显示【元/Kg】
  275.                         }                        
  276.                 }                        
  277.         }
  278. }
复制代码

所有资料51hei提供下载:
电子秤源程序代码(Keil).zip (69.36 KB, 下载次数: 209)

评分

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

查看全部评分

回复

使用道具 举报

ID:307391 发表于 2018-5-6 22:01 | 显示全部楼层
大神,有没有串口通信功能?
回复

使用道具 举报

ID:319175 发表于 2018-5-7 11:25 | 显示全部楼层
luxuan 发表于 2018-5-6 22:01
大神,有没有串口通信功能?

串口通信功能得自己在程序里加
回复

使用道具 举报

ID:107906 发表于 2018-5-8 16:31 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:313328 发表于 2018-5-8 17:49 | 显示全部楼层
原理图很漂亮
回复

使用道具 举报

ID:325499 发表于 2018-5-8 21:29 | 显示全部楼层
有没有元器件图呢,假期作业准备动手做一个
回复

使用道具 举报

ID:370415 发表于 2018-7-12 18:27 | 显示全部楼层
不错,赞一个,
回复

使用道具 举报

ID:382025 发表于 2018-8-2 12:20 来自手机 | 显示全部楼层
哥  那个我硬件搭起来了  就是软件一直有问题  能回复一下吗
回复

使用道具 举报

ID:382221 发表于 2018-8-2 16:30 | 显示全部楼层
大神厉害了0.0
回复

使用道具 举报

ID:382221 发表于 2018-8-2 16:31 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:377382 发表于 2018-8-4 13:47 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:505823 发表于 2019-4-6 16:55 | 显示全部楼层
正好需要,多谢楼主
回复

使用道具 举报

ID:328121 发表于 2019-7-18 13:13 | 显示全部楼层
不错,多谢楼主
回复

使用道具 举报

ID:596808 发表于 2019-8-9 11:11 | 显示全部楼层

有原理图吗?
回复

使用道具 举报

ID:647690 发表于 2019-11-23 10:33 | 显示全部楼层
电路图是哪一个文件
回复

使用道具 举报

ID:448997 发表于 2019-12-10 15:30 | 显示全部楼层
很棒啊
回复

使用道具 举报

ID:448997 发表于 2019-12-12 13:12 | 显示全部楼层
我怎么没看到总价的计算公式,就是重量乘单价的那个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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