一、主要功能

开机前如需去毛皮,预先将货框放在称重模块上,系统运行后LCD12864显示初始界面,可通过S1/S2键修改单价,支持连按操作。将所需称重物品放于传感器上,显示屏显示单价、物品重量,按下S3键时计算物品总价,且蜂鸣器发出提示音,语音模块播放总价,且将称重物品重量及价格通过蓝牙传输到手机蓝牙APP应用显示。支持连续计价及价格修改;按下S4键时,总价清零。


二、硬件资源

1.硬件准备

项目所需要的硬件资源如下:
1、51单片机开发板1个
2、HX711称重模块1个
3、LCD12864液晶模块1个
4、USB线1条(用于供电和程序下载)
5、杜邦线若干
6、JQ8900-16P语音模块1个
7、HC05蓝牙模块1个

2.硬件连接

      按键模块-->单片机IO
	  矩阵键盘(S1-S16)-->P1
	  
	  蜂鸣器模块-->单片机IO
	  BEEP-->P25

	  LCD12864液晶-->单片机IO
	  RS->P26
	  RW->P25
	  E->P27
	  DB0-DB7-->P00-P07
	  PSB->P32

	  HX711称重模块(5KG)-->单片机IO
	  DOUT-->P21
	  SCK-->P20
	  红色导线-->5V
	  黑色导线-->GND
	  
	  JQ8900-16P语音模块-->单片机IO
	  VPP-->P11
	  GND-->GND
	  VCC-->5V
	  SPK-/SPK+-->喇叭

	  HC05蓝牙模块-->单片机IO
	  TXD-->P3.0
	  RXD-->P3.1
	  VCC-->5V
	  GND-->GND

三、软件设计

1.软件结构

在这里插入图片描述

2.主要代码

//单价调整、商品计价
void unit_price_adjust(void)
{
	u8 key=0;

	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;	
		}
		else if(sys_str.mode==3)//计价
		{
			sys_str.cnt++;
			//计算商品价格,保留小数点后1位
			sys_str.price+=(((float)sys_str.unitprice/10)*(float)hx_str.suttle/1000)*10;
			beep_alarm(100,20);
			sys_str.pyflag=1;			
		}
		else if(sys_str.mode==4)//清零
		{
			sys_str.price=0;
			sys_str.cnt=0;	
		} 
		
		break;	
	}			
}

//单价调整,商品重量,商品价格数据显示
void unit_price_show(void)
{
	u8 buf[6];
	u8 res=0;
	u8 recbuf[6];

	while(1)
	{
		//单价调整数据显示
		buf[0]=sys_str.unitprice/100+0x30;
		if(buf[0]==0x30)buf[0]=' ';
		buf[1]=sys_str.unitprice%100/10+0x30;
		buf[2]='.';
		buf[3]=sys_str.unitprice%100%10+0x30;
		buf[4]='\0';
		lcd12864_show_string(3,1,buf);

		//获取净重
		res=get_suttle();
		if(res==0)
		{
			//商品重量显示
			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]='g';
			buf[5]='\0';
			lcd12864_show_string(3,2,buf);	
		}

		//商品计价显示
		buf[0]=sys_str.price/1000+0x30;
		if(buf[0]==0x30)buf[0]=' ';
		buf[1]=sys_str.price%1000/100+0x30;
		if(buf[0]==' '&&buf[1]==0x30)
		{
			buf[0]=' ';
			buf[1]=' ';	
		}
		buf[2]=sys_str.price%1000%100/10+0x30;
		buf[3]='.';
		buf[4]=sys_str.price%1000%100%10+0x30;
		buf[5]='\0';
		lcd12864_show_string(3,3,buf);

		if(sys_str.pyflag)
		{
			sys_str.pyflag=0;
			UART_SendString("\r\n重量:");
			recbuf[0]=hx_str.suttle/1000+0x30;
			recbuf[1]=hx_str.suttle%1000/100+0x30;
			recbuf[2]=hx_str.suttle%1000%100/10+0x30;
			recbuf[3]=hx_str.suttle%1000%100%10+0x30;
			recbuf[4]='g';
			recbuf[5]='\0';	
			UART_SendString(recbuf);

			UART_SendString("\r\n价格:");
			recbuf[0]=sys_str.price/1000+0x30;
			recbuf[1]=sys_str.price%1000/100+0x30;
			recbuf[2]=sys_str.price%1000%100/10+0x30;
			recbuf[3]='.';
			recbuf[4]=sys_str.price%1000%100%10+0x30;
			recbuf[5]='\0';	
			UART_SendString(recbuf);
			UART_SendString("元\r\n");

			play_price(sys_str.price);	
		}
		break;			
	}	
}


//应用控制系统
void app_control_sys(void)
{
	time0_init();//初始化定时器0
	time0_start();//开启定时器0
	lcd12864_init();//LCD12864初始化

	sys_parm_init();//系统参数初始化
	open_show();//开机界面显示
	UART_Init();

	while(1)
	{
		unit_price_adjust();//单价调整,计价	
		unit_price_show();//单价调整,商品重量,商品价格数据显示						
	}	
}

四、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐