main.c

来自「此程序实现无线信标定位」· C语言 代码 · 共 220 行

C
220
字号
#include<AT89X51.H>
//#include<absacc.h>
//#include<string.h>
#include "gps.h"

//unsigned char data buf[30] _at_ 0x30;	// 必须在这里定义才不会出错,估计是和作用域有关,不定义在这里,默认从R0开始
										//而R0在运算是会时刻改变,导致改变数据
#define	KEY	P2_3
#define	SW	P2_4
#define	PWD	P3_5


unsigned char code start_menu1[]="Enter A:start";
unsigned char code start_menu2[]="NJU_DEE,by Z.QY";
unsigned char code search[]="searching...";
unsigned char code local[]="本地: ";
unsigned char code beacon[]="信标: ";
unsigned char code site[]="坐标";
unsigned char data local_lat[11]="2446.5211N";
unsigned char data local_lon[12]="12100.1536E";
unsigned char data beacon_lat[8];//="6.5212N";//="(244)6.5211N";
unsigned char data beacon_lon[8];//="0.1535E";//="(1210)0.1536E";
unsigned char data recieve[15];//="6.5211N0.1536E";//="(244)6.5211N(1210)0.1536E";

unsigned char code line_code[16][6] =
{	
	0xF0,0x00,0x00,0x00,0x00,0x00,
	0x1E,0x00,0x00,0x00,0x00,0x00,
	0x03,0xE0,0x00,0x00,0x00,0x00,
	0x00,0x78,0x00,0x00,0x00,0x00,
	0x00,0x0F,0x00,0x00,0x00,0x00,
	0x00,0x01,0xE0,0x00,0x00,0x00,
	0x00,0x00,0x3C,0x00,0x00,0x00,
	0x00,0x00,0x07,0x80,0x00,0x00,
	0x00,0x00,0x00,0xF0,0x00,0x00,
	0x00,0x00,0x00,0x1E,0x00,0x00,
	0x00,0x00,0x00,0x03,0xC0,0x00,
	0x00,0x00,0x00,0x00,0x78,0x00,
	0x00,0x00,0x00,0x00,0x0F,0x00,
	0x00,0x00,0x00,0x00,0x01,0xE0,
	0x00,0x00,0x00,0x00,0x00,0x3C,
	0x00,0x00,0x00,0x00,0x00,0x0F,
};

void main()
{
	unsigned char p = 0,time = 0,i,head,addr = 0,j = 0;
	bit store_en = 1;


//	sp=0x06  ;//编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,
			  //自己指定会使变量之间产生冲突,在这里,如果定位sp为0x60,latitude[]数组的后几位就会跟着程序改变
	lcd_ini(); 
	
	display(0x80,start_menu1);
	display(0x90,start_menu2);
	display(0x98,search);
	keypress();
	cls_cht();

	while(j < 100)
	{
		SW = 0;		//数据选择期控制端,0送本地坐标至RXD,1送信标坐标至RXD

//		recv_data();
		display(0x80,local);
		display(0x83,local_lat);
		display(0x90,local_lon);

		SW = 1;

		decode();
		display(0x88,beacon);
		send_i(0x8B);
		for(head = 0; head < 10; head ++)
		{
			if(head < 3)
			send_d(local_lat[head]);
			else
			send_d(beacon_lat[head - 3]);
		}
		send_i(0x98);
		for(head = 0; head < 11; head ++)
		{
			if(head < 4)
			send_d(local_lon[head]);
			else
			send_d(beacon_lon[head - 4]);
		}
		keypress();
// store 
		for(i = 0; i < 15; i ++)
		{
			if(recieve[i] == '?')
			{
				store_en = 0;
				break;
			}
		}
		if(store_en)
		{
			
			p = store(recieve,time);
			time = p;
			cls_cht();
		
			draw();
			keypress();
			cls_grap();
			cls_cht();
			j ++;
		}
	}
}

void keypress(void)
{
	while(KEY == 1) 				// control searching...
	{}
	while(KEY == 0)
	KEY = 1;
}

void display(unsigned char address,unsigned char *string)
{	
	unsigned char data i = 0;
	send_i(address);
	do
	{
		send_d(*string);
		string ++;
	}
	while(*string != '\0');						
}

void plot(unsigned char data address,unsigned int ascII)
{	
	send_i(address);
	send_d(ascII / 0x100);
	send_d(ascII % 0x100);
}

/*
unsigned char data local_lat[11]="2446.5211N";
unsigned char data local_lon[12]="12100.1536E";
unsigned char data beacon_lat[8]="6.5212N";//="(244)6.5211N";
unsigned char data beacon_lon[8]="0.1537E";//="(1210)0.1536E";
*/


void draw(void)
{
	unsigned char pos,i;
	bit lat_site,lon_site;
	for(i = 0;i < 8;i ++)
	{
		if(beacon_lat[i] > local_lat[i + 3])
		{
			lat_site = 1;
			break;
		}
		else if(beacon_lat[i] < local_lat[i + 3])
		{
			lat_site = 0;
			break;
		}
	}
	for(i = 0;i < 8;i ++)
	{
		if(beacon_lon[i] > local_lon[i + 4])
		{
			lon_site = 1;
			break;
		}
		else if(beacon_lon[i] < local_lon[i + 4])
		{
			lon_site = 0;
			break;
		}
	}


	if(lat_site == 1 && lon_site == 1)
	pos = 1;
	else if(lat_site == 1 && lon_site == 0)
	pos = 2;
	else if(lat_site == 0 && lon_site == 0)
	pos = 3;
	else
	pos = 4;
	switch (pos)
	{
		case 1: board_show(1,0x87,0x98,0x86,0x99,0x82,0x9A);	break;
		case 2: board_show(0,0x80,0x9F,0x81,0x9E,0x82,0x9A);	break;
		case 3: board_show(1,0x87,0x98,0x86,0x99,0x9A,0x82);	break;
		case 4: board_show(0,0x80,0x9F,0x81,0x9E,0x9A,0x82);	break;
		default: break;
	}
}

void board_show(bit line_style,unsigned char b_target,unsigned char l_target,unsigned char r_arrow,
				unsigned char l_arrow,unsigned char b_ch,unsigned char l_ch)
{
	line(line_style);
	plot(b_target,0xA9EF);			// beacon '+'
	plot(l_target,0xA9EF);			// local '+'
	plot(r_arrow,0xA1FA);			// right arrow
	plot(l_arrow,0xA1FB);			// left arrow
	display(b_ch,beacon);		
	display(l_ch,local);
	display(0x84,site);
	display(0x9C,site);
}

void cls_cht(void)
{		
	send_i(0x30);
	send_i(0x01);
}

⌨️ 快捷键说明

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