📄 main.c
字号:
#include<REG51.H>
#include<stdio.h>
sbit P3_3 = 0xB3;
void delay(unsigned char n);
/*接收语句: $GPRMC,062321,V,3537.8333,N,13944.6667,E,000.0,000.0,030222,,*0C */
unsigned char data sentence[64]="GPRMC,062321,V,1234.5678,N,87654.3210,E,000.0,000.0,030222,,*0C";
unsigned char data latitude[11];//="(244)6.5211N";
unsigned char data longitude[12];//="(1210)0.1536E";
unsigned char acs2hex(unsigned char *string)
{
unsigned char a1,a2,rec_chs;
if(*string < 0x30 || *string > 0x46 || *(string + 1) < 0x30 || *(string + 1) > 0x46)
{
rec_chs = 0xff;
goto next;
}
if(*string < 0x40)
a1 = *string - 0x30;
else
a1 = *string - 0x37;
string ++;
if(*string < 0x40)
a2 = *string - 0x30;
else
a2 = *string - 0x37;
rec_chs = (a1 << 4) + a2;
next:
return rec_chs;
}
bit checksum(unsigned char *string)
{
unsigned char rec_chs,chs = 0,rchs[2];
bit ans;
for(;*string != '*';string ++)
{
chs = chs ^ *string;
}
rchs[0] = *(string + 1);
rchs[1] = *(string + 2);
rec_chs = acs2hex(rchs);
if(chs != rec_chs || rec_chs == 0xff)
ans = 0;
else
ans = 1;
return ans;
}
void port_init(void)
{
TMOD=0x20;
PCON=0; // SMOD=0
SCON=0x50; // MODE 1
TH1=0xCC; //600baud 12MHz oscillator frequence,SMOD=0
TL1=0xCC;
TR1=1; //Start timer 1
}
void main()
{
unsigned char dflag,send_code;
unsigned int mod;
unsigned char i = 0,j = 0,k = 0;
start:
port_init();
/* dflag = 0;
// PWD = 0;
/* while(1)
{
while(!RI)
{}
if(SBUF == 'A')
break;
RI = 0;
}
RI = 0;
while(1)
{
while(!RI)
{}
if(SBUF == '$')
break;
RI = 0;
}
RI = 0;
// 接收数据 $GPRMC,062321,V,3537.8333,N,13944.6667,E,000.0,000.0,030222,,*0C
for(i = 0;i < 63;i ++)
{
while(!RI)
{}
sentence[i] = SBUF;
RI = 0;
}
REN = 0; // forbid recieve
// PWD = 1;
// if(~checksum(sentence))
// goto start; // checksum wrong ! restart
*/
for(i = 0;dflag < 7;i ++)
{
if(sentence[i] == ',')
dflag ++;
if(dflag == 3 && sentence[i] != ',')
{
latitude[k] = sentence[i];
k ++;
}
if(dflag == 4 && sentence[i] != ',')
{
latitude[k] = sentence[i];
latitude[k + 1] = '\0'; //以字符串的方式结束
}
if(dflag == 5 && sentence[i] != ',')
{
longitude[j] = sentence[i];
j ++;
}
if(dflag == 6 && sentence[i] != ',')
{
longitude[j] = sentence[i];
longitude[j+1] = '\0'; //以字符串的方式结束
}
} // latitude[11]: (244)6.5211N longitude[12]: (1210)0.1536E
// TR1 = 1; //握手信号
for(i = 0;i < 3;i ++)
{
P3_3 = 1;
SBUF = 0x5A;
while(!TI)
{}
TI = 0;
P3_3 = 0;
delay(20);
}
// TR1 = 0;
for(i = 0;i < 14;i ++)
{
if(i < 7)
send_code = latitude[i + 3];
else
send_code = longitude[i - 3];
switch(send_code)
{
case '0': mod = 0xD4;break; // 0b11010100 last bit odd check
case '1': mod = 0xA5;break; // 0b10100101
case '2': mod = 0x2B;break; // 0b00101011
case '3': mod = 0x3C;break; // 0b00111100
case '4': mod = 0x4D;break; // 0b01001101
case '5': mod = 0xB2;break; // 0b10110010
case '6': mod = 0x66;break; // 0b01100110
case '7': mod = 0x71;break; // 0b01110001
case '8': mod = 0x8E;break; // 0b10001110
case '9': mod = 0x99;break; // 0b10011001
case '.': mod = 0x17;break; // 0b00010111
case 'N': mod = 0xE8;break; // 0b11101000
case 'E': mod = 0xC3;break; // 0b11000011
case 'W': mod = 0x00;break; // 0b00000000
case 'S': mod = 0xFF;break; // 0b11111111
default: break; // wrong coded , noted
}
// TR1 = 1;
P3_3 = 1;
SBUF = mod;
while(!TI)
{}
TI = 0;
P3_3 = 0;
delay(20);
}
// TR1 = 0;
goto start;
}
void delay(unsigned char n)
// delay 0.5 * n ms
{
unsigned char i,j;
for(i = 0;i < n;i ++)
{
for(j = 0;j < 100;j ++)
{}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -