基于51单片机的GPS定位系统(仿真)
发布时间
阅读量:
阅读量
基于51系列单片机开发的GPS定位系统,在采用虚拟串口技术集成VirtualGPS软件的基础上实现了接收与处理GPS信号数据的能力。该系统不仅完成了在仿真环境中完成定位信息的获取与分析,并且具备温湿度监测、超声波距离测量等功能,并通过LED指示灯和蜂鸣器进行状态报警。

一、系统设计
1、串口解析GPS代码
通过虚拟定位技术获取的数据采用固定格式进行存储。我们对传输中的字符串数据进行解码或分析能够最终提取出经、纬度等关键数据。
// GPS纬度提取函数
void removeLatitude(unsigned char temp)
{
uchar i,k=0;
for(i=temp+2;i<temp+13;i++)
uLatitude[k++]=uartBuffer[i];
}
// GPS经度提取函数
void removeLongitude(unsigned char temp)
{
uchar i,k=0;
for(i=temp+2;i<temp+14;i++)
uLongitude[k++]=uartBuffer[i];
}
// GPS速度提取函数
void removeSpeed(unsigned char temp)
{
uchar i,k=0;
for(i=temp+2;i<temp+9;i++)
{
if(uartBuffer[i]==',') break;
uSpeed[k++]=uartBuffer[i];
}
}
// GPS日期提取函数
void removeDate(unsigned char temp)
{
uchar i,k=0;
for(i=temp+2;i<temp+11;i++)
uDate[k++]=uartBuffer[i];
}
// GPS数据处理函数
void uartBufferDeal()
{
uchar i,j;
uchar comma_n=0;
for(i=0;i<100;i++)
{
if(uartBuffer[i]=='R')
{
comma_n=0;//逗号的个数归零
for(j=i;j<100;j++)
{
if(uartBuffer[j]==',')
comma_n+=1;
if(comma_n==2)
removeLatitude(j);
if(comma_n==4)
removeLongitude(j);
if(comma_n==6)
removeSpeed(j);
if(comma_n==8)
removeDate(j);
}
}
}
}
// 经纬度数据格式转换函数
void formatControl()
{
uchar w[13],j[13],D[6],V[10];
uchar i;
for(i=0;i<13;i++)
{
w[i]=uLatitude[i];
j[i]=uLongitude[i];
}
for(i=0;i<6;i++)
{
D[i]=uDate[i];
V[i]=uSpeed[i];
}
uLatitude[0]='W';
uLatitude[1]=w[0];
uLatitude[2]=w[1];
uLatitude[3]=0x20;//空格
uLatitude[4]=w[2];
uLatitude[5]=w[3];
uLatitude[6]=0x27;//单引号
uLatitude[7]=w[5];
uLatitude[8]=w[6];
uLatitude[9]=w[4];//小数点
uLatitude[10]=w[7];
uLatitude[11]=w[8];
uLatitude[12]=0x22;//双引号
uLongitude[0]='J';
uLongitude[1]=j[0];
uLongitude[2]=j[1];
uLongitude[3]=j[2];
uLongitude[4]=0x20;//空格
uLongitude[5]=j[3];
uLongitude[6]=j[4];
uLongitude[7]=0x27;//单引号
uLongitude[8]=j[6];
uLongitude[9]=j[7];
uLongitude[10]=j[5];//小数点
uLongitude[11]=j[8];
uLongitude[12]=j[9];
uLongitude[13]=0x22;//双引号
uDate[0]='D';
uDate[1]=D[0];
uDate[2]=D[1];
uDate[3]='/';
uDate[4]=D[2];
uDate[5]=D[3];
uDate[6]='/';
uDate[7]=D[4];
uDate[8]=D[5];
for(i=0;i<10;i++)
{
if(i==0)
uSpeed[i]='V';
else
uSpeed[i]=V[i-1];
}
}
//==============串口初始化函数==========================
void uartInit()
{
SCON = 0x50; //REN=1允许串行接收状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0; //SMOD设置为0
TH1 = 0xFA; // 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xFA;
TR1 = 1; //定时器T1启动
ES = 1; //开串口中断
}
cpp

2、超声波测量距离
该系统通过定时器用于测量声音发送碰到物体、回弹并被超声波除去所花费的时间,并结合声音在空气中的传播速度进行计算以确定物体距离。
//初始化定时器
void init_time()
{
TMOD = 0x01; //选择定时器0工作 工作方式为方式1
TH0 = 0; //装初值0
TL0 = 0;
TF0 = 0; //中断溢出标志位
ET0 = 1; //开定时器中断
EA = 1; // 开总中断
}
/******************************************************************************* * 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
//超声波1
sbit TRIG2 = P3^2; //超声波的 TRIG端 插在了P3.2口
sbit ECHO2 = P3^3; //超声波的 ECHO端 插在了P3.3口
//超声波2获取距离
int GetDistance2(void)
{
u16 distance,out_TH0,out_TL0;
/*超声波传感器的使用方法:
控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,此时就为此次测距的时间,方可算出距离。如此不断的周期测, 就可以达到移动测量的值了*/
init_time(); //初始化定时器
flag = 0; //置溢出标志位为0
//控制口发一个10US 以上的高电平
TRIG2 = 1;
delay(2);
TRIG2 = 0;
//等待接收端出现高电平
while(!ECHO2);
TR0 = 1; //启动计时器 开始计时
while(ECHO2); //等待高电平结束
TR0 = 0; //关闭低电平
out_TH0 = TH0; //取定时器的值
out_TL0 = TL0;
out_TH0 <<= 8; //右移8位
distance = out_TH0 | out_TL0; //合并为16位的值
distance /= 58;
}
cpp

三、项目演示
仿真运,并将虚拟GPS打开,可以看到如下:

按下按钮触发模式转换,在进入距离测量状态时(即检测到的距离数值小于设定的最小安全距离时),蜂鸣器将发出警报音)。例如

再次按下模式切换,进入温度测量模式,可以看到如下:

四、项目总结
本次设计采用虚拟串口技术,并通过集成虚拟GPS软件实现仿真实验中对GPS功能的延伸。同时系统具备距离测量与报警等功能,并通过虚设串口接口扩展仿真实验的功能。使Proteus朝着更加便捷的方向发展。
全部评论 (0)
还没有任何评论哟~
