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

📄 adsbin.c

📁 ADS-B接收机DIY全套资料
💻 C
📖 第 1 页 / 共 3 页
字号:
	ANDLW	0x01	
	BNZ		BIT81_ok	
	GOTO	Error_Data	
BIT81_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT82_ok	
	GOTO	Error_Data	
BIT82_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT83_ok	
	GOTO	Error_Data	
BIT83_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT84_ok	
	GOTO	Error_Data	
BIT84_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT85_ok	
	GOTO	Error_Data	
BIT85_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT86_ok	
	GOTO	Error_Data	
BIT86_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT87_ok	
	GOTO	Error_Data	
BIT87_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ		BIT88_ok	
	GOTO	Error_Data	
BIT88_ok:
	NOP	

//byte 11	
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT89_ok	
	GOTO	Error_Data	
BIT89_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT90_ok	
	GOTO	Error_Data	
BIT90_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT91_ok	
	GOTO	Error_Data	
BIT91_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT92_ok	
	GOTO	Error_Data	
BIT92_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT93_ok	
	GOTO	Error_Data	
BIT93_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT94_ok	
	GOTO	Error_Data	
BIT94_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT95_ok	
	GOTO	Error_Data	
BIT95_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ		BIT96_ok	
	GOTO	Error_Data	
BIT96_ok:
	NOP		

//byte 12
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT97_ok	
	GOTO	Error_Data	
BIT97_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT98_ok	
	GOTO	Error_Data	
BIT98_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT99_ok	
	GOTO	Error_Data	
BIT99_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT100_ok	
	GOTO	Error_Data	
BIT100_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT101_ok	
	GOTO	Error_Data	
BIT101_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT102_ok	
	GOTO	Error_Data	
BIT102_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT103_ok	
	GOTO	Error_Data	
BIT103_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ		BIT104_ok	
	GOTO	Error_Data	
BIT104_ok:
	NOP	

//byte 13	
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT105_ok	
	GOTO	Error_Data	
BIT105_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT106_ok	
	GOTO	Error_Data	
BIT106_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT107_ok	
	GOTO	Error_Data	
BIT107_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT108_ok	
	GOTO	Error_Data	
BIT108_ok:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT109_ok	
	GOTO	Error_Data	
BIT109_ok:
	NOP		

	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT110_ok	
	GOTO	Error_Data	
BIT110_ok:
	NOP		

	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT111_ok	
	GOTO	Error_Data	
BIT111_ok:
	NOP	
	
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ		BIT112_ok	
	GOTO	Error_Data	
//alles fehlerfrei empfangen
BIT112_ok:
	NOP	
	
OK_Data:
	BCF		PORTC, 1, A
	BSF		PORTC, 2, A				// komplettes Frame empfangen
	BSF		INTCON, GIEH, A
	MOVLW	0						// false , korrekter Empfang
	RETURN	0
	_endasm
}	// adsb_in



/***DF***************************************************************/


//ermittelt Formatnummer der Daten in adsb[]
byte adsb_DF(void)
{
	byte DF;
	DF = adsb[0];
	DF = DF >> 3;
	return DF;
}



/***CRC**************************************************************/

/****
DF0 (56 bit)  	00000=0L  	Short Air to Air ACAS  								CRC32 xor ACID
DF4 (56 bit) 	00100=2L 	Surveillance (roll call) Altitude 					CRC32 xor ACID
DF5 (56 bit) 	00101=2H 	Surveillance (roll call) IDENT Reply 				CRC32 xor ACID
DF11 (56 bit) 	01011=5H 	Mode S Only All-Call Reply (Acq. Squitter if II=0) 	CRC32 xor IRID or 000000
DF16 (112 bit) 	10000=8L 	Long Air to Air ACAS 	
DF17 (112 bit) 	10001=8H 	ADS-B Extended Squitter 							CRC88 xor 000000
DF18 (112 bit) 	10001=9LH 	TIS-B 												CRC88 xor 000000
DF19 (112 bit) 	10011=9H 	ADS-M Military Extended Squitter 					CRC88 xor 000000
DF20 (112 bit) 	10100=AL 	Comm B Altitude Reply 								CRC88 xor ACID
DF21 (112 bit) 	10101=AH 	Comm. B IDENT Reply 								CRC88 xor ACID
DF22 			10110=BL 	Military use only 	
DF24 			11000=CL 	Comm. D Extended Length Message (ELM) 	
******/


/***
DF11:	DF(5) - CA(3) - AA(24) - PI(24)
DF17:	DF(5) - CA(3) - AA(24) - ME(56) - PI(24)	extended squitter S.72  3-52
	Airborn position squitter   0.4 ... 0.6 sec
	Surface position squitter   0.4 ... 0.6 sec oder 4.8 ... 5.2 sec
	Identification   squitter   4.8 ... 5.2 aber wenn surface-low dann 9.8 ... 10.2 sec
	Airborne velocity squitter  0.4 ... 0.6 sec

***/


/**
Beispieldaten:
*8D484395990052B2E80B027D687F;		DF=17 1000 1___ / CA=5 _101 / AA=484395 / ME=990052B2E80B02 / PI=7D687F 
*8D3C65039990FB9E286404A0043E;
*8D4BAA499945161668800268C26E;
*8D3C662B903D006914A84A707D6A;
*A028023C2010C231595820AA9001;		DF20 1010 0000
**/


// stimme die CRC ?
// ok     -> 1
// falsch -> 0
char adsb_CRC_OK(void)
{
	adsb_CRC();
	if (adsb_DF() < 16)
	{
		if ( (CRC.byte2 == adsb[4]) && (CRC.byte1 == adsb[5]) && (CRC.byte0 == adsb[6]) ) return 1;
	}
	else
	{
		if ( (CRC.byte2 == adsb[11]) && (CRC.byte1 == adsb[12]) && (CRC.byte0 == adsb[13]) ) return 1;
	}
	return 0;
}

//ermittelt CRC der Daten in adsb[]
void adsb_CRC(void)
{
	if (adsb_DF() < 16) adsb_CRC_56();	// CRC32
	else 				adsb_CRC_112();	// CRC88
}


// input 11 Byte = 88 Bit Daten
// output 3 Byte = 24 Bit Daten
void adsb_CRC_112(void)
{
	DWORD	poly;	//32 bit
	char	i;
	DWORD	data, data1, data2;

	//poly = 0xFFFA0480;
	poly.byte3 = 0xFF;
	poly.byte2 = 0xFA;
	poly.byte1 = 0x04;
	poly.byte0 = 0x80;

	data.byte3 = adsb[0];
	data.byte2 = adsb[1];
	data.byte1 = adsb[2];
	data.byte0 = adsb[3];

	data1.byte3 = adsb[4];
	data1.byte2 = adsb[5];
	data1.byte1 = adsb[6];
	data1.byte0 = adsb[7];

	data2.byte3 = adsb[8];
	data2.byte2 = adsb[9];
	data2.byte1 = adsb[10];
	data2.byte0 = 0;

	for (i=1; i<89; i++)
	{
		if (data.byte3 & 0x80)  data._dword  ^= poly._dword;	// xor
		data._dword <<= 1;
		if (data1.byte3 & 0x80) data._dword  |= 1;		// or
		data1._dword <<= 1;
		if (data2.byte3 & 0x80) data1._dword |= 1;		// or
		data2._dword <<= 1;
	}
	CRC.byte2 = data.byte3;
	CRC.byte1 = data.byte2;
	CRC.byte0 = data.byte1;
}



// input  4 Byte = 32 Bit Daten
// output 3 Byte = 24 Bit Daten
void adsb_CRC_56(void)
{
	DWORD	poly;	//32 bit
	char	i;
	DWORD	data;

	//poly = 0xFFFA0480;
	poly.byte3 = 0xFF;
	poly.byte2 = 0xFA;
	poly.byte1 = 0x04;
	poly.byte0 = 0x80;

	data.byte3 = adsb[0];
	data.byte2 = adsb[1];
	data.byte1 = adsb[2];
	data.byte0 = adsb[3];

	for (i=1; i<33; i++)
	{
		if (data.byte3 & 0x80) data._dword ^= poly._dword;		// xor
		data._dword <<= 1;
	}
	CRC.byte2 = data.byte3;
	CRC.byte1 = data.byte2;
	CRC.byte0 = data.byte1;
}


// schreibt in den usb-Sendepuffer einen String entsprechend adsb[]
void adsb_StringOut(void)
{
	char	k;
	send_RAW = 1;
	k = 0;
	
	dataPacket._byte[k++] = '*';
    dataPacket._byte[k++] = hex2asc_H(adsb[0]);
    dataPacket._byte[k++] = hex2asc_L(adsb[0]);
    dataPacket._byte[k++] = hex2asc_H(adsb[1]);
    dataPacket._byte[k++] = hex2asc_L(adsb[1]);
    dataPacket._byte[k++] = hex2asc_H(adsb[2]);
    dataPacket._byte[k++] = hex2asc_L(adsb[2]);
    dataPacket._byte[k++] = hex2asc_H(adsb[3]);
    dataPacket._byte[k++] = hex2asc_L(adsb[3]);
    dataPacket._byte[k++] = hex2asc_H(adsb[4]);
    dataPacket._byte[k++] = hex2asc_L(adsb[4]);
    dataPacket._byte[k++] = hex2asc_H(adsb[5]);
    dataPacket._byte[k++] = hex2asc_L(adsb[5]);
    dataPacket._byte[k++] = hex2asc_H(adsb[6]);
    dataPacket._byte[k++] = hex2asc_L(adsb[6]);

	if (adsb_DF() >= 16)
	{
    	dataPacket._byte[k++] = hex2asc_H(adsb[7]);
    	dataPacket._byte[k++] = hex2asc_L(adsb[7]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[8]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[8]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[9]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[9]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[10]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[10]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[11]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[11]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[12]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[12]);
   		dataPacket._byte[k++] = hex2asc_H(adsb[13]);
   		dataPacket._byte[k++] = hex2asc_L(adsb[13]);
	}

	dataPacket._byte[k++] = ';';

	// auf Wunsch die Zeit anhaengen wenn switch1 geschlossen ist oder ein mode>15
	if (!Switch1 | TimeCode)
	{
		if (Time1.b7 != Time2.b0) 	// wurde MSB von TMR0H veraendert?
		{
			Time2._byte++;
			if (!Time2._byte) Time3._byte++;
		}

	    dataPacket._byte[k++] = '#';
		dataPacket._byte[k++] = hex2asc_H(Time3._byte); 
		dataPacket._byte[k++] = hex2asc_L(Time3._byte); 
		dataPacket._byte[k++] = hex2asc_H(Time2._byte); 
		dataPacket._byte[k++] = hex2asc_L(Time2._byte); 
		dataPacket._byte[k++] = hex2asc_H(Time1._byte); 
		dataPacket._byte[k++] = hex2asc_L(Time1._byte); 
		dataPacket._byte[k++] = hex2asc_H(Time0._byte); 
		dataPacket._byte[k++] = hex2asc_L(Time0._byte); 
		dataPacket._byte[k++] = ';';
	}

   	dataPacket._byte[k++] = 0x0A;
  	dataPacket._byte[k++] = 0x0D;
	counter2 = k;
}



byte hex2asc_H(byte B)
{
	return (hex2asc_L(B>>4));
}


byte hex2asc_L(byte B)
{
	B &= 0x0F;
	if (B<10) 	return (B+'0');
	else 		return (B-10+'A');
}

/** EOF adsbin.c ***************************************************************/

⌨️ 快捷键说明

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