嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 8 元微信扫码支付:8 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
很好用的电子秤源码 非常实用
电子秤使用说明:
商品代码:
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.连接好传感器及主板各部件,给系统通电
2.通电后,液晶显示第一屏,包括学校、系部、专业、制作人以及作品名称。
3.几秒后,液晶显示第二屏,大体格式是:
名称数量:0000-00
重量: 0.000kg
单价: 0.00 元
金额:------- 元
4.名称数量:0000-00,前面的0000表示商品代码,如上面所示,后面00的代表数量。
例如:输入0001-01,则先按1键,再按小数点,再按0,再按1即输入了0001-01,然后按确定键,则显示香蕉01.
注意:如果输错了,比如是0001-00,按确定键,即清零了,也就是你得重新输入数据。
还有几种情况,也是按确定键自动清零的。比如是0000-01,没有这个商品编码,则出错。
再比如,我们设置的商品代码范围是1-10,则如果输入的商品代码不在范围内,则按确定键即清零,需要重新输入数据。
5.输入完名称数量,再按数字键,则是输入单价,输入单价后,按确定键,则计算出金额,并显示出来。
6.如果不需要累计,下次称重前,按一次清零即可。
如果需要累计,则在商品没有拿下钱,按一次累计,然后拿下商品,再按一次清零即可进行下一次称重。
7.清零前,必须在拿下商品的情况下才能准确回零。
8.去皮功能:先在传感器支架上放上要去皮的,然后按一下去皮键,则重量那显示0kg,表示去皮成功。这时,再放上商品,按操作顺序进行操作。
9.总金额:当累计几次后,需要算总金额时,按一下总金额键,即可算出总金额,并在屏幕显示出来。
再按一次总金额即可清零,回到初始状态。
10.输入数字过程中,如果出错,可以退格,也就类似电脑的backspace,向前删除一位。
11.按键注意事项:按键时间不能过长,也不能过短,按键时间和按键压力一定要适中,这样才能正确读取数据。
电子秤原理图
#include<reg51.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_();}; //定义量程系数 #define RATIO 6797/1000 //定义标识 volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0 volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0 volatile bit FlagSetPrice = 0; //价格设置状态标志,设置好为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; //小数点标志及位置 uchar Dec_pi; //去皮变量 uchar all_flag; //累计变量 //标志位 uchar num_name; //名称数量标志 uchar shuliang; //数量值 ulong idata all_money; //累计 //函数声明 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(); //整型转字符串的函数,转换范围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'; } //重新找回零点,每次测量前调用 void To_Zero() { FullScale=ReadCount()/1000; price=0; } //显示名称数量,单位为元,四位整数,两位小数 void Display_Namenum() { uint i,j; uchar A1,A2,A3,A4; uchar B1,B2; i = price/100; //得到整数部分 j = price - i*100;//得到小数部分 // 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; //显示整数部分 Lcd_Pos(0,4); Lcd_Wdat(':'); Lcd_Wdat(A1); Lcd_Wdat(A2); Lcd_Wdat(A3); Lcd_Wdat(A4); Lcd_Wdat('-'); //显示小数点, 小数点部分 // int2str(j,str1); Lcd_Pos(0,7); Lcd_Wdat(B1); Lcd_Wdat(B2); } //显示单价,单位为元,四位整数,两位小数 void Display_Price() { uint i,j; uchar A1,A2,A3,A4; uchar B1,B2; i = price/100; //得到整数部分 j = price - i*100;//得到小数部分 // 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; //显示整数部分 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); } //显示小数点, 小数点部分 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,两位整数,三位小数 void Display_Weight() { uint i,j; uchar A1,A2; uchar B1,B2,B3; //weight单位是g i = weight/1000; //得到整数部分 j = weight - i*1000;//得到小数部分 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); } } //显示总价,单位为元,四位整数,两位小数 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; //得到整数部分 j = money - i*100;//得到小数部分 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); //显示整数部分 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); } //显示小数点, 小数点部分 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); } } //显示总金额,单位为元,四位整数,两位小数 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; //得到整数部分 j = all_money - i*100;//得到小数部分 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); //显示整数部分 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); } //显示小数点, 小数点部分 // 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); } } //数据初始化 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; } } //按键响应程序,参数是键值 //返回键值: // 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: //目前在设置整数位,要注意price是整型,存储单位为分 if (DotPos == 0) { //最多只能设置到千位 if (price<100000) { price=price*10 keycode*100; } } //目前在设置小数位 else if (DotPos==1) //小数点后第一位 { 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: //删除键,按一次删除最右一个数字 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: //确认键,名称数量和单价 if(num_name==0) { nam1=price/100; nam2=price-nam1*100; num_name=1; if(nam2!=0) { //显示整数部分 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: //小数点按下 if (DotPos == 0) { DotPos = 1; //小数点后第一位 } 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(); //如果单价设定好了,则计算价格 if (FlagSetPrice == 1) { money = weight*price*shuliang/1000; //money单位为分 //显示总金额 Display_Money(); if(money>999999) beep=0; } else { Lcd_Pos(3,3); Lcd_Wdat('-'); Lcd_Wdat('-'); Lcd_Wdat('-'); Lcd_Wdat('-'); Lcd_Wdat('-'); Lcd_Wdat('-'); Lcd_Wdat('-'); } //清测试标志 FlagTest = 0; } } if(key_all==0) { Delay(10); if(key_all==0) { all_flag ; if(all_flag>=2) { all_flag=0; Lcd_Clear(); Lcd_Display2(); To_Zero(); Display_Price(); Display_Namenum(); FlagSetPrice = 0; DotPos = 0; num_name=0; Dec_pi=0; dec_weight=0; all_money=0; TR0=1; } } } if(all_flag==1) { if(num_name==0) { Lcd_Clear(); Lcd_Pos(1,0); //显示位置为第二行的第1个字符 i = 0; while(name0[i] != '\0') { Lcd_Wdat(name0[i]); //显示相应表格中的字符 i ; } Display_Allmoney(); TR0=0; } } //获取按键 keycode = Getkeyboard(); //有效键值0-15 if ((keycode<16)&&(FlagKeyPress==0)) { FlagKeyPress = 1; KeyPress(keycode); FlagKeyPress = 0; } Delay(50); } }