⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps_ok.c

📁 在51单片机上实现GPS的源码!!很不错!!值得一看
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "AT89X52.H"
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
/********************************************************************/
#define  LCD12864_IO  P0
#define  LINE1   0
#define  LINE2   1
#define  HIGH   1
#define  LOW    0
#define  CLERADISPLAY LCD12864_command(0x01);
#define   uchar  unsigned char
#define   uint   unsigned int
sbit xssjj=P2^5;

uchar cs_temp[3];


uchar data jinDu[13];
uchar data weiDu[13];
uchar data time[9]={0x00};
uchar data date[11]={0};
uchar data gps_zhen[6];

uchar code shi[5]={"时间 "};
uchar count3;
uchar code zhenflag[]={"$GPGGA"};

uchar code  weiB_a[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code  weiB_b[8]={0x80,0xa0,0x50,0x28,0x14,0x0a,0x05,0x01};
uchar  weiB_c[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uchar  gps_x=20,gps_y=30;

 uchar  gps_t[24]={3, 21,41,0xe0,0x00,  35,30,0xe0,0x40,  43,17,0xe0,0x80,  90,30,0xe0,0xc0};
//uchar  gps_t[24] ;
uchar anjian_z=0;
uchar zhand_num;

sbit     insert   = P2^7 ;      //插入站点 录音
sbit     del      = P2^6 ;           //删除站点 停止录音
sbit     sel_nex  = P2^5 ;     //浏览站点/翻页 放音
bit insert_flag=1;
bit del_flag=1;
bit  sel_nex_flag=1;


unsigned char code gImage_test[1024] = {
/*--ypcol—map  宽度x高度=128x64  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x60,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x26,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x04,0x4F,0x0C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xC0,0x20,0x00,0x00,0x00,0x08,0x99,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x00,0x20,0x00,0x00,0x00,0x11,0x18,0xC3,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0E,0x00,0x20,0x00,0x00,0x00,0x22,0x0C,0x61,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x1F,0xE0,0x00,0x00,0x00,0x44,0x06,0x30,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x71,0x80,0x00,0x00,0x00,0x88,0x03,0x18,0x60,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0xC1,0x80,0x00,0x00,0x01,0x10,0x01,0x98,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x41,0x01,0x80,0x00,0x00,0x00,0x20,0x00,0xF0,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x47,0xB7,0xFF,0xE0,0x00,0x01,0x20,0x00,0x61,0x00,0x00,0x00,0x00,
0x00,0x3F,0xE0,0x39,0xCC,0x00,0x20,0x00,0x01,0x20,0x00,0x03,0x80,0x00,0x00,0x00,
0x00,0x20,0x20,0x00,0xCC,0x00,0x20,0x00,0x01,0x21,0xFF,0xC6,0xC0,0x00,0x00,0x00,
0x00,0x20,0x20,0x00,0x4C,0x00,0x20,0x00,0x01,0x21,0x00,0x44,0x61,0x80,0x00,0x00,
0x00,0x20,0x20,0x00,0x37,0xFF,0xE0,0x00,0x01,0x21,0x00,0x44,0x20,0xC0,0x00,0x00,
0x00,0x20,0x20,0x00,0x00,0xC3,0x00,0x00,0x01,0x21,0x00,0x44,0x20,0x60,0x00,0x00,
0x00,0x20,0x20,0x00,0x00,0xC3,0x00,0x00,0x01,0x21,0xFF,0xC4,0x40,0x30,0x00,0x00,
0x00,0x7F,0xFF,0xE0,0x00,0xC3,0x00,0x00,0x01,0x20,0x00,0x04,0x40,0x18,0x00,0x00,
0x00,0x40,0x00,0x20,0x07,0xFF,0xE0,0x00,0x01,0x20,0x00,0x04,0x40,0x0C,0x00,0x00,
0x00,0x40,0x00,0x20,0x04,0x00,0x20,0x00,0x01,0x21,0xFF,0xC4,0x40,0x06,0x00,0x00,
0x00,0x40,0x00,0x20,0x04,0x00,0x20,0x00,0x01,0x21,0x00,0x44,0x60,0x03,0x00,0x00,
0x00,0x40,0x00,0x20,0x04,0x00,0x20,0x00,0x01,0x21,0x00,0x44,0x20,0x01,0x80,0x00,
0x00,0x40,0x00,0x20,0x07,0xFF,0xE0,0x00,0x01,0x21,0x00,0x44,0x30,0x00,0x80,0x00,
0x00,0x7F,0xFF,0xE0,0x00,0x00,0x3F,0xFF,0xFF,0x01,0xFF,0xC4,0x18,0x00,0x00,0x00,
0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0C,0x00,0x00,0x00,
0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x10,0x00,
0x00,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x83,0x87,0x18,0x00,
0x00,0x40,0x00,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0xC0,0xF9,0x8C,0x00,
0x00,0x40,0x00,0x24,0x00,0x02,0x00,0x00,0x01,0x27,0xF0,0x00,0x60,0x00,0xC6,0x00,
0x00,0x40,0x00,0x24,0x00,0x02,0x00,0x00,0x01,0x24,0x10,0x00,0x30,0x00,0x63,0x00,
0x00,0x40,0x00,0x24,0x00,0x02,0x00,0x00,0x01,0x24,0x10,0x00,0x18,0x00,0xC1,0x80,
0x00,0x7F,0xFF,0xE4,0x00,0x02,0x00,0x00,0x01,0x24,0x10,0x00,0x0F,0xFF,0x80,0xC0,
0x00,0x00,0x05,0x07,0xFF,0xFE,0x00,0x00,0x01,0x24,0x10,0x00,0x00,0x00,0x0C,0x60,
0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x24,0x10,0x00,0x00,0x00,0x1E,0x30,
0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x24,0x18,0x00,0x00,0x00,0x33,0x18,
0x00,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x01,0x24,0x14,0x00,0x07,0xFF,0xE1,0x8C,
0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x24,0x0A,0x00,0x04,0x00,0x00,0xC6,
0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x24,0x05,0x00,0x04,0x00,0x00,0x63,
0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x24,0x02,0x80,0x04,0x00,0x00,0x31,
0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x24,0x01,0x40,0x07,0xFF,0xF0,0x10,
0x00,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0xFE,0x00,0x00,0x30,0x30,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x02,0x00,0x00,0x30,0x60,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x02,0x0F,0xFF,0xE0,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x80,0x02,0x08,0x00,0x01,0x81,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xC0,0x02,0x08,0x00,0x03,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x60,0x02,0x08,0x00,0x06,0x06,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3F,0xFE,0x08,0x00,0x0C,0x0C,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0xFF,0xF8,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x30,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x60,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7F,0xFF,0xC0,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1F,0xFF,0xF8,0x80,0x00,0x21,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x23,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x26,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x2C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x38,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x04,0x80,0x00,0x20,0x00,
  };


//isd4002
sbit     ss   = P1^7 ;
sbit     sclk = P1^6  ;
sbit     mosi = P1^5  ;
//sbit     led  = P3^1  ;//LED指示录音

uchar    cmdh;
uchar    cmdl;

void delay(uchar ms) ;
void spi_send(uchar isdcmd);
void cmdSend();
void powerup();
void Stop();
void Reco();
void Play();

//*****************************24c02*******************************/
sbit SDA  = P1^1;                     /* iic数据传送位 */
sbit SCL  = P1^0;                     /* iic时钟控制位 */
/* 函数声明 */
void iic_wait(void);                  /* iic延时       */
void iic_start(void);                 /* 开启iic总线   */
void iic_stop(void);                  /* 关闭iic总线   */
void iic_ack(void);                   /* 发送ACK信号   */
void iic_no_ack(void);                /* 发送NOACK信号 */
bit iic_wait_ack(void);               /* 等待ACK信号   */
void iic_send_byte(uchar demand);     /* MCU向iic设备发送一个字节 */
uchar iic_receive_byte(void);         /* MCU从iic设备接收一个字节 */
void write_iic_data(uchar write_data[], uchar address, uchar num);
void read_iic_data(uchar read_data[], uchar address, uchar num);


/******************************************************************/
sbit LCD12864_EN=P2^2;  //en
sbit LCD12864_DIN=P2^0; //rs
sbit LCD12864_CLK=P2^1; //rw
sbit cs1=P2^3;
sbit cs2=P2^4;
/********************************************************************/
//void lcd_gps_wei(unsigned char wei_x,unsigned char wei_y);

void LCD12864_DELAY(unsigned int a)
{
for(;a>0;a--)
_nop_();
}
/*******************************************************************/
void LCD12864_busy(void)
{
    bit BF = 0;
    LCD12864_EN=0;
    LCD12864_DIN=0;
    LCD12864_CLK=1;
    LCD12864_IO=0xff;  //单片机读数据之前必须先置高位
    do
    {
     	LCD12864_EN=1;
        BF=LCD12864_IO&0x80;
        LCD12864_EN=0;
    } while(BF);
}
/*******************************************************************/
//          写入命令
/*******************************************************************/
void LCD12864_command(unsigned char command)
{
    LCD12864_busy();
    LCD12864_EN=0;
    LCD12864_DIN=0;
    LCD12864_CLK=0;

    LCD12864_EN=1;
    LCD12864_IO=command;
    LCD12864_EN=0;
}
/*******************************************************************/
//          写入一字节数据
/*******************************************************************/
 void LCD12864_data(unsigned char dat)
{
    LCD12864_busy();
    LCD12864_EN=0;
    LCD12864_DIN=1;
    LCD12864_CLK=0;

    LCD12864_EN=1;
    LCD12864_IO=dat;
    LCD12864_EN=0;
}
void LCD12864_char(unsigned char dat)
{
if((dat>=0)&&(dat<=9))
     dat|=0x30;
    LCD12864_data(dat);
}

/*******************************************************************/
//          设置显示位置    X(1~8),Y(1~4)
/*******************************************************************/
void LCD12864_address(unsigned char line,unsigned char row)
{
    switch(row)
    {
        case 1:LCD12864_command(0x7f + line);
        break;
        case 2:LCD12864_command(0x8f + line);
        break;
        case 3:LCD12864_command(0x87 + line);
        break;
        case 4:LCD12864_command(0x97 + line);
        default:
        break;
    }
}
/*******************************************************************/
//          在指定位置显示字符串
/*******************************************************************/
void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
{
    unsigned char LCD12864_temp;
    LCD12864_address(row,line);
    LCD12864_temp=*s;
    while(LCD12864_temp != 0x00)
    {
        LCD12864_data(LCD12864_temp);
        LCD12864_temp=*(++s);
    }
}
/*******************************************************************/
//          绘制一幅图片
/*******************************************************************/
void LCD12864_picture(unsigned char *gImage)
{
    unsigned char X = 0x80,Y = 0x80;
    unsigned char i,j;
    for(i=0;i<64;i++)
    {
        for(j=0;j<16;j++)
        {
            LCD12864_command(0x34);
            LCD12864_command(Y);
            LCD12864_command(X);
            LCD12864_data(*(gImage+i*16+j));      //  low 8 bits
            LCD12864_data(*(gImage+i*16+j+1));    //  high 8 bits
            LCD12864_command(0x36);
            X++;
            j++;
        }
         //Delay_100xuS(1000);
           Y++;
         if(Y>0x9f)
            Y=0x80;
        X=0x80+((i+1)/32)*8;
    }
    LCD12864_command(0x30);
}
/* 描点 */
void lcd_gps_xp(unsigned char X,unsigned char Y,unsigned char *weiz)
{
            unsigned char a,b;
            LCD12864_command(0x34);
            LCD12864_command(0x80+Y%32);
            if(X%8==0)
                       X++;
            else if(X%8==7)
                       X--;
            if(Y<32)
                 LCD12864_command(0x80+X/16);
            else if(Y<64)
                 LCD12864_command(0x88+X/16);
            if(X%16<8)
            {
                a=*(gImage_test+Y*16+X/8)| weiz[X%8];
                b=*(gImage_test+Y*16+X/8+1);
            }
            else
            {
                a=*(gImage_test+Y*16+X/8-1);
                b=*(gImage_test+Y*16+X/8)| weiz[X%8];
            }
             LCD12864_data(a);      //  low 8 bits
             LCD12864_data(b);    //  high 8 bits
             LCD12864_command(0x36);
}
/********************************************************************/
void Delay_100xuS(uint x) //
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<9;j++ );
    }
}
/*******************************************************************/
//          初始化设置
/*******************************************************************/
void LCD12864_init(void)
{
    CLERADISPLAY      //  clear DDRAM
    LCD12864_command(0x30);     //  8 bits unsigned interface,basic instrument
    LCD12864_command(0x02);     //  cursor return
    LCD12864_command(0x0c);     //  display,cursor on
    LCD12864_command(0x03);
    LCD12864_command(0x06);
    CLERADISPLAY       //  clear DDRAM
}

void Mcu_init(void)
{
LCD12864_init();
CLERADISPLAY
CLERADISPLAY
LCD12864_init();
}

void Delay(void)
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<200;i++)
        for(j=1000;j>0;j--);
}
/*描位置*/
void lcd_gps_wei(unsigned char wei_x,unsigned char wei_y)
{
  unsigned char i;
  for(i=0;i<3;i++)
  {
     lcd_gps_xp(wei_x,wei_y-1,weiB_c);
     lcd_gps_xp(wei_x,wei_y,weiB_a);
     lcd_gps_xp(wei_x,wei_y+1,weiB_c);
     Delay_100xuS(5000);
     lcd_gps_xp(wei_x,wei_y-1,weiB_b);
     lcd_gps_xp(wei_x,wei_y+1,weiB_b);
     lcd_gps_xp(wei_x,wei_y,weiB_a);
     Delay_100xuS(5000);

  }
     lcd_gps_xp(wei_x,wei_y-1,weiB_c);
     lcd_gps_xp(wei_x,wei_y+1,weiB_c);
     lcd_gps_xp(wei_x,wei_y,weiB_c);
     Delay_100xuS(5000);
}
//------------------------------------------------------------------

//----------------------------gps串口
void serial_int()
{
    PCON |= 0x00;
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
    PCON |= 0x00;       //SMOD=1;
    TH1   = 0xFD;       //Baud:9600  fosc=11.0592MHz
    TR1   = 1;          // timer 1 run
    PCON |= 0x00;
}


//串口接收中断函数
void serial()
{
    uchar ch,weit_count,gps_count;
    uchar p_count=0;
    bit weit_flag=0,gps_flag1=0,gps_flag2=0,gps_flag3=0;
    while(1)
    {
        while(RI == 0);
        RI =0;
        ch=SBUF;
        //如果时帧头就处理一下 找GPGGA
        if(ch=='$')
        {
              for(p_count=0;p_count<5;p_count++)
              {
                        while(RI == 0);
                        RI=0;
                        gps_zhen[p_count]=SBUF;
              }
              p_count=0;
              if(strcmp(gps_zhen,"GPRMC")==0)      //找到设标记
              {
                         weit_flag=1;
                         weit_count=0;
                         while(RI == 0);
                         RI =0;
                         continue;
              }
       }
       //读时钟数据,时间暂时不用
       if(weit_flag)
       {
              if(weit_count<8)
              {
                         time[weit_count]=ch;
              }
              weit_count++;
              if(weit_count==12)
              {
                         weit_count=0;
                         weit_flag=0;
                         gps_flag1=1;
                         jinDu[0]=' ';
                         gps_count=1;
              }
        }
        //接收GPS_经纬度数据
        else if(gps_flag1)
        {
              jinDu[gps_count]=ch;
              gps_count++;
              //经度读到N为止
              if(ch=='N')
              {
                         while(RI == 0);
                         RI =0;
                         gps_flag1=0;
                         gps_flag2=1;
                         gps_count=0;
              }
        }
        else if(gps_flag2)
        {
              weiDu[gps_count]=ch;
              gps_count++;
               //纬度读到E为止
              if(ch=='E')
              {
                        ch=0;
                        while(ch<3)
                        {
                            while(RI == 0);
                            if(SBUF==',') ch++;
                            RI =0;
                        }
                        gps_flag2=0;
                        gps_flag3=1;
                        gps_count=0;
              }
        }
        else if(gps_flag3)
        {
              date[gps_count]=ch;
              gps_count++;
              if(ch==',')
              {
                       gps_count=0;
                       gps_flag3=0;
                       return;
              }
        }
    }
}
//调整时间
void tiaoz()
{
   uchar temp_time;
   time[7]=time[5];
   time[6]=time[4];
   time[5]=':';
   time[4]=time[3];
   time[3]=time[2];
   time[2]=':';
   temp_time=((time[0]-'0')*10+time[1]-'0'+8)%24;
   time[1]=temp_time%10+'0';
   time[0]=temp_time/10+'0';
   //日
   date[9]=date[1];
   date[8]=date[0];
   date[7]='-';
   //暂存年
   date[0]=date[4];
   date[1]=date[5];
   //月
   date[6]=date[3];
   date[5]=date[2];
   date[4]='-';
   //年
   date[3]=date[1];
   date[2]=date[0];
   date[1]='0';
   date[0]='2';

}
//显示数据 日期时间经度纬度
void xssj()
{
        tiaoz();
        LCD12864_string(1,1,"日期");
        LCD12864_string(1,2,"时间");
        LCD12864_string(1,3,"经度");
        LCD12864_string(1,4,"纬度");

        LCD12864_string(3,1,date);
        LCD12864_string(3,2,time);
        LCD12864_string(3,3,jinDu);
        LCD12864_string(3,4,weiDu);
}
//--------------------------------------------------------------------

void du24c02()
{
    uchar inum;
    read_iic_data(gps_t,0,1);
    read_iic_data(&gps_t[0],inum*8,24);
    zhand_num=gps_t[0];
}


void baozhan(uchar i)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -