基于51单片机的HX711电子秤,利用AT89C51作为系统主控,HX711作为称重模块,矩阵键盘用于单价输入,系统自动进行总价的统计。为了可视化显示,使用LCD1602作为显示器件,显示单价、重量、总价等。为了方便进行提示用户,本次设计使用蜂鸣器和LED作为提示器件。
一、硬件设计
1、51单片机最小系统
一般单片机的最小系统主要包括芯片、晶振电路、复位电路等,但是在仿真中,不添加这些部分也是可以正常仿真的,但是为了严谨,本次设计将晶振电路和复位电路添加进去了。
2、HX711电路
由于Proteus8.9里并没有HX711,但是我们需要使用HX711进行仿真,综合查询多个资料,我找到了解决方法,通过加载一个HX711仿真文件我们实现了功能。
3、DS1302电路
本次设计利用DS1302获取系统时间,由于DS1302是仿真,在没有手动设置时间,一般他的时间会和电脑的时间保持一致,我们通过写DS1302的串行通信程序可以读出DS1302携带的年、月、日、时、分、秒数据。另外,我们还需要给DS1302提供晶振,一般来说,频率是32.768k。
4、矩阵键盘电路
矩阵键盘通常使用扫描的方式进行数据读取,所连接方式是按键两端都连上IO口,如下图所示:
剩下的一些LCD电路、蜂鸣器电路、LED电路这边并不做多阐述
二、软件设计
1、驱动函数书写
本次设计的驱动函数模块,主要包括LCD、HX711、DS1302、矩阵按键、延时函数,根据封装的设计思路,让我们的应用层代码只需要调用API就可以完成对硬件功能的驱动,实现整体功能。
2、程序设计
·(1)本次程序设计,使用按键进行操作,主要有两个状态,一个是正常计价模式,一个是休眠模式,程序开始运行,我们循环获取矩阵按键的按键值,这个系统具有小数点的功能,于是在基础价格的基础上我们有一个小数点位置记忆功能,实现简单的小数点运算。参考代码如下:
//获取矩阵按键型号
keyNum = MatrixKey();
if(keyNum >= 0 && keyNum <= 10){
if(len<4){
if(keyNum != 10){
val = val*10+keyNum;
len++;
}
//小数点按下,进行小数点的位置记忆
if(keyNum==10){
dot=1;
dot_pos=len;
}
}
}
(2)本次设计的按键,除了输入单价的功能,还有别的功能,分别是去皮、减、加、清零、确认这5个功能,参考代码如下:
//按下去皮按键,进行去皮
if(keyNum == 11){
if(qupi==0)
qupi=Weight_Shiwu;
else
qupi=0;
}
//校验减
if(keyNum == 12){
if(GapValue<10000)
GapValue+=10;
write_eeprom();
}
//校验加
if(keyNum == 13){
if(GapValue>1)
GapValue-=10;
write_eeprom();
}
//进行价格计算
if(keyNum == 15 && over==0){
if(dot != 0){
res = (float)val * Weight_Shiwu/LCD_Pow(10, len-dot_pos);
}
else{
res = (float)val * Weight_Shiwu;
}
}
//清零
if(keyNum == 14){
val=0;
res=0;
dot_pos=0;
len=0;
dot=0;
LCD_ShowString(1,11, " ");
}
(3)同时,设计中包含的功能还有休眠功能,即长时间没有进行操作,系统自动进行休眠,直到再次进行系统操作,系统才会被唤醒。参考代码如下:
//休眠计时
if(keyNum == 255){
cnt_flag=1;
}
else{
cnt=0;
cnt_flag=0;
sleep_flag=0;
}
//不休眠情况下,进行计价
if(sleep_flag == 0){
//每0.5秒称重一次
if (FlagTest==1)
{
Get_Weight();
FlagTest = 0;
}
//显示最后价格
LCD_ShowNum(2,10, res/1000, 3);
LCD_ShowString(2,13, ".");
LCD_ShowNum(2,14, res%1000, 3);
//显示小数点
if(dot_pos !=0){
LCD_ShowString(1,11+dot_pos, ".");
}
temp=0;
for(i=0; i<len; i++){
if(i==dot_pos && dot_pos!=0)temp++;
LCD_ShowNum(1,11+temp, val/LCD_Pow(10, len-i-1)%10, 1);
temp++;
}
//显示实时时间
DS1302_ReadTime();
LCD_ShowNum(2,1, DS1302_Time[3], 2);
LCD_ShowString(2, 3, ":");
LCD_ShowNum(2,4, DS1302_Time[4], 2);
LCD_ShowString(2, 6, ":");
LCD_ShowNum(2,7, DS1302_Time[5], 2);
}
else{
//清屏
LCD1602_write_com(0x01);
}
三、功能演示
1、首先,程序开始运行,系统打印提示,欢迎进入系统,经过一段时间的延时后进行系统。
2、进入系统,显示屏显示重量、时间、总价,在没有输入之前,单价位置是白色的。等待用户键盘进行输入。
3、调节HX711的重量,同时按键输入单价,如下图:
4、按下确认,系统进行价格运算,得出最终的价格,如下图所示:
5、如果长时间未进行操作,系统会进行休眠态,此时LCD白屏,按下任意按键,系统才会进行唤醒。
6、按下清零键,系统进行清零,可进行下一次输入。
7、另外系统还有去皮、校验减、校验加,这里不进行测试了。
四、项目总结
本次项目使用51单片机进行设计,HX711作为本次设计的核心传感器,主要进行称重的功能,使用按键进行用户交互,并且支持小数价格输入,按下确认后进行价格,并且有时间显示、价格计算等一系列功能,在Proteus上完成了简单的称中功能。
以下是本项目的地址: