单片机+北斗模块实现定位

article/2025/9/19 6:35:46

本文原创,转载请注明出处。小编可能以后不会在简书简书地址上更新了,因为这里的markdown 编辑器太不好用了,没有CSDN 上面的好用,也希望粉丝们多多关注本人CSDN(一样的昵称呦)。

导航是继移动通信之后发展最快的信息产业之一,只要是设计到位置、速度、时间信息的领域斗鱼卫星导航技术相关。中国北斗卫星导航系统是我国自主研制的全球导航系统,是继美国定位系统(GPS)、俄罗斯格洛纳斯卫星导航系统之后的第三个成熟的卫星导航系统。随着北斗导航系统的不断完善,基于北斗导航系统的定位也应用的越来越广泛。小编采用的STC12C5A32S2单片机结合卫星接收模块UM220-III设计的北斗导航系统接收机,UM220-III是双模接收模块,能够同时接受GPS、北斗的信号。这次设计主要完成了导航信息接收机的基本设计,实现了获取实时的位置经纬度、标准时间等相关信息的显示功能。

1 原理介绍

采用以单片机为核心,读取北斗导航系统模块的标准数据,并在 LCD 屏幕上显示当前的经纬度信息。具体的系统方案图如下:
方案设计.PNG

1.1北斗 UM220-III 模块简介

(1)接口电路
北斗模块芯片电路由北斗模块UM220-III N 和其附加电子器件组成。其中北斗模块外接4组排针,在芯片与电源之间串联电感的作用是起差模滤波作用,防止电流突变对芯片产生损坏,并联电感的作用是提高芯片运行的稳定性,防止产生噪声。
模块输入端口(UM220-III N 包括:RXD、GPIO、SDA ,SCL 等 如下图)为防止输入端不定态对模块造成影响,模块内置上拉电阻至VCC,因此在模块未加电时,如果上述端口有数据输入,会在模块VCC上形成串电,又可能造成模块上电失败。
内置电路图.PNG
case1:设计中使用 nRESET功能
在模块上电后,将nRESET拉低5 ms以上,即可确保模块正常启动。
case2:设计中未使用nRESET
在模块上电之前,保证模块已连接输入端口为高阻态或低电平,以避免串电。使用串口1的典型用户,需要吧RXD1设置为高阻态或低电平,未使用的其他PIN悬空。程序流程图如下:
流程图.PNG
(2)LCD 液晶显示器
LCD液晶显示器数据由单片机p0口进行控制,p2口进行指令控制操作。LCD1602是一种专门用来显示字母,数字,符号等的点阵型液晶模块。1602:显示的内容主要是16*2,即可以显示两行,每行16个字符液晶显示模块。相应的管教功能,百度上都是可以查阅的,所以小编这里就不赘述了。
(3)UM220-III 通信协议简介

在Unicore 协议中,输入和输出的语句被称为消息。每条消息均为ASCII 字符组成的字符串。
消息的基本格式为:KaTeX parse error: Can't use function '\r' in math mode at position 32: …2,data3,……[*cc]\̲r̲\n 所有的消息都以 '’(0x24)开始,后面紧跟着的就是消息名。之后的跟的就是不定数目的参数和数据。消息名与数据之间均以逗号隔开(0x2c)进行分割。最后一个参数是可选的校验和,以 ‘*’(0x2A)与前面的数据分割最后,输入的消息以 ’ \r\n’ 结束。每条消息的总长度不超过256个字节,消息名和参数,校验和中的字母不区分大小写。
某些输入命令的某些参数可以省略(在命令描述中被标记为可选)。这些参数可以为空,即在两个逗号之间没有任何字符。
设定串口配置.PNG

2 调试方法

由1.1的原理简介可知,此次课题实现主要由 5 部分组成:系统初始化、设定显示模式、读取预显示内容、送扫描脉冲、送显示数据。
这里对单片机与模块的连接做简要说明。
UM220/um220-3-n 上带有两组 TTL 电平(2.85V),一组标准电平 RS232电平。当单片机的RS232电平接口接到UM220模块上的RS232上,正常通信。UM220模块上的RS232接口是DB9 母头,可以使用公头的连接线与RS230的接口相连,注意的是通信线需要交叉连接,就像TTL电平中的TXD - - RXD,RXD–TXD 一样,RS232电平通信中也是有2根通信电缆,一个是发送端(PCXD),一个是接收端(PCRXD)。若板子上的RS232 的接口是DB9 母头,那么 2 3针就是 PCRXD 和 PCTXD .第五针就是GND,若没有串口线来连接UM220模块的话,可以考虑在DB9下面的2 3 5 针 焊接出3跟线跟单片机的RS232连接。
若单片机是3.3V时,可以将单片机的TTL 接口连接到模块上的TTL接口。连接好后就可以编写程序了。
注意,我们使用的 52 单片机的驱动程序,使用的是11.05926 的晶振,波特率为9600.
#3 程序编写
程序主要是由5部分组成:系统初始化,设定显示模式。读取预显示内容,送扫描脉冲,送显示数据。小编只放主程序部分好了:
定义端口及变量

#include <REG52.H>
#include <stdio.h>
#include <intrins.h>
#include <lcd1602.h>
#include <uart.h>
#include <delay.h>
#include "string.h"
#include <stdlib.h>unsigned char  flag_rec=0;    //接收数据标志
unsigned char num_rec=0;      // 计数标志      
//char code TIME_AREA= 8;		//时区,我们不需要它
unsigned char flag_data;	//date flag
//only displaty cmd $GPGGA information
unsigned char JD[16];		//longitude
unsigned char JD_a;		//经度方向
unsigned char WD[15];		//latitude
unsigned char WD_a;		// 纬度方向
unsigned char date[6];		//date
unsigned char time[6];		//date
unsigned char time1[6];		//date
unsigned char speed[5]={'0','0','0','0','0'};		// 速度
unsigned char high[6];		// 高度
unsigned char angle[5];		//方位角
unsigned char use_sat[2];	// 卫星计数器
unsigned char total_sat[2];	//卫星总数
unsigned char lock;			//位置状态//date handing variable
unsigned char seg_count;	// 逗号计数器
unsigned char dot_count;	//小数点计数器
unsigned char byte_count;	// 位计数器
unsigned char cmd_number;	// 命令模式
unsigned char mode;			//
unsigned char buf_full;		
unsigned char cmd[5];		// 存储命令模式//serial disconnect timer
unsigned  long int tt=0;

主函数 系统初始化

//main
void main () 
{	int jd_second,wd_second;  // 中间变量init_uart();	     //初始化序列号lcd_init() ;       // 初始化 lcd1602delay(200);LCD_Write_String(0,0,"Please Waiting...");   //    "Please Waiting" when it is boot updelay(200);delay(200);delay(200);delay(200);delay(200);delay(200);delay(200);delay(200);delay(200);delay(200);                             // 延迟显示write_com(0x01);			// 清屏

设置延时函数,以形成视觉暂留

while(1)
{
tt++;
if(tt>10000){tt=10000;write_com(0x01);LCD_Write_String(3,0,"No Data!");LCD_Write_String(3,1,"No Data!");delay(200);delay(200);delay(200);delay(200);delay(200);}

···

读取预显示内容,设置显示格式,转16进制为10进制**

    if(flag_rec==1)             // 获取gps数据{flag_rec=0;               // 清除标志符if (lock==1)              //  获取位置信息{  //LCD_Write_String(0,0,"JD  :");    // 显示经度LCD_Write_String(6,0,JD);           // 显示数据LCD_Write_String(9,0,".");           // 进制转换LCD_Write_String(10,0,JD+3);           jd_second=60*atof((char *)(JD+5));     LCD_Write_Char(13,0,jd_second/10+'0');  // 将上一步转换得到浮点数据打印在lcdLCD_Write_Char(14,0,jd_second%10+'0');  // 将上面得到的数据分为两部分,分别打印在LCD 上LCD_Write_Char(15,0,' ');                //填充空间delay(200);                         // 保护lcdLCD_Write_String(0,1,"WD  :");     // 显示下一行LCD_Write_String(6,1,WD);LCD_Write_String(8,1,"."); LCD_Write_String(9,1,WD+2);           // 小数点wd_second=60*atof((char *)(WD+4)); 
// 将字符串转换成浮点数LCD_Write_Char(12,1,wd_second/10+'0');LCD_Write_Char(13,1,wd_second%10+'0');LCD_Write_String(14,1,"  ");delay(200);}}}}

串口中断函数及模式判断
判断的主要依据就是接收端接受消息与预结果匹配,通过设置数组[i,j]和if函数进行判断匹配(发送报文的消息内容见1.3的UM220的通信协议详解)

//serial interruupt service function
void ser_int (void) interrupt 4
{unsigned char tmp;if(RI){tt=0;RI=0;tmp=SBUF;            // 从缓冲区接收数据switch(tmp)   //if $GPGGA,$GNGSW,$GNRMC,get data then processing it{//date start with $case '$':cmd_number=0;		// 清除命令模式mode=1;				// 选项命令接收模式byte_count=0;		//清除位计数器flag_data=1;     // 设置数据标志flag_rec=1;		// 设置数据接收标志break;case ',':         //Eg:$GNRMC,134645.000,A,2603.964436,N,11912.410232,E,0.000,15.744,030718,,E,A*0Bseg_count++;		// 计数器增加byte_count=0;break;case '*':switch(cmd_number){case 1:buf_full|=0x01;   //00000001break;case 2:buf_full|=0x02;  //00000010break;case 3:buf_full|=0x04;  //00000100break;}mode=0;         //clear modebreak;default:
// receive date cmdif(mode==1)	{cmd[byte_count]=tmp;	// 获取数据和存储缓冲区					if(byte_count>=4)          //overlook cmd which less 4 bit{			if(cmd[0]=='G')           // 第一个字符{if(cmd[1]=='N'){if(cmd[2]=='G'){if(cmd[3]=='G'){if(cmd[4]=='A')//判断$GNGGA{cmd_number=1;      //数据类型mode=2;            //接收日期seg_count=0;       //comma counter clearbyte_count=0;      //位计数器清除}}else if(cmd[3]=='S')       //命令模式$GNGSV{if(cmd[4]=='V'){cmd_number=2;mode=2;                //获取数据seg_count=0;byte_count=0;}}}else if(cmd[2]=='R')   //命令模式 $GNRMC{if(cmd[3]=='M'){if(cmd[4]=='C'){cmd_number=3;mode=2;         //存储数据seg_count=0;byte_count=0;}}}}}}}
//日期处理
			else if(mode==2){switch (cmd_number)  //if receive data{case 1:				//get and store data,$GPGGA,[],[],[],[],[],[],[],[],[].....switch(seg_count)   //  comma 计数器{case 2:		// 2rd逗号后的纬度if(byte_count<9){WD[byte_count]=tmp;   //获取纬度}break;case 3:		//纬度方向if(byte_count<1){WD_a=tmp;}break;case 4:		//经度if(byte_count<10){JD[byte_count]=tmp; //存储}break;case 5:		//经度方向if(byte_count<1){JD_a=tmp;}break;case 6:		//locationif(byte_count<1){lock=tmp;}break;case 7:		if(byte_count<2){use_sat[byte_count]=tmp;}break;case 9:		// 高度if(byte_count<6){high[byte_count]=tmp;}break;}break;case 2:	//命令模式  $GPGSVswitch(seg_count){case 3:		// 卫星总数if(byte_count<2){total_sat[byte_count]=tmp;}break;}break;
//命令模式3:无SUEcase 3:				//$GPRMCswitch(seg_count){case 1:		//timeif(byte_count<6){				time[byte_count]=tmp;	}break;case 2:		// 位置			if(byte_count<1){if (tmp=='V') {lock=0;}else{lock=1;}}break;case 3:		//lititude			
//									if(byte_count<9)
//									{
//										WD[byte_count]=tmp;//我们只需要一次
//									}break;case 4:		//					if(byte_count<1){WD_a=tmp;}break;case 5:		//			
//									if(byte_count<10)
//									{
//										JD[byte_count]=tmp;  //do not get again
//									}break;case 6:		// 直线方向	if(byte_count<1){JD_a=tmp;}break;case 7:		// 速度处理		if(byte_count<5){speed[byte_count]=tmp;}break;case 8:		// 方向角				if(byte_count<5){angle[byte_count]=tmp;}break;case 9:		//other			if(byte_count<6){date[byte_count]=tmp;}break;}break;}}byte_count++;		// 位计数器++break;}}

4 结果显示

1.PNG
IMG_20190630_091924.jpg

IMG_20190630_103508.jpg


http://chatgpt.dhexx.cn/article/GVSUda7f.shtml

相关文章

北斗卫星导航系统介绍

北斗卫星导航系统 导言 2020年3月9日&#xff0c;我国在西昌卫星发射中心用长征三号乙运载火箭&#xff0c;成功发射北斗系统第五十四颗导航卫星。距离北斗三号系统建成&#xff0c;仅一步之遥。从双星导航定位到54颗北斗嵌满星空&#xff0c;中国北斗走过了28载问天路。作为…

中科微北斗定位模组ATGM336H简介

36H系列卫星定位模块 产品介绍 ATGM336H是高灵敏度&#xff0c;支持BDS/GPS/GLONASS卫星导航系统的单系统定位&#xff0c;以及任意组合的多系统联合定位的接收机模块。ATGM336H基于本公司自主独立研发的单芯片AT6558&#xff0c;拥有自主知识产权。ATGM336H可以直接替换U-blox…

卫星定位导航|GPS定位模块,北斗定位模块的应用场景及选型建议

室外位置信息的获取主要依赖于常见系统有GPS、BDS、GLONASS和GALILEO四大卫星导航系统。GNSS的发展最初是以军事为目的的&#xff0c;但是它的成熟完善必须依赖于民用市场的高度发展。GNSS民用市场主要应用于高精度测绘、位置搜索、车载导航、移动目标监控等诸多专业和消费领域…

北斗定位导航授时服务简介

北斗系统服务规划 北斗系统具备导航定位和通信数传两大功能&#xff0c;提供七种服务。具体包括&#xff1a;面向全球范围&#xff0c;提供定位导航授时&#xff08;RNSS&#xff09;、全球短报文通信&#xff08;GSMC&#xff09;和国际搜救&#xff08;SAR&#xff09;三种服…

北斗/GPS如何实现定位

北斗/GPS是怎么实现定位的&#xff1f;为什么卫星定位需要4颗以上卫星才能定位&#xff1f;相信很多人都会有这种困惑&#xff0c;通过本文的专业解答&#xff0c;为你揭开卫星导航的神秘面纱。   在无高度的一维空间上&#xff0c;当知道信号发射位置时&#xff0c;准确定位…

【模块】北斗+GPS双模定位模块

在相当长的时间里&#xff0c;GNSS(全球卫星导航系统, Global Navigation Satellite System)是以美国的GPS(Global Positioning System, 全球定位系统)一家独大的。随着各国对定位系统的逐渐重视&#xff0c;都陆续推出自己的卫星导航系统&#xff0c;比如我国的北斗、俄罗斯的…

手机安装Linus系统

首先做准备工作&#xff0c;我们需要三个app&#xff0c;如下图所示&#xff1a; 分别是Anlinux(用于获取linux系统&#xff0c;这里我们选择Ubuntu系统),Termux(模拟Linux环境),旋风加速器(因为Termux的下载源在国外&#xff0c;所以我们需要使用其来连接国外站点) 首先我们打…

大神Linus

大神Linus 人物简介 林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds, 1969年~ &#xff09;&#xff0c;著名的电脑程序员、黑客。Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统&#xff08;作业系统&#…

Linus工作室 2021年 PB级存储方案

来自于加拿大Linux 工作室 本文章仅整理内容&#xff0c;另外还有一些本人的理解 实际上这已经是Linux PB计划第二代了&#xff0c;比第一代更加NB 原视频地址&#xff1a; https://www.bilibili.com/video/BV1nj411f7NL/?spm_id_from333.788.videocard.4 https://www.bilibil…

Linus安装JDK

一. 下载jdk1.8 链接&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html, 选择Linus64位 下载完成后,将压缩包导入到linus opt文件夹下 tar -zxvf jdk-8u241-linux-x64.tar.gz 解压文件夹 ,然后修改环境变量 vim /etc/profile 按 “i…

Linux 30 周年,听 Linus 聊聊心路历程和开源洞见

Linus Torvalds 来了&#xff01; 1991 年&#xff0c;21 岁的赫尔辛基大学学生 Linus Torvalds&#xff08;以下简称 Linus&#xff09;创建了 Linux 内核。过去 30 年&#xff0c;Linux 从一个基于兴趣的小项目&#xff0c;发展成统治世界的操作系统内核&#xff0c;而 Linu…

为何 Linus 一个人就能写出Linux这么强的系统?

转自&#xff1a;默然 Coldwings&#xff08;知乎&#xff09; 链接&#xff1a;www.zhihu.com/question/63187737 他是谁&#xff0c;Linus&#xff01; 林纳斯・托瓦兹&#xff08;Linus Torvalds, 1969 年~&#xff09;&#xff0c;著名程序员&#xff0c;Linux 内核的发…

linus 指针 linux,怼天怼地怼空气的Linus喜欢怎样的工作方式?

Linus Torvalds的“暴脾气”是出了名的&#xff0c;看到令自己不爽的事情就会怼过去&#xff0c;比如&#xff1a; 他曾经说Intel提交的漏洞修复程序是彻底的垃圾&#xff01; 当别人说Git没用C开发的时候&#xff0c; 他反击说“C是一种可怕的语言” 他喷别人的Pull Request :…

跑步机上的精彩人生——Linus大神传奇

全面学python的时代&#xff0c;作为程序员你怎么看&#xff1f; https://edu.csdn.net/topic/python115?utm_sourcecsdn_bw 本文来自微信公众号&#xff1a;格友 在这样的软件时代里&#xff0c;越来越多的人工作时离不开电脑&#xff0c;于是便有了各种各样的操作电脑的方式…

Git源码(Linus 版本)详解

温馨提示&#xff1a;建议打开目录观看 Linus 发疯文学欣赏 &#x1f47e; Git 是 Linux 之父 Linus Torvalds 于2005年开发的用于帮助管理 Linux 内核开发的开源版本控制软件。 美好的一天从阅读 Linus 的发疯文学开始。 (1) Linus 教你学习 Git (2) Linus 评价 CVS (Concur…

linux定时器王贤才,Linux之父Linus Torvald评价C++

Linux之父:C一无是处 不适合LINUX内核开发 Linux之父Linus Torvalds曾经在三年前&#xff0c;因为微软的一位同学质疑Git用C语言开发&#xff0c;而将C痛批了一顿。当时&#xff0c;他是这样评论的&#xff1a; C正处在困境当中&#xff0c;它既无助于简化&#xff0c;以实际用…

好书推荐--Linux之父Linus的自传《Just for Fun》

这本书非常有趣&#xff0c;它让你不由感到&#xff0c;在这个浮躁的社会&#xff0c;兴趣爱好是多么的重要&#xff01;至少能让你收获快乐。巴菲特说过这样一段话&#xff1a;“没钱没人脉时&#xff0c;请逼自己做好这三件事。第一&#xff0c;找到自己的兴趣爱好&#xff1…

linus 用的linux版本,Linus Torvalds的重大消息

Linux创始人Linus Torvalds在内核邮件列表上宣布正式释出Linux Kernel 4.9&#xff0c;这个版本被称为时尚改进最大的版本&#xff0c;同时4.10合并窗口已经开启。但值得注意的是&#xff0c;为期两周的合并窗口预计将在圣诞节这天关闭&#xff0c;因为假期的原因Torvalds考虑缩…

Linus基础

1.使用whereis查找locate命令 使用which查找whereis命令 使用locate查找rm命令 2.使用find命令查找当前路径下的所有普通文件 使用find查找file1.txt,file2.txt,file3.txt 3.cut命令的使用 4.uniq新建uniq_data.txt 使用uniq命令输出的结果 使用uniqming输出值重复的行 使用…

Linus:我终于在 M2 芯片的 MacBook 上发布了 Linux 最新版本!

整理 | 彭慧中 责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 近日&#xff0c;Linus Torvalds&#xff08;以下简称“Linus”&#xff09;宣布Linux Kernel 5.19正式版终于可以和大家见面了。这一版本意义重大&#xff0c;虽然它比原计划晚了…