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

📄 decode.c

📁 此程序实现无线信标定位
💻 C
字号:
#include<AT89X51.H>

void sound(unsigned char n);
void port_init(void);

extern unsigned char data beacon_lat[8];//11 ="(244)6.5211N";
extern unsigned char data beacon_lon[8];//12 ="(1210)0.1536E";
extern unsigned char data recieve[15];//21 ="(244)6.5211N(1210)0.1536E";

void decode(void)
{	
	unsigned char data DATB;
	unsigned char data k = 0,i;
	unsigned char column1 = 0xE8;	//	1110 1000
	unsigned char column2 = 0xD4;	//	1101 0100
	unsigned char column3 = 0xB2;	//	1011 0010	监督矩阵
	unsigned char bg,s,s1,s2,s3;
	bit ss1,ss2,ss3,chs;
	port_init();
//	shake hand signal :  8 bits 5A signal for 3 times
	while(1)
	{
		RI = 0;
		while(!RI)
		{}
		if(SBUF == 0x5A)
			k ++;
		else
			k = 0;
		if(k == 3)
		break;
	}

	
//	start
	
	for(k = 0;k < 15;k ++)
		{	
			RI = 0;
			while(!RI)
			{}
			recieve[k] = SBUF;
		}

	for(k = 0;k < 15;k ++)
	{
		DATB = recieve[k];
		ss1 = 0;
		ss2 = 0;
		ss3 = 0;
		s1 = DATB & column1;
		s2 = DATB & column2;
		s3 = DATB & column3;		//	DATB与监督矩阵相乘
		for(i = 0;i < 8;i ++)
		{
			ss1 = ss1 ^ (s1 >> i) % 2;
			ss2 = ss2 ^ (s2 >> i) % 2;
			ss3 = ss3 ^ (s3 >> i) % 2;		//	从低到高提取上述结果各位异或,完成逻辑矩阵乘法求和的部分
		}
		s1 = ss1;s2 = ss2;s3 = ss3;
		s = s1 * 100 + s2 * 10 + s3;		//	S为校正子
		switch(s)
		{
			case   0:	break;				//	correct
			case   1:	bg = DATB & 2;		bg = ~( bg >> 1 | 254 );		DATB = (DATB & (255 - 2)) + bg * 2;		break;
		//	第二位错,bg提取出第二位,		右移一位,其它位置1,然后取反,	DATB去除第二位影响后与bg相加,最低位为奇偶校验位
			case  10:	bg = DATB & 4;		bg = ~( bg >> 2 | 254 );		DATB = (DATB & (255 - 4)) + bg * 4;		break;
			case 100:	bg = DATB & 8;		bg = ~( bg >> 3 | 254 );		DATB = (DATB & (255 - 8)) + bg * 8;		break;
			case  11:	bg = DATB & 16;		bg = ~( bg >> 4 | 254 );		DATB = (DATB & (255 - 16)) + bg * 16;	break;
			case 101:	bg = DATB & 32;		bg = ~( bg >> 5 | 254 );		DATB = (DATB & (255 - 32)) + bg * 32;	break;
			case 110:	bg = DATB & 64;		bg = ~( bg >> 6 | 254 );		DATB = (DATB & (255 - 64)) + bg * 64;	break;
			case 111:	bg = DATB & 128;	bg = ~( bg >> 7 | 254 );		DATB = (DATB & (255 - 128)) + bg * 128;	break;
			default:	break;				// wrong coded	
		}
		
		chs = 0;
		for(i = 0;i < 8;i ++)
		chs = chs ^ (DATB >> i) % 2;
		

		if(chs != 0)
		{
			DATB = '?';			//	wrong bit
		}
		switch(DATB)
		{
			case 0xD4:	DATB = '0';		break;
			case 0xA5:	DATB = '1';		break;
			case 0x2B:	DATB = '2';		break;
			case 0x3C:	DATB = '3';		break;
			case 0x4D:	DATB = '4';		break;
			case 0xB2:	DATB = '5';		break;
			case 0x66:	DATB = '6';		break;
			case 0x71:	DATB = '7';		break;
			case 0x8E:	DATB = '8';		break;
			case 0x99:	DATB = '9';		break;
			case 0x17:	DATB = '.';		break;
			case 0xE8:	DATB = 'N';		break;
			case 0xC3:	DATB = 'E';		break;
			case 0x00:	DATB = 'W';		break;
			case 0xFF:	DATB = 'S';		break;
			default:	DATB = '?';		break;
		}
		if(k < 7)	//	k = 0   6
		{
			beacon_lat[k] = DATB;
		}
		else		//	k = 7	14
		{
			beacon_lon[k - 7] = DATB;
		}
		recieve[k] = DATB;
	}
	sound(20);			//	1s 1KHz accquire signal from P2_5
}

void sound(unsigned char n)
{
	unsigned char i,j,k;
	for(i = 0;i < n;i ++)
	{
		for(j = 0;j < 100;j ++)
		{
			P2_5 = ~P2_5;
			for(k = 0;k < 100;k ++)
			{}
		}
	}
}


⌨️ 快捷键说明

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