📄 try.c
字号:
/*************************************
GPS解码12864显示程序
作者:HEKUN
***************************************/
#include <AT89X51.H>
#include <stdio.h>
#include "LCD12864_c51.h"
char code TIME_AREA= 8; //时区
//GPS数据存储数组
unsigned char JD[10]; //经度
unsigned char JD_a; //经度方向
unsigned char WD[9]; //纬度
unsigned char WD_a; //纬度方向
unsigned char time[6]; //时间
unsigned char speed[4];
unsigned char date[6];
//串口中断需要的变量
unsigned char seg_count; //逗号计数器
//unsigned char dot_count; //小数点计数器
unsigned char byte_count; //位数计数器
unsigned char cmd_number; //命令类型
unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full; //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[5]; //命令类型存储数组
//显示需要的变量
unsigned int dsp_count; //刷新次数计数器
unsigned char time_count;
void sys_init(void);
main()
{
unsigned char i;
// char Bhour=0;
sys_init();
while(1)
{
if(buf_full==0) //无GPS信号时
{
dsp_count++;
if(dsp_count>=65000){
Init_Lcd12864(); //清屏
ResetCursor(0,2);
printf("No GPS connect..");
while(buf_full==0);
ClearAS();
dsp_count=0;
}
}
else if(buf_full)
{ //有GPS信号时 //RMC语句
ResetCursor(0,0);
printf("JD:");
ResetCursor(3,0);
printf("%c",JD_a);
//显示经度
for(i=0;i<10;i++){
ResetCursor(i+4,0);
printf("%c",JD[i]);
}
ResetCursor(0,1);
printf("WD:");
ResetCursor(3,1);
printf("%c",WD_a);
for(i=0;i<9;i++) //显示纬度
{
ResetCursor(i+4,1);
printf("%c",WD[i]);
}
ResetCursor(0,2);
printf("BJT:");
// ResetCursor(4,2);
// printf("%c",date[4]);
// ResetCursor(5,2);
// printf("%c",date[5]);
// ResetCursor(6,2);
// printf("%c",date[2]);
// ResetCursor(7,2);
// printf("%c",date[3]);
// ResetCursor(8,2);
// printf("%c",date[0]);
// ResetCursor(9,2);
// printf("%c",date[1]);
// time[0]=((time[0]-'0')*10+(time[1]-'0'))/10+'0';
// time[1]=((time[0]-'0')*10+(time[1]-'0'))%10+'0';
for(i=0;i<6;i++) //显示Time
{
ResetCursor(i+10,2);
printf("%c",time[i]);
}
// ResetCursor(0,3);
//// printf("Speed:");
// for(i=0;i<4;i++) //显示speed
// {
// ResetCursor(i+6,3);
/// printf("%c",speed[i]);
// }
// ResetCursor(10,3);
// printf("knots");
dsp_count=0;
buf_full&=~0x01;
}
}
}
//系统初始化
void sys_init()
{
// unsigned char i;
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD = 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1=TL1=0xfa; /* TH1: reload value for 4800 baud @ 11.059MHz */
TR1 = 1; /* TR1: timer 1 run */
Init_Lcd12864(); //初始化LCD
ResetCursor(0,1);
printf("GPS Monitor V1.2");
ClearAS();
IE=0x90; //开总中断、串口中断
}
//串口接收中断
void uart(void) interrupt 4
{
unsigned char tmp;
if(RI){
tmp=SBUF;
switch(tmp)
{
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
case '*':
mode=0;
buf_full=1;
break;
default:
if(mode==1){
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4){ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G'){
if(cmd[1]=='P'){
if(cmd[2]=='R'){
if(cmd[3]=='M'){
if(cmd[4]=='C'){
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if((mode==2)&cmd_number){
//接收数据处理 GPGGA,132920.487,,n,,w,0,00,,,M,0.0,M,,0000*56
//$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10
//$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
switch(seg_count){
case 1:
if(byte_count<6){ //时间处理
time[byte_count]=tmp;
}
break;
case 3: //纬度处理
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;
}
break;
case 6: //经度方向处理
if(byte_count<1){
JD_a=tmp;
}
break;
case 7: //speed
if(byte_count<4){
speed[byte_count]=tmp;
}
break;
case 9: //date
if(byte_count<6){
date[byte_count]=tmp;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
}
RI=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -