欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6080|回復: 8
打印 上一主題 下一主題
收起左側

51單片機實用電子稱設計 AD Proteus keil源程序齊全

[復制鏈接]
跳轉到指定樓層
樓主
51單片機電子秤資料分享給51hei的朋友們

3具體要求
(1)能用簡易鍵盤設置單價,加重后能同時顯示重量、金額和單價;
(2)重量顯示:單位為公斤;最大稱重為9.999公斤,重量誤差不大于±0.005公斤;
(3)單價金額及總價金額顯示:單價金額和總價金額的單位為元,最大金額數值為9999.99元,總價金額誤差不大于0.01元;
(4)具有去皮功能和總額累加計算功能。
設計步驟:擬定設計方案,寫出必要的設計步驟和參數計算,畫出邏輯電路圖,仿真與分析、寫出課程設計說明書。

4完成后應上交的材料

1.一張整體電路原理圖。
2.課程設計說明書。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


原理圖(工程文件可在本帖附件中下載):


實用電子稱單片機源程序如下:
  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黑下載附件…………
復制代碼


所有資料51hei提供下載:
電子秤.zip (207.97 KB, 下載次數: 157)


評分

參與人數 1黑幣 +5 收起 理由
cyfdc51 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:368940 發表于 2018-7-10 19:35 | 只看該作者
贊,這個程序很好用,學會了很多東西
回復

使用道具 舉報

板凳
ID:218113 發表于 2018-7-14 10:09 | 只看該作者
非常好,感謝
回復

使用道具 舉報

地板
ID:92810 發表于 2018-11-3 00:43 | 只看該作者
下載下來學習學習下咯
回復

使用道具 舉報

5#
ID:439565 發表于 2018-12-4 20:45 | 只看該作者
樓主。
回復

使用道具 舉報

6#
ID:439565 發表于 2018-12-12 09:47 | 只看該作者
樓主能不能弄成那種預設置單價的鍵盤。比如按下1,預設置單價100,按下鍵盤2,單價顯示200,。以此類推
回復

使用道具 舉報

7#
ID:582112 發表于 2020-4-15 13:46 | 只看該作者
不錯不錯
回復

使用道具 舉報

8#
ID:402026 發表于 2020-4-16 11:24 | 只看該作者
從您這里我又學會了很多!
回復

使用道具 舉報

9#
ID:743745 發表于 2020-5-13 22:26 | 只看該作者
謝謝樓主
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表