在这里插入代码片
最近设计了一个项目基于单片机的车辆定位追踪系统设计,与大家分享一下:

一、基本介绍

项目名:基于单片机的车辆定位追踪系统设计
项目编号:mcuclub-dz-869
单片机类型:STM32F103C8T6
具体功能:
1、通过GPS进行定位;
2、通过DS1302获取当前的时间;
3、通过霍尔检测模块获取当前车辆的行驶速度;
4、通过OLED显示检测的参数;
5、通过按键可修正时间、调节车速

二、32实物图

单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C
请添加图片描述

三、原理图

软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
请添加图片描述

四、PCB图

由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。

两层板,上下覆铜接地。
请添加图片描述

五、系统框图

请添加图片描述
本设计以STM32F103C8T6单片机为核心控制器,构建一个基于单片机的车辆定位追踪控制系统。有三个部分组成:中控、输入和输出;中控由STM32F103C8T6单片机组成;
输入部分由五个部分组成:第一部分是GPS检测模块,用于检测当前车辆的位置;第二部分是霍尔传感器,用于获取当前车辆的行驶速度;第三部分是DS1302模块,用于检测获取当前的时间;第四部分是按键模块,用于修正时间以及调节车速;第五部分是供电模块,为系统提供稳定的电源支持。
输出部分由两个部分组成:第一部分是OLED显示模块,用于显示当前GPS的经纬度,当前的时间,速度。第二部分是直流电机模块,由直流电机模拟车轮;

六、软件设计流程

请添加图片描述

七、部分程序展示

软件版本:keil5

逻辑程序和驱动程序分开,分布于main.c和其他.c文件

函数名:显示函数
传参值:无
返回值:无
**********************************/
void Display_Function(void)
{
	if(time_num % 10 == 0)
	{
		switch(display_num)									//根据不同的显示界面,显示不同的内容
		{
			case 0:									      		//界面0:显示测量数据
				sprintf(display_buf, "%02d:%02d:%02d ",(int)ds1302_buf[4],(int)ds1302_buf[5],(int)ds1302_buf[6]);
				Oled_ShowString(1,4, display_buf);
			
				Oled_ShowCHinese(2,0,"经度:");
				sprintf(display_buf,"%f",E_value);
				Oled_ShowString(2,6,display_buf);
			
				Oled_ShowCHinese(3,0,"纬度:");
				sprintf(display_buf,"%f",N_value);
				Oled_ShowString(3,6,display_buf);

				Oled_ShowCHinese(4,0,"速度:");	
				sprintf(display_buf,"%dkm/h  ",speed_value);
				Oled_ShowString(4,6,display_buf);
			break;
			
			case 1:															//界面1:显示设置时
				Oled_ShowCHinese(1,2,"设置时间");
				if(time_num % 20 == 0)
				{
					sprintf(display_buf, "%02d:%02d:%02d",(int)ds1302_buf[4],(int)ds1302_buf[5], (int)ds1302_buf[6]);
					Oled_ShowString(2,4,display_buf);
				}
				if(time_num % 40 == 0)
				{
					Oled_ShowString(2,4,"  ");
				}
			break;
				
			case 2:															//界面2:显示设置分
				Oled_ShowCHinese(1,2,"设置时间");
				if(time_num % 20 == 0)
				{
					sprintf(display_buf, "%02d:%02d:%02d",(int)ds1302_buf[4],(int)ds1302_buf[5], (int)ds1302_buf[6]);
					Oled_ShowString(2,4,display_buf);
				}
				if(time_num % 40 == 0)
				{
					Oled_ShowString(2,7,"  ");
				}
			break;
				
			case 3:															//界面3:显示设置秒
				Oled_ShowCHinese(1,2,"设置时间");
				if(time_num % 20 == 0)
				{
					sprintf(display_buf, "%02d:%02d:%02d",(int)ds1302_buf[4],(int)ds1302_buf[5], (int)ds1302_buf[6]);
					Oled_ShowString(2,4,display_buf);
				}
				if(time_num % 40 == 0)
				{
					Oled_ShowString(2,10,"  ");
				}
			break;
				
			default:
			break;
		}
	}
}


/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
	switch (gears_value)              //根据档位调节转速
	{
		case 0:
			pwm_num = 0;
		break;

		case 1:
			pwm_num = 2;
		break;
		
		case 2:
			pwm_num = 6;
		break;
		
		case 3:
			pwm_num = 10;
		break;		
	}	
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐