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屏幕上,并通过串口传输至上位机,具有较强的实用性与扩展性。系统响应速度快、功能完善,是定位类应用项目中较为经典的设计方案。

Logo

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

更多推荐