📄 flexdec.c
字号:
/*------------------------------------------------
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 + -