基于51单片机开发板的电子秤设计

基于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的逻辑。

谢谢!

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值