基于51单片机的GPS定位系统

1.项目硬件MCU采用AT89C52、GPS采用的是NE0-6M的GPS模块、显示模块采用LCD1602

2.项目软件代码

1.main.c

#include <reg52.h> 
#include <intrins.h>
#include <stdio.h>
#include "delay.h"
#include "1602.h"

// 定义串口引脚
sbit NEO_TX = P3^0;  // NEO-6M 模块的 TX 引脚连接到 P1.0 引脚
sbit NEO_RX = P3^1;  // NEO-6M 模块的 RX 引脚连接到 P1.1 引脚

/**The UART1 stage1**/
#define STAGE_SOHE  0x01
#define STAGE_TYPE  0x02
#define STAGE_NONE  0x03
#define STAGE_DATA  0x04
#define BAUDRATE 9600  // 设置波特率为 9600bps

unsigned char Lin0_No[16]="N:000.000000 ";//显示北纬
unsigned char Lin1_Ea[16]="E:000.000000 ";//显示东经
unsigned long xdata time_20ms=0;

unsigned char xdata    devide_flag;                //GPS数据逗号分隔符
unsigned char xdata    speed_end;            //收速度数据结束标志
unsigned char xdata    dir_end;            //收方向角数据结束标志
unsigned char xdata  sysmode_GPS=0;                    //gps有效无效标志
unsigned char  xdata ew_flag;                        //东西标志
unsigned char  xdata ns_flag;                        //南北标志

unsigned char xdata    gps_infor_weijing[17];    //暂存经纬度 格式是以度分秒的是形式
unsigned char xdata    gps_infor_speed[4];       //暂存速率
unsigned char xdata    gps_infor_time[6];        //时间暂存
unsigned char xdata    gps_infor_date[6];        //日期暂存
unsigned char xdata    gps_infor_dir[3];         //方向暂存

unsigned char xdata recv1_step=STAGE_SOHE;                       //串口1接收指令步骤
unsigned char xdata uart1_r_buf;                       //串口的缓存
unsigned char xdata rev1_buf_busy;                    //串口接收忙碌标志
unsigned char xdata temp1_buf[85];                   //串口接收数组
unsigned int xdata record1=0;   
unsigned  char times = 0;        //延时计数
void Init_Timer0(void);//定时器初始化
void UART_Init(void);

void main (void)
{
    unsigned char num=0;
    unsigned long Mid_Du;       //中间变量 暂存经纬度的整数部分 即度
    unsigned long Mid_Fen;      //中间变量 暂存经纬度的小数部分 即分  gps原始数据是度分秒格式
    unsigned long Mid_Vale;     中间变量 暂存经纬度 并将其扩大了10000000倍
    unsigned char i ;

    Init_Timer0();        //定时器0初始化
    
    UART_Init();
        
    LCD_Init();           //初始化液晶
    DelayMs(20);          //延时有助于稳定
    LCD_Clear();          //清屏

    DelayMs(120);

    while(1)         //主循环
    {
        if(sysmode_GPS==1)        //检测gps是否有效数据
            {
                sysmode_GPS=0;            //清除有效位
                times = 0;    //防止gps数据未更新就误判断数据无效
                Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000;    //处理纬度 暂存整数部分扩大10000000
                
                Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+
                  (gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+
                    (gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100;        //处理纬度 暂存小数部分扩大10000000       
                Mid_Fen=Mid_Fen/60;                                                     //分秒换算为小数位
                Mid_Vale=Mid_Du+Mid_Fen;        //最终纬度 格式为000.00000000 非度分秒格式
                Lin0_No[0]='N';                  
                Lin0_No[1]=':';                  
                Lin0_No[2]='0';                  
                Lin0_No[3]=Mid_Vale/10000000+0x30;                  //将处理后的纬度填入字符串 并打印显示
                Lin0_No[4]=(Mid_Vale/1000000)%10+0x30;
                Lin0_No[5]='.';
                Lin0_No[6]=(Mid_Vale/100000)%10+0x30;
                Lin0_No[7]=(Mid_Vale/10000)%10+0x30;
                Lin0_No[8]=(Mid_Vale/1000)%10+0x30;
                Lin0_No[9]=(Mid_Vale/100)%10+0x30;
                Lin0_No[10]=(Mid_Vale/10)%10+0x30;
                Lin0_No[11]=Mid_Vale%10+0x30;
                
                Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //处理经度 暂存整数部分扩大10000000
                
                Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+
                  (gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+
                    (gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; //处理经度 暂存小数部分扩大10000000       
                Mid_Fen=Mid_Fen/60;                                                //分秒换算为小数位
                Mid_Vale=Mid_Du+Mid_Fen;                                          //最终经度 格式为000.00000000 非度分秒格式
                Lin1_Ea[0]='E';                  
                Lin1_Ea[1]=':';     
                Lin1_Ea[2]=Mid_Vale/100000000+

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值