|
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.连接好传感器及主板各部件,给系统通电
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.按键注意事项:按键时间不能过长,也不能过短,按键时间和按键压力一定要适中,这样才能正确读取数据。
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_();};
- //定义量程系数
- #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();
- //如果单价设定好了,则计算价格
-
- …………余下代码请下载附件…………
复制代码
电子秤的完整程序代码和原理图等资料下载:
HX711完整单片机程序.rar
(206 KB, 下载次数: 626)
|
评分
-
查看全部评分
|