電路原理圖如下:
電子秤原理圖.png (62.63 KB, 下載次數: 144)
下載附件
1.原理圖
2018-5-6 13:46 上傳
單片機源程序如下:
- /*************************************************************
- 電子秤
- 補充說明:
- ***************************************************************/
- #include<reg52.h>//頭文件
- #include<lcd12864.H>
- #include<HX711.h>
- #include<KEY.h>
- #include<math.h>
- #include<stdio.h>
- #define MAX 3 //宏定義,單價最大輸入3位數
- /************************引腳定義************************/
- sbit led=P3^2; //超重指示燈
- /************************變量定義************************/
- uchar key; //存儲按鍵值
- double price=0; //存儲零時單價
- double prices=0; //存儲最終單價
- bit price_f=0; //記錄輸入單價標志位
- bit price_w=0; //記錄輸入單價完成標志位
- uchar price_z=0; //存儲總價
- bit dian_f=0; //小數單價標志位
- bit dian_w=0; //小數單價標志位
- uchar n=0; //記錄當前輸入了幾位數
- /********************************************************
- 函數名稱:void fixed_display()
- 函數作用:固定顯示函數
- 參數說明:
- ********************************************************/
- void fixed_display()
- {
- LCD12864_display_string(2,1,"電子秤"); //2:表示第3列,1:表示第1行,所有關于顯示都一樣
- LCD12864_display_string(0,2,"重量:"); //0:表示第1列,2:表示第2行,所有關于顯示都一樣
- LCD12864_display_string(0,3,"單價: 0");
- LCD12864_display_string(0,4,"總價:");
- LCD12864_display_string(7,2,"g");
- LCD12864_image3216(6,3,ASI); //6:表示第7列,3:表示第3行,顯示【元/Kg】
- LCD12864_display_string(7,4,"元");
- }
- /********************************************************
- 函數名稱:void chuli_num(uchar keys)
- 函數作用:在輸入單價的時候按下數字按鍵處理函數
- 參數說明:
- ********************************************************/
- void chuli_num(uchar keys)
- {
- if((price_f==1&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判斷是否為輸入單價狀態,并且輸入未滿最大整數位數或者小數未滿一位,才可以繼續輸入
- {
- if(dian_f==0) //判斷是否為整數
- {
- price=price*10+keys;//單價計算
- n++; //輸入的位數加1
- if(n==MAX) //判斷是否輸入完成
- price_w=1; //是的話標記輸入完成
- }
- else //否者為小數
- {
- price=price+(float)keys/10;//單價計算 12+ 1/10=12.1
- dian_w=1; //標記小數輸入完成。因為單價最低也就0.1元,所以只能輸入一位小數
- price_w=1; //標記單價輸入完成
- }
- }
- }
- /********************************************************
- 函數名稱:void chuli()
- 函數作用:按鍵處理函數
- 參數說明:
- ********************************************************/
- void chuli()
- {
- /*****************按下數字鍵1~9鍵*****************/
- if(key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9')//判斷當前按下是否為0~9的數字鍵
- chuli_num(key-0x30);
- /*********************按下‘0’鍵***********************/
- if(key=='0')
- {
- if((price_f==1&&price!=0&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判斷是否為輸入單價狀態,并且輸入未滿最大整數位或者小數未滿一位,才可以繼續輸入
- {
- if(dian_f==0) //判斷是否為整數
- {
- price=price*10+0; //單價計算
- n++; //輸入位數加1
- if(n==MAX) //判斷是否輸入四位完成
- price_w=1; //是,標記輸入完成
- }
- else //小數
- {
- price=price+0.0; //單價計算
- dian_w=1; //標記小數輸入完成。
- price_w=1; //標記單價輸入完成
- }
- }
- }
- /*********************按下‘.’鍵***********************/
- if(key=='.')
- {
- if(price_f==1&&dian_f==0) //標記位當前單價是具有小數
- dian_f=1;
- }
- /*********************按下‘去皮’鍵***********************/
- if(key=='Q')
- {
- if(price_f!=1) //重新獲取初值,0kg對應的AD值
- init_val=fil();
- }
- /*********************按下‘單價’鍵***********************/
- if(key=='D')
- {
- price_f=1; //標記位單價輸入狀態
- LCD12864_display_string(3,3," ");
- }
- /*********************按下‘重輸’鍵***********************/
- if(key=='C')
- {
- if(price_f==1)
- {
- price_f=1; //清除所以數據,重新輸入單價
- price=0;
- n=0;
- price_w=0;
- dian_f=0;
- dian_w=0;
- LCD12864_display_string(3,3," ");
- }
- }
- /*********************按下‘退格’鍵***********************/
- if(key=='T') //13
- {
- if(price_f==1&&price!=0) //判斷是否為輸入狀態,并且當前輸入的單價不為0采集必要進行退格處理
- {
- if(dian_f==1) //小數
- {
- price_w=0;
- dian_w=0;
- dian_f=0;
- price=(ulong)price;
- LCD12864_display_string(3,3," ");
- }
- else //整數
- {
- n--; //輸入的位數減1
- price_w=0;
- price=(ulong)price/10;//單價計算
- LCD12864_display_string(3,3," ");
- }
- }
- else
- if(price_f==0)
- {
- prices=0;
- //清空顯示合計后的價格
- LCD12864_display_string(3,3," ");
- }
- }
- /*********************按下‘確認’鍵***********************/
- if(key=='=')
- {
- if(price_f==1) //按下確定鍵后,將輸入的單價記錄下來
- {
- prices=price; //記錄單價
- price_f=0; //以下清除所有變量
- price=0;
- n=0;
- price_w=0;
- dian_f=0;
- dian_w=0;
- }
- }
- }
- /********************************************************
- 函數名稱:void main()
- 函數作用:主函數
- 參數說明:
- ********************************************************/
- void main()
- {
- uchar weight_s[8]; //存儲重量轉換為字符串
- uchar price_s[4]="0"; //存儲單價轉換為字符串
- uchar z_s[8];
- uchar wei,i;
- LCD12864_init();
- /*LCD12864_display_string(1,2,"初始化.");
- init_val=fil2();
- LCD12864_display_string(1,2,"初始化..");
- init_val=(init_val+fil2())/2;
- LCD12864_display_string(1,2,"初始化...");
- init_val=(init_val+fil2())/2;*/
- write_com(0x01); //清除屏幕顯示
- LCD12864_image12864(num12864); //開機顯示啟動畫面
- init_val=fil2(); //讀取0kg初始值
- while(ii>=8000) //判斷模塊是否插接好
- {
- LCD12864_clear12864(); //清除開機畫面
- LCD12864_display_string(2,1,"☆警告☆");
- LCD12864_display_string(1,2,"未檢測到模塊");
- LCD12864_display_string(0,3,"關閉電源后檢測下");
- LCD12864_display_string(0,4,"HX711 是否插接好");
- }
- init_val=(init_val+fil2())/2; //讀取0kg初始值,這里多次采集取平均值,為了提高測量精度
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=fil2();
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=fil2();
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- LCD12864_clear12864(); //清除開機畫面
- fixed_display(); //顯示固定內容
- while(1) //死循環
- {
- if(price_f==0) //非單價輸入狀態
- {
- value=fil(); //采集實際AD
- if(value<init_val)
- value=(init_val-value)/418.251;//轉換成實際重量,其中最后一個數字是指1g所占的AD410.05
- //value=(init_val-value)/41.220;//轉換成實際重量,其中最后一個數字是指1g所占的AD值
- else
- {
- value=0; //重量=0
- led=1; //關閉led
- }
- if(value<=10000) //判斷是否超重
- //if(value<=100000)
- {
- led=1; //關閉超重警示
- //顯示實際重量
- wei=sprintf(weight_s,"%ld",(ulong)value);
- //wei=sprintf(weight_s,"%0.1f",(double)value/10);
- for(i=wei/2+3;i<7;i++)
- LCD12864_display_string(i,2," ");
- LCD12864_display_string(3,2,weight_s);
- //顯示總價
- wei=sprintf(z_s,"%0.1f",(double)value/1000*prices);
- //wei=sprintf(z_s,"%0.1f",(double)value/10000*prices);
- for(i=wei/2+3;i<7;i++)
- LCD12864_display_string(i,4," ");
- LCD12864_display_string(3,4,z_s);
- }
- else //超重
- {
- led=0; //指示燈警示
- LCD12864_display_string(3,2,"超重 ");//顯示“超重”提示
- }
- }
- key=keyscan();//獲取按鍵返回值
-
- if(key!=0xff) //判斷是否有按鍵按下
- {
- chuli(); //按鍵處理
- if(price_f==1) //單價輸入
- {
- if(dian_f==1)
- {
- sprintf(price_s,"%0.1f",price); //將價格轉換成字符,有小數
- LCD12864_display_string(3,3,price_s); //顯示價格
- LCD12864_clear3216(6,3);
- }
- else
- {
- sprintf(price_s,"%ld",(ulong)price); //將價格轉換成字符,整數
- LCD12864_display_string(3,3,price_s); //顯示價格
- LCD12864_clear3216(6,3);
- }
- }
- else
- {
- sprintf(price_s,"%0.1f",prices); //將價格轉換成字符,最終的價格
- LCD12864_display_string(3,3,price_s); //顯示價格
- LCD12864_image3216(6,3,ASI); //顯示【元/Kg】
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
電子秤源程序代碼(Keil).zip
(69.36 KB, 下載次數: 210)
2018-5-6 13:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|