毕业设计 STM32的FRID高速收费系统(源码+硬件+论文)


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 STM32的FRID高速收费系统(源码+硬件+论文))

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

1 主要功能

主要功能: 一款基于STM32的FRID高速收费系统,可以实现小车和货车两种车型收费,当车辆超过了规定的重量后,出现声光报警提示,并且启动杆不会抬起,只有当车辆重量低于设置值时,启动杆才会自动抬起,当启动杆抬起后,开始计费,直到车辆驶离高速。

  • 1、车辆称重,2个分区(小车:1kg以内、货车:2kg以内,利用按键选择),超重无法上高速,并声光报警。

  • 2、刷卡之后杆子自动抬起落下(四相步进机),防追杆。功能,前车过去,闸门才自动落下(分离式红外对管)

  • 3、刷卡后,开始时间计费(小车1元/分钟,货车2元/分钟)。

  • 4、如果车辆长时间不出高速,会报警提示值班人员,对高速进行排查。

  • 5、通过按键设置各阈值(超载值、计费单价、时长)

  • 6、通过显示屏显示数据

2 系统架构

本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。

中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。

输入由五部分组成

第一部分是称重模块,通过该模块检测当前车辆的总重量;

第二部分是RFID刷卡,通过该模块进行计费;

第三部分是红外对射管模块,通过该模块监测当前是否有车辆;

第四部分是按键模块,通过该模块可以切换界面,进行选择通行的车辆,及其车辆所能承载的最大值,及其该车运行时间对应的价格等;第五部分是供电模块,通过该模块可给整个系统进行供电。

输出由三部分组成

第一部分是显示模块,通过该模块可以显示重量、车辆类型、计时价格和价格及其不同车辆设置的最值和计时时间;

第二部分是步进电机模块,通过该模块可以车杆的开关;

第三部分是声光报警模块,监测到当前的车重大于设置的最大值进行声光报警提醒。

在这里插入图片描述

3 硬件设计原理图

在这里插入图片描述

4 软件设计流程

系统的主流程图如图所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,包括切换界面、设置阈值等;紧接着进入第二个函数监测函数,该函数主要通过调用相应的驱动函数获取测量值;紧接着进入第三个函数显示函数,该函数显示监测值及阈值;最后进入第四个函数处理函数,监测到当前的车辆重量大于设置的最大值进行声光报警提醒,进行卡号比对,监测到没有超重,开始计费,车辆通过后,控制车杆关闭,监测到车辆超速进行声光报警提醒。

在这里插入图片描述

称重模块HX711模块子流程

首先初始化引脚,然后数据引脚拉高,延时一段时间后,将时钟引脚拉低,等待AD转换结束,然后开始读取数据。接下来循环24次数据接收,在第25个脉冲将数据异或转换,并拉低时钟引脚结束AD转换。通过采集第一次数据为毛皮重量,采集第二次数据减去第一次数据即为最终称重重量,称重模块子流程如图

在这里插入图片描述

步进电机子流程

首先初始化引脚,然后初始化定时器,在定时器中断函数中进行步进电机八步解析,然后根据正转或反转标志位决定正反转。另外,通过比较时间计数值决定步进电机转速,比较节拍数决定步进电机转动角度,步进电机子流程如图

在这里插入图片描述

5 关键代码


#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "oled.h"
#include "usart.h"
#include "hx711.h"
#include "motor_timer.h"
#include "rfid.h"
#include "timer.h"


/**********************************
��������
**********************************/
uint8_t key_num = 0;									//����ɨ���־λ	
uint8_t flag_display = 0;							//��ʾ�����־λ
uint32_t time_num = 0;								//10ms��ʱ
char display_buf[48] = {0};						//��ʾ������

u8 alarm_count = 0;										//������־����

_Bool car_type = 0;										//����������
_Bool flag_maopi = 0;									//��һ��ëƤ������־λ
u32 weight_maopi = 0;									//ëƤ����
u32 weight_value = 0;									//����ֵ
u16 weight_smax = 1;									//�γ��������ֵ
u16 weight_tmax = 2;									//�����������ֵ
_Bool alarm_weight = 0;								//���ر�����־λ

u8 RF_ID[5] = {0};								 	  //�洢����
u8 RF_TP[4] = {0};									  //��Ƭ����

_Bool flag_billing = 0;								//��ʼ�Ʒѱ�־λ
u32 total_price = 0;									//�ܼ�Ǯ
u16 unit_sprice = 1;									//�γ�nԪ/����
u16 unit_tprice = 2;									//����nԪ/����

short time_hour = 0;									//��ʱʱ��ʱ
short time_minute = 0;								//��ʱʱ���
short time_seconds = 0;								//��ʱʱ����
short time_hour_max = 3;							//��ʱʱ�����ʱ
short time_minute_max = 0;						//��ʱʱ������
short time_seconds_max = 0;						//��ʱʱ�������
_Bool alarm_time = 0;									//��ʱ������־λ

extern uint8_t flag_timer_begin_1s;		//��ʱ��ʼ��־λ
extern uint8_t flag_1s;								//��ʱ1s��ɱ�־λ

_Bool flag_pass = 0;									//����ͨ�����˱�־
extern _Bool flag_step2_o;						//��������򿪱�־λ
extern _Bool flag_step2_c;						//��������رձ�־λ
extern _Bool flag_Step2;							//�������״̬��־λ


/**********************************
��������
**********************************/
void Key_function(void);							//��������
void Monitor_function(void);					//��⺯��
void Display_function(void);					//��ʾ����
void Manage_function(void);						//��������


/****
*******	������ 
*****/
int main(void)
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //�����ж����ȷ���
	Delay_Init();	    	 								//��ʱ��ʼ��	  
	Gpio_Init();		  									//IO��ʼ��
	Key_Init();		  										//������ʼ��
	Oled_Init();		  									//OLED��ʼ��
	Oled_Clear_All();										//����
	Usart1_Init(9600);    							//����1��ʼ��
	Hx711_Init();												//HX711��ʼ��
	Step_Motor_Init();                  //���������ʼ��
	TIM2_Init(999,7199);								//��ʱ����ʼ��
	RFID_Init();                        //RFID��ʼ��
	RC522_Reset();										  //��λRC522
	RC522_Antenna_On();								  //�������߷���
	
	
	while(1)
	{
		Key_function();										//��������
		Monitor_function();								//��⺯��
		Display_function();								//��ʾ����
		Manage_function();								//��������

		time_num++;												//��ʱ����+1
		Delay_ms(10);
		if(time_num %10 == 0)
			LED_SYS = ~LED_SYS;
		if(time_num >= 5000)
		{
			time_num = 0;
		}
	}
}

/****
*******��������
*****/
void Key_function(void)
{
	key_num = Chiclet_Keyboard_Scan(0);		//����ɨ��
	if(key_num != 0)											//�������
	{
		switch(key_num)
		{
			case 1:								            //����1���л����ý���
				flag_display++;
				if(flag_display >= 8)
					flag_display = 0;
				
				Oled_Clear_All();					      //����
			break;

			case 2:											      //����2
				switch(flag_display)
				{
					case 0:									      //����0��ѡ����ΪС��
						if(flag_billing == 0)
						{
							car_type = 0;
						}
					break;
					
					case 1:												//����1��С���������ֵ+1
						if(weight_smax < 5)
							weight_smax++;
					break;
					
					case 2:												//����2�������������ֵ+1
						if(weight_tmax < 5)
							weight_tmax++;
					break;
					
					case 3:												//����3��С��ÿ���ӵ���+1
						if(unit_sprice < 9999)
							unit_sprice++;
					break;
          
					case 4:												//����4������ÿ���ӵ���+1
						if(unit_tprice < 9999)
							unit_tprice++;
					break;

					case 5:												//����4����ʱʱ�����ʱ+1
						time_hour_max++;
						if(time_hour_max > 999)
							time_hour_max = 0;
					break;

					case 6:												//����6����ʱʱ������+1
						time_minute_max++;
						if(time_minute_max > 59)
							time_minute_max = 0;
					break;

					case 7:												//����7����ʱʱ�������+1
						time_seconds_max++;
						if(time_seconds_max > 59)
							time_seconds_max = 0;
					break;
					
					default:
					break;
				}
			break;

			case 3:														//����3
				switch(flag_display)
				{
					case 0:									      //����0��ѡ����Ϊ����
						if(flag_billing == 0)
						{
							car_type = 1;
						}
					break;
					
					case 1:												//����1��С���������ֵ-1
						if(weight_smax > 0)
							weight_smax--;
					break;
					
					case 2:												//����2�������������ֵ-1
						if(weight_tmax > 0)
							weight_tmax--;
					break;
					
					case 3:												//����3��С��ÿ���ӵ���-1
						if(unit_sprice > 0)
							unit_sprice--;
					break;
          
					case 4:												//����4������ÿ���ӵ���-1
						if(unit_tprice > 0)
							unit_tprice--;
					break;

					case 5:												//����4����ʱʱ�����ʱ-1
						time_hour_max--;
						if(time_hour_max < 0)
							time_hour_max = 999;
					break;

					case 6:												//����6����ʱʱ������-1
						time_minute_max--;
						if(time_minute_max < 0)
							time_minute_max = 59;
					break;

					case 7:												//����7����ʱʱ�������-1
						time_seconds_max--;
						if(time_seconds_max < 0)
							time_seconds_max = 59;
					break;

					default:
					break;
				}
			break;

			default:
			break;
		}
	}
}

/****
*******��⺯��
*****/
void Monitor_function(void)
{
	u16 weight_test = 0;

	if(flag_display == 0)									//��������
	{
		if(time_num % 10 == 0)							//��ȡ����
		{
			if(flag_maopi == 0)
			{
				weight_maopi = Hx711_Get_Maopi();                 //��ȡëƤ����
				flag_maopi = 1;
			}
			else
			{
				weight_test = Hx711_Get_Weight(weight_maopi);     //��ȡ����ֵ
				if(weight_test < 5000)
					weight_value = weight_test;
			}

			if(flag_billing == 1)																//�����ʼ�Ʒѣ������ܼ�
			{
				if(car_type == 0)
				{
					total_price = (((time_hour*60)+time_minute)*unit_sprice)*100+(time_seconds*unit_sprice)/0.6;
				}
				else
				{
					total_price = (((time_hour*60)+time_minute)*unit_tprice)*100+(time_seconds*unit_tprice)/0.6;
				}
			}
		}
	}
}

/****
*******��ʾ����
*****/
void Display_function(void)
{
	switch(flag_display)									//���ݲ�ͬ����ʾģʽ��־λ����ʾ��ͬ�Ľ���
	{
		case 0:									      			//����0����ʾ�������������͡���ʱʱ�䡢��Ǯ
			Oled_ShowCHinese(1,0,"������");
			sprintf(display_buf,"%d.%03dkg ",weight_value/1000,weight_value%1000);
			Oled_ShowString(1,6,display_buf);

			if(car_type == 0)
				Oled_ShowCHinese(2,0,"���ࣺС��");
			else
				Oled_ShowCHinese(2,0,"���ࣺ����");

			Oled_ShowCHinese(3,0,"��ʱ��");
			sprintf(display_buf,"%03d:%02d:%02d",time_hour,(int)time_minute,(int)time_seconds);
			Oled_ShowString(3,6,display_buf);

			Oled_ShowCHinese(4,0,"�ܼۣ�");
			sprintf(display_buf,"%d.%02dRMB  ",total_price/100,total_price%100);
			Oled_ShowString(4,6,display_buf);
		break;
		
		case 1:															//����1����ʾ����С������ֵ
			Oled_ShowCHinese(1,0,"����С������ֵ");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%d   ",weight_smax);
				Oled_ShowString(2, 7, display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2, 7, "    ");
			}
		break;
		
		case 2:															//����2����ʾ���û�������ֵ
			Oled_ShowCHinese(1,0,"���û�������ֵ");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%d   ",weight_tmax);
				Oled_ShowString(2, 7, display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2, 7, "    ");
			}
		break;
		
		case 3:															//����3����ʾ����С������
			Oled_ShowCHinese(1,1,"����������");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%d   ",unit_sprice);
				Oled_ShowString(2, 7, display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2, 7, "    ");
			}
		break;

		case 4:															//����4����ʾ���û�������
			Oled_ShowCHinese(1,1,"���û�������");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%d   ",unit_tprice);
				Oled_ShowString(2, 7, display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2, 7, "    ");
			}
		break;

		case 5:															//����5����ʾ���ü�ʱ���ʱ
			Oled_ShowCHinese(1,0,"���ü�ʱ���ʱ");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%03d:%02d:%02d",time_hour_max,(int)time_minute_max,(int)time_seconds_max);
				Oled_ShowString(2,3,display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2,3,"   ");
			}
		break;

		case 6:															//����6����ʾ���ü�ʱ����
			Oled_ShowCHinese(1,0,"���ü�ʱ����");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%03d:%02d:%02d",time_hour_max,(int)time_minute_max,(int)time_seconds_max);
				Oled_ShowString(2,3,display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2,7,"  ");
			}
		break;

		case 7:															//����7����ʾ���ü�ʱ�����
			Oled_ShowCHinese(1,0,"���ü�ʱ�����");
			if(time_num % 5 == 0)
			{
				sprintf(display_buf,"%03d:%02d:%02d",time_hour_max,(int)time_minute_max,(int)time_seconds_max);
				Oled_ShowString(2,3,display_buf);
			}
			if(time_num % 10 == 0)
			{
				Oled_ShowString(2,10,"  ");
			}
		break;
		
		default:
		break;
	}
}

/****
*******��������
*****/
void Manage_function(void)
{
	if(flag_display == 0)                  	//��������
	{
		if(car_type == 0)													//�������
		{
			if(weight_value > weight_smax*1000)			//������أ����ⱨ��
			{
				if(alarm_weight == 0)
				{
					alarm_weight = 1;
					alarm_count = 6;
				}
			}
			else
			{
				alarm_weight = 0;
			}
		}
		else																			//����ǻ���
		{
			if(weight_value > weight_tmax*1000)			//������أ����ⱨ��
			{
				if(alarm_weight == 0)
				{
					alarm_weight = 1;
					alarm_count = 6;
				}
			}
			else
			{
				alarm_weight = 0;
			}
		}
		if(RC522_Request(0x52,RF_TP) == MI_OK)	   			//ʵʱ��⿨
		{
			if(RC522_Anticoll(RF_ID) == MI_OK)						//����ײ
			{
				BEEP = 1;
				Delay_ms(100);
				BEEP = 0;
//				if((RF_ID[0]==0x20) && (RF_ID[1]==0xbf) && (RF_ID[2]==0x89) && (RF_ID[3]==0x20))  //�Աȿ���
//				{
					if(flag_billing == 0)											//���û��ʼ�Ʒ�
					{
						if(alarm_weight == 0)										//���û���أ���ʱ�Ʒ�
						{
							if(flag_Step2 == 0)
							{
								flag_billing = 1;
								flag_step2_o = 1;
								flag_step2_c = 0;
							}
						}
					}
					else																			//����Ѿ���ʼ�Ʒѣ���ôֹͣ�Ʒ�
					{
						if(flag_Step2 == 0)
						{
							flag_billing = 0;
							flag_timer_begin_1s = 0;
							time_hour = 0;time_minute = 0;time_seconds = 0;
							total_price = 0;
							Delay_ms(1500);Delay_ms(1500);Delay_ms(1000);
							flag_step2_o = 1;
							flag_step2_c = 0;
						}
					}
//				}
			}
		}
		if(flag_Step2 == 1)															//��������ǿ��ģ���ͨ����رգ�����ǽ�����٣���ʼ��ʱ
		{
			if(CHECK_IR == 1)
			{
				flag_pass = 1;
			}
			else
			{
				if(flag_pass == 1)
				{
					flag_pass = 0;
					flag_step2_o = 0;
					flag_step2_c = 1;
					if(flag_billing == 1)
					{
						flag_timer_begin_1s = 1;
					}
				}
			}
		}
		if(flag_1s == 1)																//���һ�뵽�����ʱ�����
		{
			flag_1s = 0;
			time_seconds++;
			if(time_seconds >= 60)
			{
				time_seconds = 0;
				time_minute++;
				if(time_minute >= 60)
				{
					time_minute = 0;
					time_hour++;
				}
			}																							//���������ٳ�ʱ�����ⱨ��
			if(time_hour == time_hour_max && time_minute == time_minute_max && time_seconds == time_seconds_max)
			{
				if(alarm_time == 0)
				{
					alarm_time = 1;
					alarm_count = 6;
				}
			}
			else
			{
				alarm_time = 0;
			}
		}

		if(alarm_count > 0)															//������ⱨ���м������������ⱨ��
		{
			if(time_num %3 == 0)
			{
				alarm_count--;
				LED = ~LED;
				BEEP = ~BEEP;
			}
		}
		else
		{
			LED = 1;
			BEEP = 0;
		}
	}
	else													         //���ý��棬��������ݡ��رճ��ˡ��ر����ⱨ��
	{
		flag_billing = 0;
		flag_timer_begin_1s = 0;
		time_hour = 0;time_minute = 0;time_seconds = 0;
		total_price = 0;
		if(flag_Step2 == 1)
		{
			flag_step2_o = 0;
			flag_step2_c = 1;
		}
		alarm_count = 0;
		LED = 1;
		BEEP = 0;
	}
}


6 最后

🧿 项目分享:

https://gitee.com/sinonfin/sharing

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Frid仓库管理系统码是一个用于管理仓库和库存的软件程序代码。该码可以帮助企业或组织有效地管理和跟踪仓库中的物品。 Frid仓库管理系统码包含了一系列功能和模块,使用户能够通过电脑或手机轻松管理仓库。它可以实现库存的追踪、物品的入库和出库、库存的报警、库存的盘点等基本功能。 首先,Frid仓库管理系统码具有方便的用户界面,可以用于记录和跟踪各种物品的信息,包括名称、数量、价格等。用户可以通过系统搜索并查看不同物品的详细信息,从而方便了库存管理。 其次,该仓库管理系统码支持物品入库和出库的记录。用户可以通过扫描物品条码或手动输入物品信息来实现物品的入库和出库操作。系统会自动更新库存数量并生成入库出库记录,使用户可以随时了解物品的流动情况。 此外,该码还包括一个库存报警功能。当库存数量低于或高于用户设定的阈值时,系统会自动发出警报提醒用户进行补货或销售。这有助于及时调整库存,并避免库存过量或不足的问题。 最后,Frid仓库管理系统码还提供了库存盘点功能。用户可以通过系统对库存进行逐项盘点,从而确保库存数量与系统数据的一致性。这有助于发现潜在的库存错误或损失,提高仓库的管理效率和准确性。 总的来说,Frid仓库管理系统码是一个方便实用的仓库管理软件代码,能够帮助组织或企业高效管理和跟踪仓库中的物品。通过记录、搜索、入库出库、报警和盘点等功能,该系统码可以提高库存管理的准确性和效率,为用户带来更好的仓库管理体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值