基于STM32单片机的GPS北斗定位系统
1. 系统功能简介
本设计为基于STM32的GPS北斗定位系统,核心目标是实现时间与位置信息的获取与显示。系统使用STM32F103C8T6单片机作为主控,配合GPS模块获取当前的年月日、时分秒以及经纬度信息,通过OLED屏幕实时显示,同时将解析后的信息通过串口发送至电脑上的串口调试助手。该系统适用于导航、定位以及时间同步等领域。
系统功能包括:
- 通过GPS模块获取当前时间(年月日、时分秒);
- 实时获取当前位置的经纬度;
- 在OLED屏幕上显示完整的时间与经纬度;
- 通过串口将信息发送至上位机调试助手;
- 数据更新实时性强,适合嵌入式定位应用。
2. 系统电路设计
本系统主要包含STM32单片机最小系统电路、GPS定位模块电路、OLED显示模块电路以及串口通信电路。各模块协同工作,实现定位信息的采集、显示与传输。
2.1 STM32最小系统电路
STM32F103C8T6作为主控芯片,搭建基本的最小系统,包括:
- 电源管理:采用3.3V稳压模块为主控供电;
- 复位电路:外接按键和电容构建复位系统;
- 时钟系统:外接8MHz晶振,为主控提供时钟;
- SWD调试接口:用于程序烧录与调试。
2.2 GPS定位模块电路
系统采用标准NMEA协议的GPS模块(如NEO-6M)。其主要工作原理是通过天线接收卫星信号,并通过串口将定位数据传给STM32。
- 通信接口:使用串口(TXD→STM32 RX);
- 波特率:默认为9600bps;
- 输出格式:NMEA 0183 格式(如
$GPRMC,$GPGGA语句); - 电源供给:模块通常需要3.3V或5V供电。
2.3 OLED显示模块电路
采用基于SSD1306驱动芯片的0.96寸OLED屏幕,显示内容包括时间与位置信息。
- 通信方式:I2C通信;
- 引脚连接:SCL连接STM32的PB6,SDA连接PB7;
- 显示内容:格式化显示年月日、时分秒、纬度和经度。
2.4 串口通信电路
用于将GPS解析后的信息通过STM32串口输出到PC串口调试助手。
- 接口形式:TTL串口;
- 电平转换:通过USB转串口模块(如CH340)连接电脑;
- 通信速率:设置为9600bps,确保与GPS波特率一致。
3. 程序设计
系统程序以STM32为核心,主要包括GPS数据接收与解析、OLED显示、串口数据发送三部分。开发环境为Keil MDK5,使用标准外设库或HAL库进行驱动。
3.1 GPS数据接收与解析模块
GPS模块通过串口持续发送数据,STM32接收后解析出GPRMC或GPGGA语句中的有效时间和经纬度信息。
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
char c = USART_ReceiveData(USART1);
gps_buffer[gps_index++] = c;
if (c == '\n') {
gps_buffer[gps_index] = '\0';
gps_index = 0;
parse_gps_data(gps_buffer);
}
}
}
void parse_gps_data(char *data) {
if (strstr(data, "$GPRMC")) {
// 从GPRMC语句中解析时间和经纬度
sscanf(data, "$GPRMC,%6s,A,%lf,N,%lf,E", time_str, &latitude, &longitude);
}
}
3.2 OLED显示模块
通过I2C方式驱动OLED,将获取的时间和位置信息以友好格式显示在屏幕上。
void oled_display_update(void) {
OLED_Clear();
OLED_ShowString(0, 0, "Time:", 16);
OLED_ShowString(40, 0, time_str, 16);
OLED_ShowString(0, 2, "Lat:", 16);
sprintf(buffer, "%.5f", latitude);
OLED_ShowString(40, 2, buffer, 16);
OLED_ShowString(0, 4, "Lon:", 16);
sprintf(buffer, "%.5f", longitude);
OLED_ShowString(40, 4, buffer, 16);
}
3.3 串口数据发送模块
将解析后的时间与经纬度以字符串形式发送至PC上位机。
void send_gps_to_pc(void) {
char msg[100];
sprintf(msg, "Time: %s, Lat: %.5f, Lon: %.5f\r\n", time_str, latitude, longitude);
USART_SendString(USART2, msg);
}
void USART_SendString(USART_TypeDef* USARTx, char *str) {
while (*str) {
USART_SendData(USARTx, *str++);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
3.4 主程序结构
主循环负责定时刷新OLED与串口输出内容,确保信息实时更新。
int main(void) {
USART1_Init(9600); // GPS串口
USART2_Init(9600); // 上位机串口
OLED_Init();
NVIC_Configuration();
while (1) {
oled_display_update();
send_gps_to_pc();
Delay_ms(1000);
}
}
4. 总结
本系统基于STM32单片机实现了GPS定位数据的采集、显示和串口输出功能。通过GPS模块获取标准NMEA语句,STM32对其解析后,将时间与经纬度信息实时显示在OLED屏幕上,并通过串口传输至上位机,具有较强的实用性与扩展性。系统响应速度快、功能完善,是定位类应用项目中较为经典的设计方案。
更多推荐
所有评论(0)