分享STM32嵌入式毕设:高速收费系统(包含源码、硬件和论文)

文章目录

  • 0 前言
  • 1 主要功能
  • 2 系统架构
  • 3 硬件设计原理图
  • 4 软件设计流程
  • 称重模块HX711模块子流程
  • 步进电机子流程
  • 5 关键代码
  • 6 最后

  • 0 前言

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

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

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

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

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分
  • 🧿 项目分享:见文末!

    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 最后

    🧿 项目分享:见文末!

    作者:Mdc_stdio

    物联沃分享整理
    物联沃-IOTWORD物联网 » 分享STM32嵌入式毕设:高速收费系统(包含源码、硬件和论文)

    发表评论