📄 decode.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 + -