久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 分享一個基于51單片機的電子秤設計(LCD2864)的原理圖及源碼 [打印本頁]

作者: 啦啦啦我的    時間: 2018-5-6 13:49
標題: 分享一個基于51單片機的電子秤設計(LCD2864)的原理圖及源碼
電路原理圖如下:


單片機源程序如下:
  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, 下載次數: 210)





作者: luxuan    時間: 2018-5-6 22:01
大神,有沒有串口通信功能?
作者: 啦啦啦我的    時間: 2018-5-7 11:25
luxuan 發表于 2018-5-6 22:01
大神,有沒有串口通信功能?

串口通信功能得自己在程序里加
作者: coldfire    時間: 2018-5-8 16:31
感謝樓主分享
作者: feiji666    時間: 2018-5-8 17:49
原理圖很漂亮
作者: amireu    時間: 2018-5-8 21:29
有沒有元器件圖呢,假期作業準備動手做一個
作者: linyin    時間: 2018-7-12 18:27
不錯,贊一個,
作者: 酷酷的騰    時間: 2018-8-2 12:20
哥  那個我硬件搭起來了  就是軟件一直有問題  能回復一下嗎
作者: whiterice    時間: 2018-8-2 16:30
大神厲害了0.0
作者: whiterice    時間: 2018-8-2 16:31
感謝樓主分享
作者: 中恒電子asus    時間: 2018-8-4 13:47
感謝樓主分享

作者: 第1001個用戶    時間: 2019-4-6 16:55
正好需要,多謝樓主
作者: hellowC8051    時間: 2019-7-18 13:13
不錯,多謝樓主
作者: 2223.    時間: 2019-8-9 11:11
feiji666 發表于 2018-5-8 17:49
原理圖很漂亮

有原理圖嗎?

作者: xjhun    時間: 2019-11-23 10:33
電路圖是哪一個文件
作者: kino.    時間: 2019-12-10 15:30
很棒啊
作者: kino.    時間: 2019-12-12 13:12
我怎么沒看到總價的計算公式,就是重量乘單價的那個





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www.国产91 | 亚洲精品国产精品国自产在线 | 久久久精品一区二区 | 米奇成人网 | 精品一区二区三区四区在线 | 久久精品小短片 | ww亚洲ww亚在线观看 | 国产精品a一区二区三区网址 | 国产精品国产三级国产aⅴ无密码 | 亚洲一级黄色 | 欧美一区二区在线 | 国产成人免费视频网站高清观看视频 | 日本a∨视频 | 国产在线精品一区二区 | 黄色大片免费观看 | 精品一区二区三区四区视频 | 午夜成人免费视频 | 久久久蜜臀国产一区二区 | 精品欧美一区二区在线观看欧美熟 | 在线免费av电影 | 中文字幕在线电影观看 | 精品视频久久久 | 日韩免费 | 九九热在线视频观看这里只有精品 | 久久精品国产99国产精品亚洲 | 东方伊人免费在线观看 | 欧美aaa一级片 | 男女性毛片 | 久操国产| 亚洲国产成人精品女人久久久 | 久久久精品影院 | 国产一区二区免费电影 | 成人妇女免费播放久久久 | 日韩成人 | 精品日本久久久久久久久久 | 国产精品视频yy9299一区 | 亚洲午夜在线 | 超碰地址 | 久久中文视频 | 中文字幕免费 | www精品|