找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4806|回复: 8
收起左侧

51单片机实用电子称设计 AD Proteus keil源程序齐全

[复制链接]
ID:311755 发表于 2018-4-19 16:16 | 显示全部楼层 |阅读模式
51单片机电子秤资料分享给51hei的朋友们

3具体要求
(1)能用简易键盘设置单价,加重后能同时显示重量、金额和单价;
(2)重量显示:单位为公斤;最大称重为9.999公斤,重量误差不大于±0.005公斤;
(3)单价金额及总价金额显示:单价金额和总价金额的单位为元,最大金额数值为9999.99元,总价金额误差不大于0.01元;
(4)具有去皮功能和总额累加计算功能。
设计步骤:拟定设计方案,写出必要的设计步骤和参数计算,画出逻辑电路图,仿真与分析、写出课程设计说明书。

4完成后应上交的材料

1.一张整体电路原理图。
2.课程设计说明书。

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

原理图(工程文件可在本帖附件中下载):
0.jpg

实用电子称单片机源程序如下:
  1. #include<reg52.h>  
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. extern void ADC();
  5. extern uint qian,bai,shi,ge;
  6. uchar  table[]="P:000.00";  
  7. uchar code table1[]="$:0000.00RMB";
  8. uchar code table2[]="W:0.000kg";
  9. uchar tab[]="welcome to use!" ;
  10. sbit lcden=P3^3; //LCD1602的en引脚段
  11. sbit lcdrs=P3^4;// rs引脚端
  12. sbit cs=P3^2; //ADC0804的片选信号  
  13. uchar num;
  14. uint a,b,c,d,e;
  15. double weight,price,comulation,total,scale;
  16. uchar bt=0,key,clear,complete,sum,pot,temp,delete,flag,clean;
  17. void delay(uint z) //延时函数
  18. {  
  19.         uint x,y;
  20.         for(x=z;x>0;x--)
  21.         for(y=110;y>0;y--);
  22. }  
  23. void write_com(uchar com)//写指令的地址
  24. {  
  25.         lcdrs=0;//写指令
  26.         P0=com;
  27.         delay(5);
  28.         lcden=1;
  29.         delay(5);
  30.         lcden=0;
  31. }

  32. void write_data(uchar date) //写数据
  33. {  
  34.         lcdrs=1;
  35.         P0=date;
  36.         delay(5);
  37.         lcden=1;
  38.         delay(5);
  39.         lcden=0;
  40. }  
  41. void init() //LCD1602的初始化
  42. {  
  43.         lcden=0;  
  44.         write_com(0x38);//显示模式设置       
  45.         write_com(0x0c); //开显示,不显示光标,光标不闪烁       
  46.         write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,整屏显示不移动       
  47.         write_com(0x01); //清屏
  48. }  
  49. void display(double a) //显示价格  两个变量分别为单价和重量
  50. {                        
  51.         long  tep;  //定义中间变量
  52.         uint a1,a2,a3,a4,a5,a6; //中间变量
  53.         tep=(long)(a*100); //temp=temp*b相当于价格乘上重量
  54.         a1=tep/100000; //千位上的值
  55.         a2=tep%100000/10000; //百位上的值
  56.         a3=tep%100000%10000/1000; //十位上的值
  57.         a4=tep%100000%10000%1000/100; //个位上的值
  58.         a5=tep%100000%10000%1000%100/10; //小数点后一位
  59.         a6=tep%100000%10000%1000%100%10;         //小数点后两位
  60.         write_com(0xc2); //写入地址第二行第三个开始
  61.         write_data(0x30+a1); //写入数据由于LED的情况
  62.         write_com(0xc3); //第四个开始
  63.         write_data(0x30+a2);
  64.         write_com(0xc4);
  65.         write_data(0x30+a3);
  66.         write_com(0xc5);            
  67.         write_data(0x30+a4);
  68.         write_com(0xc6);
  69.         write_data('.');
  70.         write_com(0xc7);
  71.         write_data(0x30+a5);
  72.         write_com(0xc8);
  73.         write_data(0x30+a6);
  74. }  

  75. void keyscan() //键盘扫描
  76. {  
  77.         P2=0xfe;
  78.         temp=P2;   
  79.         temp=temp&0xf0;
  80.         if(temp!=0xf0)  //第一次确认
  81.         {  
  82.                 delay(10);  
  83.                 if(temp!=0xf0)            //第二次确认
  84.                 {
  85.                         temp=P2;
  86.                         switch(temp)
  87.                         {
  88.                         case 0xee:
  89.                                 key=1;
  90.                                 bt++;
  91.                                 break;
  92.                         case 0xde:
  93.                                 key=2;
  94.                                 bt++;
  95.                                 break;
  96.                         case 0xbe:
  97.                                 key=3;
  98.                                 bt++;
  99.                                 break;
  100.                         }
  101.                         while(temp!=0xf0)
  102.                         {
  103.                                 temp=P2;
  104.                                 temp=temp&0xf0;
  105.                         }
  106.                 }
  107.         }  
  108.         P2=0xfd;
  109.         temp=P2;   
  110.         temp=temp&0xf0;
  111.         if(temp!=0xf0)
  112.         {  
  113.                 delay(10);
  114.                 if(temp!=0xf0)
  115.                 {
  116.                         temp=P2;
  117.                         switch(temp)
  118.                         {
  119.                         case 0xed:
  120.                                 key=4;
  121.                                 bt++;
  122.                                 break;  
  123.                         case 0xdd:
  124.                                 key=5;
  125.                                 bt++;
  126.                                 break;
  127.                         case 0xbd:
  128.                                 key=6;
  129.                                 bt++;
  130.                                 break;
  131.                         case 0x7d:
  132.                                 pot=1;
  133.                                 break;
  134.                         }
  135.                         while(temp!=0xf0)
  136.                         {
  137.                                 temp=P2;
  138.                                 temp=temp&0xf0;
  139.                         }
  140.                 }
  141.         }  
  142.         P2=0xfb;
  143.         temp=P2;  
  144.         temp=temp&0xf0;
  145.         if(temp!=0xf0)
  146.         {  
  147.                 delay(10);
  148.                 if(temp!=0xf0)
  149.                 {
  150.                         temp=P2;
  151.                         switch(temp)
  152.                         {
  153.                         case 0xeb:
  154.                                 key=7;
  155.                                 bt++;
  156.                                 break;
  157.                         case 0xdb:
  158.                                 key=8;
  159.                                 bt++;
  160.                                 break;
  161.                         case 0xbb:
  162.                                 key=9;
  163.                                 bt++;
  164.                                 break;
  165.                         case 0x7b: //去皮
  166.                                 delete=1;
  167.                                 break;
  168.                         }
  169.                         while(temp!=0xf0)
  170.                         {
  171.                                 temp=P2;  
  172.                                 temp=temp&0xf0;
  173.                         }
  174.                 }
  175.         }  
  176.         P2=0xf7;
  177.         temp=P2;  
  178.         temp=temp&0xf0;
  179.         if(temp!=0xf0)
  180.         {  
  181.                 delay(10);  
  182.                 if(temp!=0xf0)
  183.                 {
  184.                         temp=P2;
  185.                         switch(temp)
  186.                         {
  187.                         case 0xe7: //计算
  188.                                 complete=1;
  189.                                 break;
  190.                         case 0xd7:
  191.                                 key=0;
  192.                                 bt++;
  193.                                 break;
  194.                         case 0xb7: //清0
  195.                                 clear=1;
  196.                                 break;
  197.                         case 0x77: //累加
  198.                                 sum=1;
  199.                                 break;
  200.                         }         
  201.                         while(temp!=0xf0)
  202.                         {
  203.                                 temp=P2;
  204.                                 temp=temp&0xf0;
  205.                         }
  206.                 }
  207.         }
  208. }
  209. void getprice()
  210. {
  211.         if(bt<=5)
  212.         {       
  213.                 switch(bt)
  214.                 {
  215.                 case 1:
  216.                         a=key;
  217.                         break;
  218.                 case 2:
  219.                         b=key;
  220.                         break;
  221.                 case 3:
  222.                         c=key;
  223.                         break;
  224.                 case 4:
  225.                         d=key;
  226.                         break;
  227.                 case 5:
  228.                         e=key;
  229.                         break;
  230.                 }                  
  231.         }
  232.         price=a*100+b*10+c+d*0.1+e*0.01;//获得价格
  233. }
  234. void showprice(double b)
  235. {
  236.         long j;
  237.         uint o,p,q,r,s;
  238.         j=(long)(b*100);
  239.         o=j/10000;
  240.         p=j%10000/1000;
  241.         q=j%10000%1000/100;
  242.         r=j%10000%1000%100/10;
  243.         s=j%10000%1000%100%10;
  244.         if(bt<=5)
  245.         {       
  246.                 switch(bt)
  247.                 {
  248.                 case 1:
  249.                         write_com(0x80+2);
  250.                         write_data(0x30+o);
  251.                         break;
  252.                 case 2:
  253.                         write_com(0x80+3);
  254.                         write_data(0x30+p);
  255.                         break;
  256.                 case 3:
  257.                         write_com(0x80+4);
  258.                         write_data(0x30+q);
  259.                         break;
  260.                 case 4:
  261.                         write_com(0x80+6);
  262.                         write_data(0x30+r);
  263.                         break;
  264.                 case 5:
  265.                         write_com(0x80+7);
  266.                         write_data(0x30+s);
  267.                         break;
  268.                 }                  
  269.         }
  270. }
  271. void getweight()
  272. {       
  273.         ADC(); //通过ADC获得个十百的大小
  274.         weight=qian+bai*0.1+shi*0.01+ge*0.001-0.625;
  275. }
  276. void showweight(double a)
  277. {
  278.         long i;
  279.         i=(long)(a*1000);
  280.         write_com(0x80+10);
  281.         write_data(0x30+i/1000);
  282.         write_com(0x80+12); //显示重量的地方从第一行第十一个开始
  283.         write_data(0x30+(i%1000)/100);
  284.         write_com(0x80+13);
  285.         write_data(0x30+((i%1000)%100)/10);
  286.         write_com(0x80+14);
  287.         write_data(0x30+((i%1000)%100)%10);
  288. }


  289. void main()
  290. {   
  291.         init(); //初始化
  292.         write_com(0x80);
  293.         for(num=0;num<16;num++)
  294.         {
  295.                 write_data(tab[num]);
  296.         }
  297.         delay(1000);
  298.         write_com(0x80); //地址为第一行第一个
  299.         for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
  300.         {  
  301.                 write_data(table[num]);
  302.                 delay(20);
  303.         }   
  304.         write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
  305.         for(num=0;num<9;num++)
  306.         {  
  307.                 write_data(table2[num]);
  308.                 delay(20);
  309.         }   
  310.         write_com(0x80+0x40); //地址为第二行第一个
  311.         for(num=0;num<13;num++) //在num为0~12时写下字符
  312.         {  
  313.                 write_data(table1[num]);
  314.                 delay(20);
  315.         }  
  316.         while(1) //程序运行时调keyscan函数进行显示以及其他判断
  317.         {  
  318.                 keyscan();
  319.                 getprice();
  320.                 getweight();
  321.                 if(clear==1)
  322.                 {
  323.                         write_com(0x80); //地址为第一行第一个
  324.                         for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
  325.                         {  
  326.                                 write_data(table[num]);
  327.                                 delay(10);
  328.                         }   
  329.                         write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
  330.                         for(num=0;num<9;num++)
  331.                         {  
  332.                                 write_data(table2[num]);
  333.                                 delay(10);
  334.                         }   
  335.                         write_com(0x80+0x40); //地址为第二行第一个
  336.                         for(num=0;num<13;num++) //在num为0~12时写下字符
  337.                         {  
  338.                                 write_data(table1[num]);
  339.                                 delay(10);
  340.                         }
  341.                         bt=0;
  342.                         key=0;
  343.                         price=0;
  344.                         weight=0;
  345.                         delete=0;
  346.                         sum=0;
  347.                         complete=0;
  348.                         comulation=0;
  349.                         total=0;
  350.                         scale=0;
  351.                         flag=0;
  352.                         pot=0;
  353.                         clean=1;
  354.                         clear=0;
  355.                 }
  356.                 if(pot==1)
  357.                 {
  358.                         write_com(0x80+5);
  359.                         write_data('.');
  360.                         pot=0;
  361.                 }
  362.                 if(sum==1)
  363.                 {
  364.                         write_com(0x80); //地址为第一行第一个
  365.                         for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
  366.                         {  
  367.                                 write_data(table[num]);
  368.                                 delay(10);
  369.                         }   
  370.                         write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
  371.                         for(num=0;num<9;num++)
  372.                         {  
  373.                                 write_data(table2[num]);
  374.                                 delay(10);
  375. ……………………

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

所有资料51hei提供下载:
电子秤.zip (207.97 KB, 下载次数: 156)

评分

参与人数 1黑币 +5 收起 理由
cyfdc51 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:368940 发表于 2018-7-10 19:35 | 显示全部楼层
赞,这个程序很好用,学会了很多东西
回复

使用道具 举报

ID:218113 发表于 2018-7-14 10:09 | 显示全部楼层
非常好,感谢
回复

使用道具 举报

ID:92810 发表于 2018-11-3 00:43 | 显示全部楼层
下载下来学习学习下咯
回复

使用道具 举报

ID:439565 发表于 2018-12-4 20:45 | 显示全部楼层
楼主。
回复

使用道具 举报

ID:439565 发表于 2018-12-12 09:47 | 显示全部楼层
楼主能不能弄成那种预设置单价的键盘。比如按下1,预设置单价100,按下键盘2,单价显示200,。以此类推
回复

使用道具 举报

ID:582112 发表于 2020-4-15 13:46 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:402026 发表于 2020-4-16 11:24 | 显示全部楼层
从您这里我又学会了很多!
回复

使用道具 举报

ID:743745 发表于 2020-5-13 22:26 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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