|
此程序適用單片機(jī)類(lèi)型STC89C52RC
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include<lcd12864.h>
- #include<hx711.h>
- #include<eeprom52.h>
- #include<keyboard.h>
- #define MAX 10000
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- #define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
- //定義量程系數(shù)
- //#define RATIO 2356/1000
- uint RATIO;
- //定義標(biāo)識(shí)
- volatile bit FlagTest = 0; //定時(shí)測(cè)試標(biāo)志,每0.5秒置位,測(cè)完清0
- volatile bit FlagKeyPress = 0; //有鍵按下標(biāo)志,處理完畢清0
- volatile bit FlagSetPrice = 0; //價(jià)格設(shè)置狀態(tài)標(biāo)志,設(shè)置好為1?
- volatile bit ClearWeighFlag = 0; //傳感器調(diào)零標(biāo)志位,清除0漂?
- volatile bit wtk = 0; //稱(chēng)重/時(shí)間模式
- //管腳定義
- sbit beep = P3^3;
- sbit alert = P3^4;
- //顯示用變量
- int Counter;
- uchar idata str1[6] = "000000";
- int i, iTemp;
- //稱(chēng)重用變量
- ulong idata FullScale; //滿量程AD值/1000
- ulong AdVal; //AD采樣值
- ulong weight; //重量值,單位g
- ulong idata price; //單價(jià),長(zhǎng)整型值,單位為分
- ulong idata money; //總價(jià),長(zhǎng)整型值,單位為分
- ulong idata pricebc; //單價(jià),長(zhǎng)整型值,單位為分
- //鍵盤(pán)處理變量
- uchar keycode;
- uchar DotPos; //小數(shù)點(diǎn)標(biāo)志及位置
- uchar wttime;//
- //函數(shù)聲明
- void int2str(int, char *);
- void Data_Init();
- void Timer0_Init();
- void Timer0_ISR () ;
- void INT1_Init();
- void KeyPress(uchar);
- void To_Zero();
- void Display_Price(); //單價(jià)寫(xiě)入屏函數(shù)
- void Display_Weight(); //重量寫(xiě)入屏函數(shù)
- void Display_Money(); //總價(jià)寫(xiě)入屏函數(shù)
- //整型轉(zhuǎn)字符串的函數(shù),轉(zhuǎn)換范圍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ǎn),每次測(cè)量前調(diào)用
- void To_Zero()
- {
- FullScale=ReadCount();
- price=0;
- }
- /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
- void write_eeprom()
- {
- uchar x1,x2;
- x1=RATIO/256;
- x2=RATIO%256;
- SectorErase(0x2000);
- byte_write(0x2000, x1);
- byte_write(0x2001, x2);
- byte_write(0x2058, a_a);
- }
- /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
- void read_eeprom()
- {
- uchar x1,x2;
- x2 = byte_read(0x2001);
- x1 = byte_read(0x2000);
- a_a= byte_read(0x2058);
- RATIO = x1*256+x2;
- }
- /**************開(kāi)機(jī)自檢eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom(); //先讀
- if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
- {
- RATIO = 3500;
- a_a = 1;
- write_eeprom(); //保存數(shù)據(jù)
- }
- }
- //顯示單價(jià),單位為元,四位整數(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(i,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ù)點(diǎn), 小數(shù)點(diǎn)部分
- 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);
- }
- }
- //顯示總價(jià),單位為元,四位整數(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ù)點(diǎn), 小數(shù)點(diǎn)部分
- 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ù)據(jù)初始化
- void Data_Init()
- {
- price = 0;
- DotPos = 0;
- beep = 1;
- alert = 1;
- }
- //定時(shí)器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允許定時(shí)器0中斷
- TMOD = 1; //定時(shí)器工作方式選擇
- TL0 = 0x06;
- TH0 = 0xf8; //定時(shí)器賦予初值
- TR0 = 1; //啟動(dòng)定時(shí)器
- }
- //定時(shí)器0中斷
- void Timer0_ISR (void) interrupt 1 using 0
- {
- TL0 = 0x06;
- TH0 = 0xf8; //定時(shí)器賦予初值
- //每0.5秒鐘刷新重量
- Counter ++;
- if (Counter >= 200)
- {
- FlagTest = 1;
- Counter = 0;
- }
- }
- //按鍵響應(yīng)程序,參數(shù)是鍵值
- //返回鍵值:
- // 1 2 3 10(清0)
- // 4 5 6 11(刪除單價(jià))
- // 7 8 9 12(去皮)
- // 14(未定義) 0 15(.) 13(未定義)
- void KeyPress(uchar keycode)
- {
- switch (keycode)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- //目前在設(shè)置整數(shù)位,要注意price是整型,存儲(chǔ)單位為分
- if (DotPos == 0)
- {
- //最多只能設(shè)置到千位
- if (price<100000)
- {
- price=price*10+keycode*100;
- }
- }
- //目前在設(shè)置小數(shù)位
- else if (DotPos==1) //小數(shù)點(diǎn)后第一位
- {
- price=price+keycode*10;
- DotPos++;
- }
- else if (DotPos==2)
- {
- price=price+keycode;
- DotPos++;
- }
- Display_Price();
- break;
-
-
- case 10: //清零鍵
- Delay(15);//延時(shí)
- pricebc=price;
- To_Zero();
- price=pricebc;
- Display_Price();
- DotPos = 0;
- beep=~beep;
- break;
-
-
- case 11: //清楚單價(jià)
- Delay(15);//延時(shí)
- price=0;
- DotPos = 0;
- Display_Price();
- break;
-
- case 12: //去皮
- Delay(15);//延時(shí)
- ClearWeighFlag = 1; //置零傳感器標(biāo)志 置1
- break;
-
-
- case 13: //微調(diào)
- Delay(15);//延時(shí)
- if(wtk==0)
- RATIO--;//微調(diào)系數(shù)
- else
- RATIO=RATIO-20;//微調(diào)系數(shù)
- write_eeprom();//存入eerom內(nèi),掉電不丟失系數(shù)數(shù)據(jù)
- break;
-
-
- case 14: //微調(diào)減
- Delay(15);//延時(shí)
- if(wtk==0)
- RATIO++;//微調(diào)系數(shù)
- else
- RATIO=RATIO+20;//微調(diào)系數(shù)
- write_eeprom();//存入eerom內(nèi),掉電不丟失系數(shù)數(shù)據(jù)
- break;
-
- case 15: //小數(shù)點(diǎn)按下
- Delay(15);//延時(shí)
- if (DotPos == 0)
- {
- DotPos = 1; //小數(shù)點(diǎn)后第一位
- }
- break;
- }
- Delay(10);
- }
- void main()
- {
- Lcd_Init();
- EA = 0;
- Data_Init();
- Timer0_Init();
-
- EA = 1;//初始化完成,開(kāi)中斷
- beep=1;
- init_eeprom();
- Lcd_Clear(); //clear all dots
- Lcd_Display1();
- Delay(700);
- To_Zero();
- Lcd_Clear();
- Lcd_Display2();
- Display_Price();
- while(1)
- {
- //每0.5秒稱(chēng)重一次
- if (FlagTest==1)
- {
- //稱(chēng)重,得到重量值weight,單位為g
- AdVal=ReadCount();
- weight=FullScale-AdVal;
- if (weight>0x8000000) weight=0;
- weight=weight*10/RATIO;//物體實(shí)際重量=總量量程對(duì)于的是多少。
- //weight=10000*weight/FullScale;
- //weight=weight*RATIO;
- //如果超量程,則報(bào)警
- if (weight >= MAX)
- {
- 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();
- money = weight*price/1000; //money單位為分
- Display_Money();//顯示總金額
- if(money>999999)
- money=999999;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
1-程序-10kg.rar
(67.55 KB, 下載次數(shù): 144)
2018-8-7 12:05 上傳
點(diǎn)擊文件名下載附件
|
|