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