📄 receive.c
字号:
/*
汉明码演示演示系统接收程序:晶体频率为11.0592M
*/
#include <STC89C51RC_RD_PLUS.H>
#include "intrins.h"
#define DATAPORT P1 //8位原始数据端口
#define HAMMINGPORTL P0 //汉明数据低8位
#define HAMMINGPORTH P2 //汉明数据高4位
#define ILEN 4
bit TimeFlag = 0 ; //时基标志 10ms置位一次
unsigned char DataValue = 0; //最终数据值
unsigned int HammingValue = 0x0f77; //汉明码
unsigned int HammingValueBak=0; //汉明码
unsigned int WrongValue = 0; //最终差错位置
unsigned char DisplayCount = 0; //显示刷新计数
unsigned int PortValue = 0;
unsigned int TempInt;
idata unsigned char CmdBuf[2]; //汉明码
unsigned char HammingBuf[12]; //海明码计算缓冲区
unsigned char WrongS[4];
//通信用到的全局变量
idata unsigned char InputBuf[ILEN];
bit InputFlag=0; //输入完成置1
bit FirstBelow=0; //第一次跌破门限
bit CmdFlag = 0; //接收到一组汉明码组置1
void RSTDOG(void)
{
WDT_CONTR = 0x34; //喂狗
}
void DelayMisc(unsigned int temp)
{
while (temp--);
}
/******************************
系统初始化部分
*********************************/
void Init(void)
{
/****设置定时器***************/
TMOD=0X21; //定时器1用于波特率发生器
TH1=0XFB; //波特率为9600/11.0592M : 0XFD 9600/18.432M : 0XFB
TL1=0XFB;
TL0 = (65536-10000) % 256; //10ms中断一次
TH0 = (65536-10000) / 256;
TR0 =1;
TR1=1;
/*****设置串行通信************************/
SCON=0X50; //8位工作方式,
/*******开启中断****************************/
ES=1;
ET0 = 1;
EA = 1;
}
void T0_Server(void) interrupt 1
{
TL0 = (65536-10000) % 256; //10ms中断一次
TH0 = (65536-10000) / 256;
TimeFlag = 1;
}
/************************************/
//通信服务子程序
//
/**************************************/
//
//
void UART_Service(void) interrupt 4
{
unsigned char i;
if (RI==1) /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
{ /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
/*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/
RI=0;
for(i=0;i<ILEN-1;i++)
InputBuf[i]=InputBuf[i+1];
InputBuf[ILEN-1]=SBUF;
/******判断接受头标志******************/
if(InputBuf[0]!=0xff) return;
if(InputBuf[1]!=0xaa) return;
CmdBuf[0] = InputBuf[2];
CmdBuf[1] = InputBuf[3];
CmdFlag = 1;
}
else
{
TI=0;
}
}
//计算汉明码
void CalHamming(void)
{
unsigned char WrongCount = 0;
//对编码内容拆分
HammingBuf[0] = (HammingValue & 0x0001) >> 0;
HammingBuf[1] = (HammingValue & 0x0002) >> 1;
HammingBuf[2] = (HammingValue & 0x0004) >> 2;
HammingBuf[3] = (HammingValue & 0x0008) >> 3;
HammingBuf[4] = (HammingValue & 0x0010) >> 4;
HammingBuf[5] = (HammingValue & 0x0020) >> 5;
HammingBuf[6] = (HammingValue & 0x0040) >> 6;
HammingBuf[7] = (HammingValue & 0x0080) >> 7;
HammingBuf[8] = (HammingValue & 0x0100) >> 8;
HammingBuf[9] = (HammingValue & 0x0200) >> 9;
HammingBuf[10] = (HammingValue & 0x0400) >> 10;
HammingBuf[11] = (HammingValue & 0x0800) >> 11;
//计算出错位置
WrongS[0] = HammingBuf[0] ^ HammingBuf[2] ^HammingBuf[4] ^HammingBuf[6] ^HammingBuf[8] ^HammingBuf[10];
WrongS[1] = HammingBuf[1] ^ HammingBuf[2] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[9] ^HammingBuf[10];
WrongS[2] = HammingBuf[3] ^ HammingBuf[4] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[11] ;
WrongS[3] = HammingBuf[7] ^ HammingBuf[8] ^HammingBuf[9] ^HammingBuf[10] ^HammingBuf[11];
WrongCount = (WrongS[3] << 3) + (WrongS[2] << 2) + (WrongS[1] << 1) + (WrongS[0] << 0);
//
if (WrongCount == 0)
{
WrongValue = 0;
}
else
{
WrongValue = 1;
WrongValue <<= (WrongCount-1);
}
HammingValue ^= WrongValue;
HammingBuf[2] = (HammingValue & 0x0004) >> 2;
HammingBuf[4] = (HammingValue & 0x0010) >> 4;
HammingBuf[5] = (HammingValue & 0x0020) >> 5;
HammingBuf[6] = (HammingValue & 0x0040) >> 6;
//产生最终数据值
DataValue = HammingValue>>4;
DataValue &= 0xf0;
DataValue += HammingBuf[2];
DataValue += (HammingBuf[4] << 1);
DataValue += (HammingBuf[5] << 2);
DataValue += (HammingBuf[6] << 3);
//计算完直接显示之
DATAPORT = DataValue;
HammingValueBak = HammingValue;
// HAMMINGPORTH = (HammingValue / 256) | 0xf0;
// HAMMINGPORTL = HammingValue % 256;
}
void main(void)
{
DATAPORT = 0;
HAMMINGPORTL = 0;
HAMMINGPORTH = 0;
DelayMisc(5000);
DATAPORT = 0xff;
HAMMINGPORTL = 0xff;
HAMMINGPORTH = 0xff;
CalHamming(); //解码
Init();
while(1)
{
RSTDOG(); //喂狗
/****************判断是否有接收到的数据*********/
if (CmdFlag == 1)
{
CmdFlag = 0;
HammingValue = CmdBuf[1];
HammingValue <<= 8;
HammingValue += CmdBuf[0];
CalHamming(); //解码
}
/************差错位置闪动显示处理**************/
//200ms翻转一下显示
if (TimeFlag == 1)
{
DisplayCount++;
if (DisplayCount > 20)
{
DisplayCount = 0;
TempInt = (HAMMINGPORTH & 0x0F);
TempInt <<= 8;
TempInt += HAMMINGPORTL;
TempInt ^= WrongValue;
HAMMINGPORTH = (TempInt / 256) | 0xf0;
HAMMINGPORTL = TempInt % 256;
}
}
/*************************************/
if (TimeFlag == 1)
{
TimeFlag = 0 ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -