基于51单片机的电子秤设计-LCD12864

一.硬件方案

本设计利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。。
电路主要由51单片机(STC89C51/52、AT89C51/52均可使用)+LCD12864液晶显示屏+HX711AD转换模块+LED指示灯+蜂鸣器电路+矩阵按键+10kg压力传感器等;

二.设计功能

(1)可以输出量程为10kg物体的重量,精度为0.001kg;
(2)可通过按键设置单价,并根据实际重量计算出总价;
(3)支持去皮功能、切换量程等功能,输出的重量和总额采用四舍五入;
(4)采用LCD12864显示屏,支持中文显示;

三.设计原理图

(1)原理图主要采用AD软件进行设计,如图:
在这里插入图片描述

(2)PCB图如下:
在这里插入图片描述

四.软件设计

主程序源码

void main()											
{  	
	INT_8 j = 0, k = 0, count = 0;
    UINT_8 Key = 0, Num = 0;		//Key存储按键的键值,Num存储按下的是那个数字
	UINT_32 tmp = 0;		  
	Init();
	while (1)
	{
		WDT_FeedDog();			   //喂狗
		if (KeycanFlag == 0)					//价格还没输入时可以显示(防止价格输入一半DDRAM地址改变,造成价格不可连续输入)
		{	  
			if (TimeCount >= 50)		    	//定时时间超过250ms执行AD采集
			{
				//	Offset = AD_Hx711();						 		//8527820-8475960 =51860
				//	Display_Int2str(Offset, WeightTable, 0x93);
				 WeightTemp = AD_Weight(AD_Hx711());  			 	//把AD值转化为以克为单位的质量(含小数)
				if (WeightTemp > 4000)			 				   //超出量程4000g报警
				{	
					for (k = 0; k < 4; k++)
					{
						LcdDdram_Display(1,3,table5);	  	//输出错误字符串		   		
					}
					Beep = 0;			  //蜂鸣器鸣叫
					Led  = 0;			  //Led亮
				}	
				else
				{										   			  
					Beep = 1;			   						//重量少于最大量程关闭蜂鸣器
					Led  = 1;	
					tmp = (UINT_32)(WeightTemp);	//	tmp = (UINT_32)(WeightTemp + 0.5);		   //将质量四舍五入,例如1000.50 》1001
					if(RangeFlag == 0)						  //量程单位为g
					{		
						Init_Weighttab(WeightTable,table6);	//初始化字符数组为空格,防止上次字符位数比这次大,没有清除
						k = 0; 								//例如上次显示1234,这次12,残留34
					    Weight = tmp;		 				//中间质量变量赋给质量
						while (tmp != 0)			 							
						{
							WeightTable[k++] = 0x30 + tmp % 10; 			//提取十进制最后一位转换为字符
						    tmp /= 10;		
						}	
						if (k == 0)					//质量为0时
						{	
							WeightTable[k++] = '0';		   
						}	
						Write_Cmd(0x93);				 					
						count = k;
						while (k > 0)		       
					    {	
							Write_Data(WeightTable[k-1]);	  //质量倒序输出,因为之前是倒序输入,高位地址为高位,由高位到低位	
							k--;								  
						} 	
						for (k = count; k < 5; k++ )		  //把上次残留的字符清掉
						{
							 Write_Data(WeightTable[k]);
						}
					}
					else
					{
						Init_Weighttab(WeightTable,table8);			 //清空字符串数组
						k = 0;
						Weight = tmp / 1000.0;	 		 	  //质量/g 1000 =  /kg
					  	while (tmp != 0)			 				
						{
							WeightTable[k++] = 0x30 + tmp % 10; 			
						    tmp /= 10;		
							if (k == 3)			   			 	//i=3时就是获得3位小数时插入小数点    
							{							
								WeightTable[k] = '.';	 		
								k += 1;	
							}
						}
						if (k == 4)				//刚好3个小数补0 0.123	        
						{
							WeightTable[k] = '0';		
							k++;			   //和上面统一,k比实际大1,下面再减回
						}
						if (k < 3)	 		 			 //当不够两位小数时,例如1实际代表的是0.01
						{		
							WeightTable[4] = 0x30;				//在最高位插入0
							WeightTable[3] = '.';				//在最次高位插入.
							for (j = k; j < 3; j++)
							{
								WeightTable[j] = 0x30;		 //如果只有0位时插入一个插入两个0	 0.00
							}									 //如果只有1位时插入一个插入1个0	 0.0
							k = 5;	  		     			 //0.001刚好5个数
						}	
						Write_Cmd(0x93);				 //重定位液晶DDRAM地址						 
						while (k > 0)		       	
					    {	
							Write_Data(WeightTable[k-1]);	  //总额结算,倒序输出,因为之前是倒序输入,高位地址为高位
							k--;								  
						} 
	
					}
				
				}				 
				TimeCount = 0;
				Write_Cmd(0x8b);		 					//显示完体重就定位价格显示地址
			}		   
	    }	
	}		 
}
	

资料链接:https://pan.baidu.com/s/1t9dsUnf_ShlmLXLgaFJHWg?pwd=u945

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值