📄 gps_ok.c
字号:
#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 + -