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

📄 main.c

📁 此程序实现无线信标定位
💻 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 + -