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

📄 receive.c

📁 单片机汉明码解码程序
💻 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 + -