【51单片机】智能地磅控制系统设计
时间:2022-10-03 16:30:00
文章目录
- 一、主要功能
- 二、硬件资源
-
- 1.硬件准备
- 2.硬件连接
- 三、软件设计
-
- 1.软件结构
- 2.主要代码
- 四、实验现象
- 联系作者
一、主要功能
系统运行后,LCD12864显示初始界面。当红外传感器感应车辆进入时,舵机打开闸门。此时,液晶状态栏显示进入,称重模块打开称重,并在液晶上显示重量K1键记录车辆进入重量,单片机会通过以太网将车辆进入状态和重量信息传输到计算机端显示。当红外传感器感应到车辆外出时,舵机打开并关闭闸门。此时,液晶状态栏显示外出,称重模块打开称重,并在液晶上显示重量K1键记录车辆的重量,液晶显示重量差。此时,单片机会通过以太网将车辆的状态和重量差信息传输到计算机端显示。当红外传感器感应到车辆进入时,液晶数据被清除并重复执行。
二、硬件资源
1.硬件准备
项目所需的硬件资源如下:
1.51单片机开发板1
2、SG90舵机1个
3、LCD12864液晶模块1个
4、USB线1(供电和程序下载)
几条杜邦线
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; /// 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设计,视频分享,技术交流。