【51单片机】智能地磅控制系统设计


一、主要功能

系统运行后,LCD12864显示初始界面,当红外传感器感应有车辆进入时,舵机开启打开闸门,此时液晶状态栏显示“进”,并且称重模块开启称重并在液晶上显示重量,当按下K1键记录车辆进入重量,此时单片机会将车辆进入状态和重量信息通过以太网传输到电脑端显示。当红外传感器感应到有车辆出去时,舵机开启关闭闸门,此时液晶状态栏显示“出”,并且称重模块开启称重并在液晶上显示重量,当按下K1键记录车辆出去重量,并且液晶显示进出重量差值,此时单片机会将车辆出去状态和重量差值信息通过以太网传输到电脑端显示。当红外传感器感应到有车辆进入时,液晶数据清零,重复上述执行。


二、硬件资源

1.硬件准备

项目所需要的硬件资源如下:
1、51单片机开发板1个
2、SG90舵机1个
3、LCD12864液晶模块1个
4、USB线1条(用于供电和程序下载)
5、杜邦线若干
6、漫反射红外传感器2个
7、HX711称重模块1个
8、CH9121以太网模块1个
9、网线1根

2.硬件连接

	   按键模块-->单片机IO
	  KEY1-->P32
	  
	  蜂鸣器模块-->单片机IO
	  BEEP-->P27

	  LCD12864液晶-->单片机IO
	  RS->P35
	  RW->P36
	  E->P34
	  DB0-DB7-->P00-P07
	  PSB->P37

	  (进)红外传感器-->单片机IO
	  黑色线->P22
	  棕色线->5V
	  蓝色线->GND
	  
	  (出)红外传感器-->单片机IO
	  黑色线->P23
	  棕色线->5V
	  蓝色线->GND

	  SG90舵机-->单片机IO
	  橙色线->P24
	  红色线->5V
	  褐色线->GND

	  HX711称重模块(5KG)-->单片机IO
	  DOUT-->P21
	  SCK-->P20
	  红色导线-->5V
	  黑色导线-->GND

	  CH9121以太网模块-->单片机IO
	  RXD-->P31
	  TXD-->P30
	  5V-->5V
	  GND-->GND

三、软件设计

1.软件结构

在这里插入图片描述

2.主要代码

#include "app_demo.h"
#include "key.h"
#include "time.h"
#include "beep.h"
#include "hx711.h"
#include "lcd12864.h"
#include "uart.h"


//进出红外管脚定义
sbit IN_IRD=P2^2;
sbit OUT_IRD=P2^3;
//舵机控制脚
sbit MOTOR=P2^4;


//定义全局结构体变量
xdata _sys_str sys_str;


//定时器0中断函数
void time0() interrupt 1
{
	static u8 i=0;

	TH0=0XDC;	//给定时器赋初值,定时10ms
	TL0=0X00;

	i++;
	
}

//系统参数初始化
void sys_parm_init(void)
{
	sys_str.mode=0;//没有进出
	sys_str.scale[0]=0;//清零
	sys_str.scale[1]=0;
	sys_str.net_flag=0;
	steer_control(0);//舵机归零
	get_plet();//去皮	
}

//开机界面显示
void open_show(void)
{
	lcd12864_show_string(0,0,"智能地磅      无");
	lcd12864_show_string(0,1,"进重:   0g");
	lcd12864_show_string(0,2,"出重:   0g");
	lcd12864_show_string(0,3,"重量差:   0g");
}

//车辆进出检测显示
void car_inout_check_show(void)
{
	while(1)
	{
		//在无车辆进入是检测
		if(sys_str.mode==0)
		{
			//检测有车辆进入
			if(IN_IRD==0)
			{
				delay_ms(100);
				if(IN_IRD==0)
				{
					sys_str.mode=1;//有车辆进入
					steer_control(1);
					lcd12864_show_string(7,0,"进");
					lcd12864_show_string(0,1,"进重:   0g");
					lcd12864_show_string(0,2,"出重:   0g");
					lcd12864_show_string(0,3,"重量差:   0g");
					sys_str.net_flag=1;	
				}
			}	
		}
		//在有车辆进入来时检测是否出去
		else if(sys_str.mode==5)
		{
			//检测有车辆出去
			if(OUT_IRD==0)
			{
				delay_ms(100);
				if(OUT_IRD==0)
				{
					sys_str.mode=2;//有车辆出去
					steer_control(0);
					lcd12864_show_string(7,0,"出");
					sys_str.net_flag=2;		
				}		
			}		
		}				
			
		break;	
	}
}


//应用控制系统
void app_control_sys(void)
{
	xdata u8 Tx_Buffer[6];

	time0_init();//初始化定时器0
//	time0_start();//开启定时器0
	lcd12864_init();//LCD12864初始化
	UART_Init();
	ES=1;
	sys_parm_init();//系统参数初始化
	open_show();//开机界面显示

	while(1)
	{
		car_inout_check_show();//车辆进出检测显示
		car_inout_scale_check_show();//车辆进出重量检测显示

		
		switch(sys_str.net_flag)
		{
			case 1://发送车辆进入信息 
				UART_SendString("\r\n车辆进入");
				sys_str.net_flag=0;
				break;
			case 2://发送车辆出去信息 
				UART_SendString("\r\n车辆出去");
				sys_str.net_flag=0;
				break;
			case 3://发送车辆进入称重数据信息
				UART_SendString("\r\n车辆进入重量:");
				Tx_Buffer[0]=sys_str.scale[0]/1000+0x30;
			   	Tx_Buffer[1]=sys_str.scale[0]%1000/100+0x30;
				Tx_Buffer[2]=sys_str.scale[0]%1000%100/10+0x30;
				Tx_Buffer[3]=sys_str.scale[0]%1000%100%10+0x30;
				Tx_Buffer[4]='g';
				Tx_Buffer[5]='\0';
				UART_SendString(Tx_Buffer);
				sys_str.net_flag=0;
				break;
			case 4://发送车辆出去称重数据信息
				UART_SendString("\r\n车辆出去重量差:");
				Tx_Buffer[0]=sys_str.scale[1]/1000+0x30;
			   	Tx_Buffer[1]=sys_str.scale[1]%1000/100+0x30;
				Tx_Buffer[2]=sys_str.scale[1]%1000%100/10+0x30;
				Tx_Buffer[3]=sys_str.scale[1]%1000%100%10+0x30;
				Tx_Buffer[4]='g';
				Tx_Buffer[5]='\0';
				UART_SendString(Tx_Buffer);
				sys_str.net_flag=0;
				break;
			default : break;
		}					
	}	
}

四、实验现象

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


联系作者

作者B站链接:https://space.bilibili.com/444388619

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值