您的位置 首页 开关

51单片机与GPS串口通讯

最近在考研调剂没有学校要,找工作又找不到,快崩溃了。刚想找点乐子,忘掉烦恼。开了一下自己的工具箱,发现以前买了一块二手的车载GP

最近在考研调剂没有校园要, 找工作又找不到, 快溃散了。

刚想找点乐子,遗忘烦恼。开了一下自己的工具箱,发现曾经买了一块二手的车载GPS,由于一向没有材料就放在那没有用。

细心看了一下GPS发现芯片的LOGO和类型仍是看得出来的,这是一块用了索尼CXD2931R作为接纳GPS信号的芯片,原本想到网上看看有没有现成的著作,但是很惋惜没能找到(或许现已别筛选了),没办法只能到ALLDATASHEET上下了这份芯片的手册, 看了下手册,发现sony的这款GPS芯片很高级呀:集成32位处理器、DSP、RAM和ROM的容量也很大(怪不得GPS价格这么贵)。

原本GPS运用串口来给主机发送信息的,这块GPS的通讯速率是4800bit/s,了解这么多就差不多了,现在只需找找到串口和电源线在哪就行了,对着手册找确实便是便利。

接好线,用一下comdebug软件看看GPS会不会发信息,效果很好,看到了所谓的NMEA码,但是没有定位到, 或许是在室内的原因,很是快乐呀。

原本想用AVR,但是芯片都被同学借走了,而pic的仿真器找不到了,(悲惨剧的时分什么都悲惨剧) 只能用51了,51很久没有用了,又只能求助书本了,这样下来半响的时刻就没了;搞电子确实很不简单,尽管原理说起来很简单。 下载共享一下效果:

#include
#include 12864.h>

sbit light = P1^0;

#define light_on()light=1
#define light_off()light=0

void init_serial(void);
void disp();

unsigned char ch;
unsigned char str[65]={“$GPRMC,”};
unsigned char read_flag= 0;

bit rev_flag = 0;
bit cur_rev = 0;

void main()
{
unsigned int i=0;
//unsigned char ff=0;
light_off();
str[64] = ;
lcd_init();
init_serial();
while(1)
{

if( cur_rev && read_flag&& (rev_flag == 0) )//$PRMC
{
switch( ch )
{
case $:break;
case G:read_flag ++; break;
case P:read_flag ++; break;
case R:read_flag ++; break;
case M:read_flag ++; break;
case C:read_flag ++; break;
case ,:read_flag ++; rev_flag = 1; break;
default :read_flag = 0;break;
}
cur_rev = 0;
}

if( cur_rev && rev_flag == 1 )
{
light_off();
if( read_flag < 64 )
{
str[ read_flag ] = ch;
read_flag ++;
}
cur_rev = 0;
}

if( read_flag == 64 )
{

ES = 0;
disp();
light_on();
read_flag = 0;
rev_flag = 0;
ES = 1;
}

i ++;
if( i <= 50000 ) light_off();
else if( i > 50000 && i <= 60000 )light_on();
else i = 0;

}
}

void init_serial()//方法1 定时器1,波特率4800

{
//初始化定时器T1
TMOD = 0x20;
TL1 = 0xFA;
TH1 = 0xFA;//波特率为:4800
ET1 = 0;//T1用作波特率发生器,制止T1中止
TR1 = 1;//发动定时器T1
SCON = 0x70;//方法1,SM2位为1
PCON = 0;//波特率无倍增
EA = 1;
ES = 1;
}

void serial () interrupt 4
{
if (RI)
{
RI = 0;
ch = SBUF;
//lcd_move_right(ch);
cur_rev = 1;
if( ch == $ && read_flag == 0 ) read_flag ++;//开始位
}
}

void disp()
{
unsigned char i=0;
//unsigned char j;
goto_ddram(1,1);
while( str[i] != )
{
lcd_move_right(str[i]);
i++;
if( i == 16 )goto_ddram(2,1);
if( i == 32 )goto_ddram(3,1);
if( i == 48 )goto_ddram(4,1);
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/258105.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部