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

📄 adsbin.c

📁 ADS-B接收机DIY全套资料
💻 C
📖 第 1 页 / 共 3 页
字号:
	BNZ	M04ADC	
	GOTO	Error_Data	
M04ADC:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04AF6	
	GOTO	Error_Data	
M04AF6:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04B10	
	GOTO	Error_Data	
M04B10:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04B2A	
	GOTO	Error_Data	
M04B2A:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04B44	
	GOTO	Error_Data	
M04B44:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04B5E	
	GOTO	Error_Data	
M04B5E:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA10, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA10, W, 1
	ANDLW	0x01	
	BNZ	M04B78	
	GOTO	Error_Data	
M04B78:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04B92	
	GOTO	Error_Data	
M04B92:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04BAC	
	GOTO	Error_Data	
M04BAC:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04BC6	
	GOTO	Error_Data	
M04BC6:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04BE0	
	GOTO	Error_Data	
M04BE0:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04BFA	
	GOTO	Error_Data	
M04BFA:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04C14	
	GOTO	Error_Data	
M04C14:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04C2E	
	GOTO	Error_Data	
M04C2E:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA11, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA11, W, 1
	ANDLW	0x01	
	BNZ	M04C48	
	GOTO	Error_Data	
M04C48:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04C62	
	GOTO	Error_Data	
M04C62:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04C7C	
	GOTO	Error_Data	
M04C7C:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04C96	
	GOTO	Error_Data	
M04C96:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04CB0	
	GOTO	Error_Data	
M04CB0:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04CCA	
	GOTO	Error_Data	
M04CCA:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04CE4	
	GOTO	Error_Data	
M04CE4:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04CFE	
	GOTO	Error_Data	
M04CFE:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA12, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA12, W, 1
	ANDLW	0x01	
	BNZ	M04D18	
	GOTO	Error_Data	
M04D18:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04D32	
	GOTO	Error_Data	
M04D32:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04D4C	
	GOTO	Error_Data	
M04D4C:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04D66	
	GOTO	Error_Data	
M04D66:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04D80	
	GOTO	Error_Data	
M04D80:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04D9A	
	GOTO	Error_Data	
M04D9A:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04DB4	
	GOTO	Error_Data	
M04DB4:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04DCE	
	GOTO	Error_Data	
M04DCE:
	NOP		
	RRCF	PORTC, W, A
	RLCF	AAA13, F, 1
	NOP		
	NOP		
	NOP		
	NOP		
	MOVF	PORTC, W, A
	XORWF	AAA13, W, 1
	ANDLW	0x01	
	BNZ	M04DE8	
	GOTO	Error_Data	
//alles fehlerfrei empfangen
M04DE8:
	NOP		
M04DEA:
	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;		DF17 1000 1101
*8D3C65039990FB9E286404A0043E;
*8D4BAA499945161668800268C26E;
*8D3C662B903D006914A84A707D6A;
*A028023C2010C231595820AA9001;		DF20 1010 0000
**/

//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;
/****
function parity112bit(st:string):string;
const poly:cardinal=FFFA0480;
var i,data,data1,data2:cardinal;
begin
       result:=000000;
       if length(st)<>11 then exit;
       data :=(ord(st[1])shl 24) OR (ord (st[ 2])shl 16) OR (ord (st[ 3])shl 8) or (ord(st[4]));
       data1:=(ord(st[5])shl 24) OR (ord (st[ 6])shl 16) OR (ord (st[ 7])shl 8) or (ord(st[8]));
       data2:=(ord(st[9])shl 24) OR (ord (st[10])shl 16) OR (ord (st[11])shl 8);

       for i:=1 to 88 do
       begin
          if (data and 80000000) <> 0 then data:=data xor poly;
          data:=data shl 1;
          if (data1 and 80000000) <>0 then data:=data or 1;
          data1:=data1 shl 1;
          if (data2 and 80000000) <>0 then data1:=data1 or 1;
          data2:=data2 shl 1;
       end;
       result:=copy(inttohex(data,8),1,6);
end;
*****/
}



// 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;

/***********
function parity56bit(st:string):string;
const poly:cardinal=FFFA0480;
var i,data,data1:cardinal;
begin
       result:=000000;
       if length(st)<>4 then exit;
       data:=(ord(st[1])shl 24) OR (ord (st[2])shl 16) OR (ord (st[3])shl 8) or (ord(st[4]));
       for i:=1 to 32 do
       begin
          if (data and 80000000) <> 0 then data:=data xor poly;
          data:=data shl 1;
       end;
       result:=copy(inttohex(data,8),1,6);
end;
*****/
}


// schreibt in den usb-Sendepuffer einen Strin entsprechend adsb[]
void adsb_StringOut(void)
{
	send_RAW = true;

	dataPacket._byte[0] = '*';
    dataPacket._byte[1] = hex2asc_H(adsb[0]);
    dataPacket._byte[2] = hex2asc_L(adsb[0]);
    dataPacket._byte[3] = hex2asc_H(adsb[1]);
    dataPacket._byte[4] = hex2asc_L(adsb[1]);
    dataPacket._byte[5] = hex2asc_H(adsb[2]);
    dataPacket._byte[6] = hex2asc_L(adsb[2]);
    dataPacket._byte[7] = hex2asc_H(adsb[3]);
    dataPacket._byte[8] = hex2asc_L(adsb[3]);
    dataPacket._byte[9] = hex2asc_H(adsb[4]);
    dataPacket._byte[10] = hex2asc_L(adsb[4]);
    dataPacket._byte[11] = hex2asc_H(adsb[5]);
    dataPacket._byte[12] = hex2asc_L(adsb[5]);
    dataPacket._byte[13] = hex2asc_H(adsb[6]);
    dataPacket._byte[14] = hex2asc_L(adsb[6]);

	if (adsb_DF() < 16)
	{
		dataPacket._byte[15] = ';';
   		dataPacket._byte[16] = 0x0A;
   		dataPacket._byte[17] = 0x0D;
   		counter=18;
	}
	else
	{
    	dataPacket._byte[15] = hex2asc_H(adsb[7]);
    	dataPacket._byte[16] = hex2asc_L(adsb[7]);
   		dataPacket._byte[17] = hex2asc_H(adsb[8]);
   		dataPacket._byte[18] = hex2asc_L(adsb[8]);
   		dataPacket._byte[19] = hex2asc_H(adsb[9]);
   		dataPacket._byte[20] = hex2asc_L(adsb[9]);
   		dataPacket._byte[21] = hex2asc_H(adsb[10]);
   		dataPacket._byte[22] = hex2asc_L(adsb[10]);
   		dataPacket._byte[23] = hex2asc_H(adsb[11]);
   		dataPacket._byte[24] = hex2asc_L(adsb[11]);
   		dataPacket._byte[25] = hex2asc_H(adsb[12]);
   		dataPacket._byte[26] = hex2asc_L(adsb[12]);
   		dataPacket._byte[27] = hex2asc_H(adsb[13]);
   		dataPacket._byte[28] = hex2asc_L(adsb[13]);

   		dataPacket._byte[29] = ';';
   		dataPacket._byte[30] = 0x0A;
   		dataPacket._byte[31] = 0x0D;
   		counter=32;
	}
}



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 + -