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

📄 flexdec.c

📁 该源代码运行于89c51系列单片机上,可从输入FLEX二进制码流中解交织,处理CRC纠错,并最终解码出有效ASCII码数据.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------
flex and pocsag decode program
------------------------------------------------*/
#pragma	large		//default mode:large external ram 64k bytes

#include <intrins.h>
#include <stdio.h>
#include <reg52.h>
#include <math.h>

#define	MAXDATALENGTH	88;	// 	88 codewords 
#define	MAXDECODEBUFF	8;
#define	DATA_PORT	P1;
#define	FRAME_START	P2^0;	//	1: start 0:end
#define HEXC	0x0C;
#define HEX3	0x03;

sbit crc_flag = 0x00;

typedef	struct
{
	unsigned char 	ucBlockUsedflag;// 1: used 		0: unused
	unsigned char 	uiBlockCodeWords;	//how many codewords
	unsigned char 	ucProcotol;	//1:flex 0:pocsag
	unsigned char	ucFrameRate;
//	1:	pocsag	512	+
//	2:	pocsag	512 -
//	3:	pocsag	1200 +
//	4:	pocsag	1200 -
//	5:	pocsag	2400 +
//	6:	pocsag	2400 -
//	7:	flex	1600
//	8:	flex	3200
//	9:	flex	3300
//	10:	flex	6400
	unsigned char	ucFramePhase;
//	POCSAG	:	00H
//	PHASE A	:	0AH
//	PHASE B	:	0BH
//	PHASE C	:	0CH
//	PHASE D	:	0DH
	unsigned char ucCycleNumber;
	unsigned char ucFrameNumber;
	unsigned char ucPortfolio;
	unsigned char ulBlockData[ MAXDATALENGTH ];
}DATABUFF;

DATABUFF xdata	decode_buff[ MAXDECODEBUFF ];

/*------------------------------------------------
external interrupt 0 router
------------------------------------------------*/
void frame_head_int( void )  interrupt 0
{
	if( FRAME_START == 1 )
	{	//frame start	initialization
		bytes_count = 0;
		codeword_count = 0;
		datas_count = 0;
		phase_code_count = 0;
		frame_rate = DATA_PORT;
		if( frame_rate == 7 )
			phase_number = 1;
		else if( frame_rate == 8 || frame_rate == 9 )
			phase_number = 2;
		else if( frame_rate == 10 )
			phase_number = 4;
		else 
			phase_number = 0;	
	}
	else
	{	//frame end intterrupt
		if( frame_rate == 1 || frame_rate == 3 || frame_rate == 5 )
		{	//pocsag frame end	
			decode_buff[ decode_buff_tail ].ucBlockUsedflag = 1;	//	used
			decode_buff[ decode_buff_tail ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail ].ucProcotol = 0;			//pocsag
			decode_buff[ decode_buff_tail ].ucFrameRate = frame_rate;
			decode_buff_tail ++;
			decode_buff_tail %= MAXDECODEBUFF;	//不需初始化,在开始中断来了以后再初始化
		}
		else if( frame_rate == 7 )
		{	//flex 1600bps	
			decode_buff[ decode_buff_tail ].ucBlockUsedflag = 1;	//	used
			decode_buff[ decode_buff_tail ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail ].ucProcotol = 1;			//flex
			decode_buff[ decode_buff_tail ].ucFrameRate = frame_rate;
			decode_buff_tail ++;	//1 buffer
			decode_buff_tail %= MAXDECODEBUFF;
		}
		else if( frame_rate == 8 || frame_rate == 9 )
		{	//flex 3200bps
			decode_buff[ decode_buff_tail ].ucBlockUsedflag = 1;	//	used
			decode_buff[ decode_buff_tail ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail ].ucProcotol = 1;			//flex
			decode_buff[ decode_buff_tail ].ucFrameRate = frame_rate;
			decode_buff[ decode_buff_tail + 1 ].ucBlockUsedflag = 1;//	used
			decode_buff[ decode_buff_tail + 1 ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail + 1 ].ucProcotol = 1;		//flex
			decode_buff[ decode_buff_tail + 1 ].ucFrameRate = frame_rate;
			decode_buff_tail += 2;	//	2 buffer
			decode_buff_tail %= MAXDECODEBUFF;
		}
		else if( frame_rate == 10 )
		{		//flex 6400bps
			decode_buff[ decode_buff_tail ].ucBlockUsedflag = 1;	//	used
			decode_buff[ decode_buff_tail ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail ].ucProcotol = 1;			//flex
			decode_buff[ decode_buff_tail ].ucFrameRate = frame_rate;
			decode_buff[ decode_buff_tail + 1 ].ucBlockUsedflag = 1;//	used
			decode_buff[ decode_buff_tail + 1 ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail + 1 ].ucProcotol = 1;		//flex
			decode_buff[ decode_buff_tail + 1 ].ucFrameRate = frame_rate;
			decode_buff[ decode_buff_tail + 2 ].ucBlockUsedflag = 1;	//	used
			decode_buff[ decode_buff_tail + 2 ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail + 2 ].ucProcotol = 1;			//flex
			decode_buff[ decode_buff_tail + 2 ].ucFrameRate = frame_rate;
			decode_buff[ decode_buff_tail + 3 ].ucBlockUsedflag = 1;//	used
			decode_buff[ decode_buff_tail + 3 ].uiBlockCodeWords = codeword_count;
			decode_buff[ decode_buff_tail + 3 ].ucProcotol = 1;		//flex
			decode_buff[ decode_buff_tail + 3 ].ucFrameRate = frame_rate;
			decode_buff_tail += 4;	//	4 buffer
			decode_buff_tail %= MAXDECODEBUFF;	//取模八
		}
	}
} 

/*------------------------------------------------
external interrupt 1 router
------------------------------------------------*/
void data__recv_int( void )  interrupt 2
{
	unsigned char data i,buff;
	
	buff = DATA_PORT;
	if( bytes_count < 4 )	//receive first 4 bytes
	{						//flex : frame infomation  pocsag : sc 
		bytes_count ++;
		for( i = 8 ; i != 0 ; i -- )
		{
			frameinfo <<= 1;
			if( buff & 0x80 )
				frameinfo |= 1;
			buff <<= 1;
		}
		
		if( bytes_count == 3 )
		{	//帧信息码字移位完成,加入处理程序
			if( phase_number == 0 )
			{	//低速pocsag
			decode_buff[ decode_buff_tail ].ulBlockData[ 0 ] = frameinfo;
			codeword_count = 1;
			}
		}
	}
	else
	{
		datas_count ++;
		if( phase_number != 0 )	//flex
		{
			crc_flag = 0;
			if( frame_rate == 7 && datas_count == 32 )
				crc_flag = 1;
			else if( ( frame_rate == 8 || frame_rate == 9 ) && ( datas_count == 63 || datas_count == 64 ) )
				crc_flag = 1;
			else if( frame_rate == 10 && datas_count > 124 && datas_count < 129 )
				crc_flag = 1;
				
			//开始解交织
			for( i = 0 ; i != 8 ; i ++ )	//需确定第几缓冲区,由计数器i与相位数phase_number的模决定
			{								//需确定缓冲区内第几码字,由码字计数器决定phase_code_count				
											//需循环八次,CRC校验八个码字
				decode_buff[ decode_buff_tail + i % phase_number ].ulBlockData[ codeword_count + phase_code_count ] <<= 1;
				if( buff & 0x80 )
					decode_buff[ decode_buff_tail + i % phase_number ].ulBlockData[ codeword_count + phase_code_count ] |= 1;
				buff <<= 1;	//左移一位
			
				//CRC检错
				if( crc_flag == 1 )
				{
					xorcon = 0x40000000;
		        	checkmul = 0x76900000;
    			    crc=decode_buff[ decode_buff_tail + i % phase_number ].ulBlockData[ codeword_count + phase_code_count ] >> 1;
    			    //移出偶校验位
		    	    for( j = 0 ; j < 21 ; j++ )
    	       		{
        	   			if( xorcon & crc )	crc^= checkmul;
	           			checkmul >>= 1;
    	       			xorcon >>= 1;
	    	       	}
//  	    	   	crc %= checkmul;
        	   		//CRC纠错
	           		if(crc)
    	    		{
    		       	}
				}
				//取模八 一块为8个码字	判断下一个码字是第几个码字( 0---7 )
				if(  ( i + 1 ) % 4 == 0 )
					phase_code_count ++;
				phase_code_count %= 8;	
			}
			if( datas_count == ( phase_number * 32 ) )
			{	//收完一个块 bytes:32 or 64 or 128
				codeword_count += 8;	//各相码字数加八
				datas_count = 0;		//0---phase_number * 32
				phase_code_count = 0;	//0---7
			}
		}
		else	//pocsag
		{
			for( i = 8 ; i != 0 ; i -- )
			{	//保存一个字节到缓冲区:decode_buff[ decode_buff_tail ]
				decode_buff[ decode_buff_tail ].ulBlockData[ codeword_count ] <<= 1;
				if( buff & 0x80 )
					decode_buff[ decode_buff_tail ].ulBlockData[ codeword_count ] |= 1;
				buff <<= 1;
			}
			
			if( datas_count == 4 )	//判断是否码字中的第四个字节
			{	//收到一个完整码字
				datas_count = 0;	//1,2,3,4
				//CRC检错
				xorcon = 0x40000000;
	        	checkmul = 0x76900000;
   			    crc = decode_buff[ decode_buff_tail ].ulBlockData[ codeword_count ] >> 1;
   			    //移出偶校验位
	    	    for( j = 0 ; j < 21 ; j++ )
   	       		{
       	   			if( xorcon & crc )	crc^= checkmul;
           			checkmul >>= 1;
   	       			xorcon >>= 1;
    	       	}
// 	    	   	crc %= checkmul;
       	   		//CRC纠错
	         	if(crc)
   	    		{
   	    			
   		       	}
				
				codeword_count ++;	//缓冲区码字计数器加1
				if( codeword_count == 88 )
				{	//收到一块完整码字
				decode_buff[ decode_buff_tail ].ucBlockUsedflag = 1;	//	used
				decode_buff[ decode_buff_tail ].uiBlockCodeWords = codeword_count;
				decode_buff[ decode_buff_tail ].ucProcotol = 0;			//pocsag
				decode_buff[ decode_buff_tail ].ucFrameRate = frame_rate;
				decode_buff_tail ++;
				decode_buff_tail %= MAXDECODEBUFF;
				codeword_count = 0;	//初始化
				}
			}
		}	
	}
}

/*------------------------------------------------
uart interrupt 4 router
------------------------------------------------*/
void uart_int( void )  interrupt 4
{
	
} 

/*------------------------------------------------
main program router
------------------------------------------------*/
void main( void )

	unsigned char data	decode_buff_head,decode_buff_tail;
	unsigned char data	addr_zone,vector_zone,message_zone;
	unsigned char data	i;
	unsigned int  data	index;
	unsigned long int data ulcodeword32;
	
	init_cpu( void );
	
	for( i = 0; i < MAXDECODEBUFF; i ++ )
		decode_buff[ i ].ucBlockUsedflag = 0;	//all unused

⌨️ 快捷键说明

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