|
HX711電子稱原理圖:
HX711電子秤使用說明:
商品代碼:
0001 香蕉
0002 蘋果
0003 橘子
0004 葡萄
0005 柚子
0006 橙子
0007 梨子
0008 西瓜
0009 木瓜
0010 桃子
鍵盤鍵位定義:
7 8 9 10(清零)
4 5 6 11(刪除) 總金額(P3.7)
1 2 3 12(去皮)
14(累計)0 15(.) 13(確定)
大體流程:
1.連接好傳感器及主板各部件,給系統(tǒng)通電
2.通電后,液晶顯示第一屏,包括學校、系部、專業(yè)、制作人以及作品名稱。
3.幾秒后,液晶顯示第二屏,大體格式是:
名稱數(shù)量:0000-00
重量: 0.000kg
單價: 0.00 元
金額:------- 元
4.名稱數(shù)量:0000-00,前面的0000表示商品代碼,如上面所示,后面00的代表數(shù)量。
例如:輸入0001-01,則先按1鍵,再按小數(shù)點,再按0,再按1即輸入了0001-01,然后按確定鍵,則顯示香蕉01.
注意:如果輸錯了,比如是0001-00,按確定鍵,即清零了,也就是你得重新輸入數(shù)據(jù)。
還有幾種情況,也是按確定鍵自動清零的。比如是0000-01,沒有這個商品編碼,則出錯。
再比如,我們設置的商品代碼范圍是1-10,則如果輸入的商品代碼不在范圍內(nèi),則按確定鍵即清零,需要重新輸入數(shù)據(jù)。
5.輸入完名稱數(shù)量,再按數(shù)字鍵,則是輸入單價,輸入單價后,按確定鍵,則計算出金額,并顯示出來。
6.如果不需要累計,下次稱重前,按一次清零即可。
如果需要累計,則在商品沒有拿下錢,按一次累計,然后拿下商品,再按一次清零即可進行下一次稱重。
7.清零前,必須在拿下商品的情況下才能準確回零。
8.去皮功能:先在傳感器支架上放上要去皮的,然后按一下去皮鍵,則重量那顯示0kg,表示去皮成功。這時,再放上商品,按操作順序進行操作。
9.總金額:當累計幾次后,需要算總金額時,按一下總金額鍵,即可算出總金額,并在屏幕顯示出來。
再按一次總金額即可清零,回到初始狀態(tài)。
10.輸入數(shù)字過程中,如果出錯,可以退格,也就類似電腦的backspace,向前刪除一位。
11.按鍵注意事項:按鍵時間不能過長,也不能過短,按鍵時間和按鍵壓力一定要適中,這樣才能正確讀取數(shù)據(jù)。
HX711電子稱部分源程序:
- #include<reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include<lcd12864.h>
- #include<hx711.h>
- #include<keyboard.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- #define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
- //定義量程系數(shù)
- #define RATIO 6797/1000
- //定義標識
- volatile bit FlagTest = 0; //定時測試標志,每0.5秒置位,測完清0
- volatile bit FlagKeyPress = 0; //有鍵按下標志,處理完畢清0
- volatile bit FlagSetPrice = 0; //價格設置狀態(tài)標志,設置好為1。
- //管腳定義
- //sbit LedA = P2^2;
- sbit beep = P1^5;
- sbit alert = P1^6;
- sbit key_all=P3^7; //總金額鍵
- //顯示用變量
- int Counter;
- uchar idata str1[6] = "000000";
- uchar code name0[]={"本次購物總金額:"};
- uchar code name1[]={"香蕉"};
- uchar code name2[]={"蘋果"};
- uchar code name3[]={"橘子"};
- uchar code name4[]={"葡萄"};
- uchar code name5[]={"柚子"};
- uchar code name6[]={"橙子"};
- uchar code name7[]={"梨子"};
- uchar code name8[]={"西瓜"};
- uchar code name9[]={"木瓜"};
- uchar code name10[]={"桃子"};
- int i, iTemp;
- //稱重用變量
- ulong idata FullScale; //滿量程AD值/1000
- ulong AdVal; //AD采樣值
- ulong weight; //重量值,單位g
- ulong idata price; //單價,長整型值,單位為分
- ulong idata money; //總價,長整型值,單位為分
- ulong dec_weight;
- //鍵盤處理變量
- uchar keycode;
- uchar DotPos; //小數(shù)點標志及位置
- uchar Dec_pi; //去皮變量
- uchar all_flag; //累計變量
- //標志位
- uchar num_name; //名稱數(shù)量標志
- uchar shuliang; //數(shù)量值
- ulong idata all_money; //累計
- //函數(shù)聲明
- void int2str(int, char *);
- void Data_Init();
- void Port_Init();
- void Timer0_Init();
- void Timer0_ISR () ;
- void INT1_Init();
- void KeyPress(uchar);
- void To_Zero();
- void Display_Namenum();
- void Display_Price();
- void Display_Weight();
- void Display_Money();
- void Display_Allmoney();
- //整型轉字符串的函數(shù),轉換范圍0--65536
- void int2str(int x, char* str)
- {
- int i=1;
- int tmp=10;
- while(x/tmp!=0)
- {
- i++;
- tmp*=10;
- }
- tmp=x;
- str[i]='\0';
- while(i>1)
- {
- str[--i]='0'+(tmp%10);
- tmp/=10;
- }
- str[0]=tmp+'0';
- }
- //重新找回零點,每次測量前調(diào)用
- void To_Zero()
- {
- FullScale=ReadCount()/1000;
- price=0;
- }
- //顯示名稱數(shù)量,單位為元,四位整數(shù),兩位小數(shù)
- void Display_Namenum()
- {
- uint i,j;
- uchar A1,A2,A3,A4;
- uchar B1,B2;
- i = price/100; //得到整數(shù)部分
- j = price - i*100;//得到小數(shù)部分
- // int2str(a,str1);
- A1=i/1000+48;
- A2=i%1000/100+48;
- A3=i%1000%100/10+48;
- A4=i%1000%100%10+48;
- B1=j/10+48;
- B2=j%10+48;
- //顯示整數(shù)部分
- Lcd_Pos(0,4);
- Lcd_Wdat(':');
- Lcd_Wdat(A1);
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- Lcd_Wdat('-');
- //顯示小數(shù)點, 小數(shù)點部分
- // int2str(j,str1);
- Lcd_Pos(0,7);
- Lcd_Wdat(B1);
- Lcd_Wdat(B2);
- }
- //顯示單價,單位為元,四位整數(shù),兩位小數(shù)
- void Display_Price()
- {
- uint i,j;
- uchar A1,A2,A3,A4;
- uchar B1,B2;
- i = price/100; //得到整數(shù)部分
- j = price - i*100;//得到小數(shù)部分
- // int2str(a,str1);
- A1=i/1000+48;
- A2=i%1000/100+48;
- A3=i%1000%100/10+48;
- A4=i%1000%100%10+48;
- B1=j/10+48;
- B2=j%10+48;
- //顯示整數(shù)部分
- if (i>=1000)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(A1);
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=100)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=10)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A4);
- }
- //顯示小數(shù)點, 小數(shù)點部分
- // int2str(j,str1);
- if(j<10)
- {
- Lcd_Pos(2,5);
- Lcd_Wdat('.');
- Lcd_Wdat('0');
- Lcd_Wdat(B2);
- Lcd_Wdat(' ');
- }
- else
- {
- Lcd_Pos(2,5);
- Lcd_Wdat('.');
- Lcd_Wdat(B1);
- Lcd_Wdat(B2);
- Lcd_Wdat(' ');
- }
- }
- //顯示重量,單位kg,兩位整數(shù),三位小數(shù)
- void Display_Weight()
- {
- uint i,j;
- uchar A1,A2;
- uchar B1,B2,B3;
- //weight單位是g
- i = weight/1000; //得到整數(shù)部分
- j = weight - i*1000;//得到小數(shù)部分
- A1=i/10+48;
- A2=i%10+48;
- B1=j/100+48;
- B2=j%100/10+48;
- B3=j%100%10+48;
- // int2str(i,str1);
- if (i>=10)
- {
-
- }
- else
- {
- Lcd_Pos(1,4);
- Lcd_Wdat(' ');
- Lcd_Wdat(A2);
- }
- // int2str(j,str1);
- if (j<10)
- {
- Lcd_Pos(1,5);
- Lcd_Wdat('.');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat(B3);
- }
- else if (j<100)
- {
- Lcd_Pos(1,5);
- Lcd_Wdat('.');
- Lcd_Wdat('0');
- Lcd_Wdat(B2);
- Lcd_Wdat(B3);
- }
- else
- {
- Lcd_Pos(1,5);
- Lcd_Wdat('.');
- Lcd_Wdat(B1);
- Lcd_Wdat(B2);
- Lcd_Wdat(B3);
- }
- }
- //顯示總價,單位為元,四位整數(shù),兩位小數(shù)
- void Display_Money()
- {
- uint i,j;
- uchar A1,A2,A3,A4;
- uchar B1,B2;
- if (money>999999) //超出顯示量程
- {
- Lcd_Pos(3,3);
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- return;
- }
- i = money/100; //得到整數(shù)部分
- j = money - i*100;//得到小數(shù)部分
- A1=i/1000+48;
- A2=i%1000/100+48;
- A3=i%1000%100/10+48;
- A4=i%1000%100%10+48;
- B1=j/10+48;
- B2=j%10+48;
- // int2str(i,str1);
- //顯示整數(shù)部分
- if (i>=1000)
- {
- Lcd_Pos(3,3);
- Lcd_Wdat(A1);
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=100)
- {
- Lcd_Pos(3,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=10)
- {
- Lcd_Pos(3,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else
- {
- Lcd_Pos(3,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A4);
- }
- //顯示小數(shù)點, 小數(shù)點部分
- // int2str(j,str1);
- if(j<10)
- {
- Lcd_Pos(3,5);
- Lcd_Wdat('.');
- Lcd_Wdat('0');
- Lcd_Wdat(B2);
- }
- else
- {
- Lcd_Pos(3,5);
- Lcd_Wdat('.');
- Lcd_Wdat(B1);
- Lcd_Wdat(B2);
- }
- }
- //顯示總金額,單位為元,四位整數(shù),兩位小數(shù)
- void Display_Allmoney()
- {
- uint i,j;
- uchar A1,A2,A3,A4;
- uchar B1,B2;
- // all_money=all_money/2;
- if (all_money>999999) //超出顯示量程
- {
- Lcd_Pos(3,3);
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- return;
- }
- i = all_money/100; //得到整數(shù)部分
- j = all_money - i*100;//得到小數(shù)部分
- A1=i/1000+48;
- A2=i%1000/100+48;
- A3=i%1000%100/10+48;
- A4=i%1000%100%10+48;
- B1=j/10+48;
- B2=j%10+48;
- // int2str(i,str1);
- //顯示整數(shù)部分
- if (i>=1000)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(A1);
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=100)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(A2);
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else if (i>=10)
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A3);
- Lcd_Wdat(A4);
- }
- else
- {
- Lcd_Pos(2,3);
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(' ');
- Lcd_Wdat(A4);
- }
- //顯示小數(shù)點, 小數(shù)點部分
- // int2str(j,str1);
- if(j<10)
- {
- Lcd_Pos(2,5);
- Lcd_Wdat('.');
- Lcd_Wdat('0');
- Lcd_Wdat(B2);
- }
- else
- {
- Lcd_Pos(2,5);
- Lcd_Wdat('.');
- Lcd_Wdat(B1);
- Lcd_Wdat(B2);
- }
- }
- //數(shù)據(jù)初始化
- void Data_Init()
- {
- price = 0;
- DotPos = 0;
- beep = 1;
- alert = 1;
- num_name=0;
- all_money=0;
- Dec_pi=0;
- dec_weight=0;
- all_flag=0;
- }
- //管腳配置
- void Port_Init()
- {
-
- }
- //定時器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允許定時器0中斷
- TMOD = 1; //定時器工作方式選擇
- TL0 = 0x06;
- TH0 = 0xf8; //定時器賦予初值
- TR0 = 1; //啟動定時器
- }
- //定時器0中斷
- void Timer0_ISR (void) interrupt 1 using 0
- {
- TL0 = 0x06;
- TH0 = 0xf8; //定時器賦予初值
- //每0.5秒鐘刷新重量
- Counter ++;
- if (Counter >= 200)
- {
- FlagTest = 1;
- Counter = 0;
- }
- }
- //按鍵響應程序,參數(shù)是鍵值
- //返回鍵值:
- // 7 8 9 10(清0)
- // 4 5 6 11(刪除)
- // 1 2 3 12(未定義)
- // 14(未定義) 0 15(.) 13(確定價格)
- void KeyPress(uchar keycode)
- {
- uint nam1,nam2;
- uchar i;
- switch (keycode)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- //目前在設置整數(shù)位,要注意price是整型,存儲單位為分
- if (DotPos == 0)
- {
- //最多只能設置到千位
- if (price<100000)
- {
- price=price*10+keycode*100;
- }
- }
- //目前在設置小數(shù)位
- else if (DotPos==1) //小數(shù)點后第一位
- {
- price=price+keycode*10;
- DotPos++;
- }
- else if (DotPos==2)
- {
- price=price+keycode;
- DotPos++;
- }
- if(num_name==0)
- {
- Display_Namenum();
- }
- else if(num_name==1)
- {
- Display_Price();
- }
- break;
- case 10: //清零鍵
- To_Zero();
- Display_Price();
- Display_Namenum();
- FlagSetPrice = 0;
- DotPos = 0;
- num_name=0;
- Dec_pi=0;
- dec_weight=0;
- break;
- case 11: //刪除鍵,按一次刪除最右一個數(shù)字
- if (DotPos==2)
- {
- price=price/10;
- price=price*10;
- DotPos--;
- }
- else if (DotPos==1)
- {
- price=price/100;
- price=price*100;
- DotPos--;
- }
- else if (DotPos==0)
- {
- price=price/1000;
- price=price*100;
- }
- if(num_name==0)
- {
- Display_Namenum();
- }
- else if(num_name==1)
- {
- Display_Price();
- }
- break;
- case 12: //
- Dec_pi=1; //去皮變量
- break;
- case 13: //確認鍵,名稱數(shù)量和單價
- if(num_name==0)
- {
- nam1=price/100;
- nam2=price-nam1*100;
- num_name=1;
- if(nam2!=0)
- {
- //顯示整數(shù)部分
- Lcd_Pos(0,4);
- Lcd_Wdat(':');
- Lcd_Wdat(' ');
- Lcd_Pos(0,5); //顯示位置為第四行的第1個字符
- i = 0;
- if(nam1==1)
- {
- while(name1[i] != '\0')
- {
- Lcd_Wdat(name1[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==2)
- {
- while(name2[i] != '\0')
- {
- Lcd_Wdat(name2[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==3)
- {
- while(name3[i] != '\0')
- {
- Lcd_Wdat(name3[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==4)
- {
- while(name4[i] != '\0')
- {
- Lcd_Wdat(name4[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==5)
- {
- while(name5[i] != '\0')
- {
- Lcd_Wdat(name5[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==6)
- {
- while(name6[i] != '\0')
- {
- Lcd_Wdat(name6[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==7)
- {
- while(name7[i] != '\0')
- {
- Lcd_Wdat(name7[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==8)
- {
- while(name8[i] != '\0')
- {
- Lcd_Wdat(name8[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==9)
- {
- while(name9[i] != '\0')
- {
- Lcd_Wdat(name9[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else if(nam1==10)
- {
- while(name10[i] != '\0')
- {
- Lcd_Wdat(name10[i]); //顯示相應表格中的字符
- i++;
- }
- }
- else
- {
- num_name=0;
- Lcd_Pos(0,4);
- Lcd_Wdat(':');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('-');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- }
- }
- else if(nam2==0)
- {
- num_name=0;
- Lcd_Pos(0,4);
- Lcd_Wdat(':');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- Lcd_Wdat('-');
- Lcd_Wdat('0');
- Lcd_Wdat('0');
- }
- shuliang=nam2;
- price=0;
- DotPos=0;
- Dec_pi=0;
- }
- else if(num_name==1)
- {
- FlagSetPrice = 1;
- DotPos=0;
- num_name=0;
- Dec_pi=0;
- }
- break;
- case 14: //累計
- all_money=all_money+money;
- break;
- case 15: //小數(shù)點按下
- if (DotPos == 0)
- {
- DotPos = 1; //小數(shù)點后第一位
- }
- break;
- }
- Delay(10);
- }
- void main()
- {
- // Rom_CS=1;
- Lcd_Init();
- EA = 0;
- Data_Init();
- Port_Init();
- Timer0_Init();
- //初始化完成,開中斷
- EA = 1;
- beep=1;
- //背光
- // LedA = 1;
- Lcd_Clear(); //clear all dots
- Lcd_Display1();
- Delay(1000);
- To_Zero();
- Lcd_Clear();
- Lcd_Display2();
- Display_Price();
- while(1)
- {
- //每0.5秒稱重一次
- if (FlagTest==1)
- {
- //稱重,得到重量值weight,單位為g
- AdVal=ReadCount();
- weight=FullScale-AdVal/1000;
- if (weight>0x8000) weight=0;
- weight=10000*weight/FullScale;
- weight=weight*RATIO;
-
- if(Dec_pi==1)
- {
- dec_weight=weight;
- Dec_pi=0;
- }
- weight=weight-dec_weight;
- //如果超量程,則報警
- if (weight >= 10000)
- {
- beep = 0;
- alert = 0;
- Lcd_Pos(1,4);
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Pos(3,3);
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- Lcd_Wdat('-');
- }
- //如果不超量程
- else
- {
- beep = 1;
- alert = 1;
- //顯示重量值
- Display_Weight();
- //如果單價設定好了,則計算價格
-
- …………余下代碼請下載附件…………
復制代碼
電子秤的完整程序代碼和原理圖等資料下載:
HX711完整單片機程序.rar
(206 KB, 下載次數(shù): 626)
2017-3-17 09:30 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|