基于51单片机开发板的电子秤设计
1、基本构架
本文所介绍的电子秤系统以STC89C52芯片为控制核心,由普中科技51单片机开发板、LCD1602液晶显示屏、1KG压力传感器和HX711模块共同组成.通过STC89C52编程控制实现称重、调节单价、计算总价、去皮功能。
2、功能实现设计思路
1、称重
- 通过使用压力传感器将重力信号转化为电压信号,然后利用HX711模块对电压信号进行放大(128倍增益),运用 AD 模数转换电路处理将模拟信号转化为数字信号
u32 hx711_read(void)
{
u32 count;
u8 i;
HX711_DOUT=1;
Delay__hx711_us();
HX711_SCK=0;
count=0;
EA = 1;
while(HX711_DOUT);
EA = 0;
for(i=0;i<24;i++)
{
HX711_SCK=1;
count=count<<1;
HX711_SCK=0;
if(HX711_DOUT)
count++;
}
HX711_SCK=1;
count=count^0x800000;
Delay__hx711_us();
HX711_SCK=0;
return(count);
}
- 利用重量转换公式把目标物体的重力计算出来(这个校准参数要依据压力传感器的精度来调整)
#define GapValue 1040
- 最后通过LCD液晶显示屏将重量显示出来
buf[0]=hx_str.suttle/1000+0x30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=hx_str.suttle%1000/100+0x30;
if(buf[0]==' '&&buf[1]==0x30)
{
buf[0]=' ';
buf[1]=' ';
}
buf[2]=hx_str.suttle%1000%100/10+0x30;
if(buf[0]==' '&&buf[1]==' '&&buf[2]==0x30)
{
buf[0]=' ';
buf[1]=' ';
buf[2]=' ';
}
buf[3]=hx_str.suttle%1000%100%10+0x30;
buf[4]='\0';
lcd1602_show_string(2,1,buf);
这样就完成了电子秤最主要的功能:称重。
2、调节单价
- 单价调节主要利用开发板的矩阵键盘来实现,这里应用的是按键扫描的方式,即对矩阵键盘进行按行按列扫描,如果检测到有按键按下,则执行程序
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
if(mode==0)
delay_10us(1000);
else delay_ms(300);
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
key=1;
}
return KEY_UNPRESS;
}
但是按键扫描其实有很大的缺点,在不断扫描的时候,如果没有按键按下,那么就会浪费内部的程序,容易造成混乱以及按键不灵敏的情况,这里引入定时器进行按键中断会更加高效率。
- 然后对于单价的加减,主要是通过按键加和按键减来实现
while(1)
{
sys_str.mode=key_matrix_flip_scan();
if(sys_str.mode==1)
{
sys_str.unitprice+=UNIT_PRICE_PER_VALUE;
if(sys_str.unitprice>=1000)sys_str.unitprice=0;
}
else if(sys_str.mode==2)
{
sys_str.unitprice-=UNIT_PRICE_PER_VALUE;
if(sys_str.unitprice<1)sys_str.unitprice=999;
}
3、计算总价
- 总价的计算其实就是很简单的将单价与重量相乘
sys_str.price+=(((float)sys_str.unitprice/10)*(float)hx_str.suttle)*10;
4、去皮
- 这里的去皮是通过系统初始化来实现的,实现的功能是将要去皮的容器放置在托盘上之后再启动单片机,这样单片机就又从0开始计算重量从而实现净值的称量
void get_plet(void)
{
hx_str.plet=hx711_read();
}
u8 get_suttle(void)
{
hx_str.suttle=hx711_read();
hx_str.suttle=hx_str.suttle-hx_str.plet;
if(hx_str.suttle>0)
{
hx_str.suttle=hx_str.suttle/GapValue;
if(hx_str.suttle>1000)
return 1;
else
return 0;
}
else
return 2;
}
void get_plet(void);
u8 get_suttle(void);
但是这里面有一个问题就是我的单价、重量、总价的量程没有选取好,导致超出量程的时候会出现乱码的情况。
3、技术要点
我觉得主要就是定义了一个系统sys,然后把主要的程序分步进行,我认为这样的好处是能够让自己的代码更加的易读且有逻辑条理,每次打开电子秤就可以依次按照系统定义的步骤来进行,比如这里:
void app_control_sys(void)
{
time0_init();
time0_start();
lcd1602_init();
sys_parm_init();
open_show();
while(1)
{
unit_price_adjust();
unit_price_show();
}
}
那么电子秤就会按照程序,先进行定时器、LCD1602液晶显示屏、系统参数初始化,然后显示开机界面,显示重量,调节单价,计算总价,从而完成一次称重过程。
4、问题以及解决方案
- 如何把数据print在LCD上:一开始写完代码把程序烧录到单片机的时候LCD一直没有显示,有点小崩溃,然后后来慢慢看代码,查找商家给的以及网上的各种资料,发现是因为用的驱动有问题,以及定义LCD接口与实际接口不符合,导致数据无法显示,最后就是用了开发板自己本身的驱动以及接口,就能显示了。
- 然后就是代码逻辑问题:因为是小白,一开始打代码的时候就经常会出现逻辑错误导致Keil老是显示Target not created,就得花好长时间去找错,寻找逻辑或者可能是函数定义出错问题,不过这种东西熟能生巧,打多几次就大概能掌握其中的逻辑与技巧啦!
5、总结
这次的电子秤设计让我初步入门了51单片机,了解了C语言的一些基本语法和逻辑,同时也了解到了自己一些知识上的不足,接下来主要就是把51开发板的各个结构以及驱动原理等了解清楚,还有更好的掌握C的逻辑。
谢谢!