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

📄 send.c

📁 单片机汉明码编码程序
💻 C
字号:
/*

  汉明码演示系统发送方程序:晶体频率为11.0592M
  
	
*/


#include <STC89C51RC_RD_PLUS.H>
#include "intrins.h"


#define  DATAPORT P1     //8位原始数据端口
#define  HAMMINGPORTL P0  //汉明数据低8位
#define  HAMMINGPORTH P2  //汉明数据高4位

sbit     DATAKEY = P3^2;  //数据产生按键
sbit     WRONGKEY = P3^3;  //差错码产生按键


bit   TimeFlag = 0 ;   //时基标志 10ms置位一次

unsigned char DataCount = 0;  //原始数据值,随机更新,取值范围0--255
unsigned char WrongCount = 0;  //差错码产生位置,0--11



unsigned char DataValue = 0xaa;   //最终数据值
unsigned int  HammingValue = 0;  //汉明码
unsigned int  WrongValue = 0;  //最终差错位置

unsigned char DisplayCount = 0;  //显示刷新计数
unsigned char SendCount = 0;     //发送处理


unsigned char  HammingBuf[12];  //海明码计算缓冲区


unsigned int  TempInt = 0;

#define OLEN    6
#define ILEN    6
#define START_SEND() {TI=1;}
//通信用到的全局变量

idata   unsigned  char  OutputBuf[OLEN];         
unsigned char OutputPoint=0;           //输出缓冲区指针
bit  OutputFlag=1;                     //输出完成置1
bit  OutputStart=0;                    //为1正在输出中
unsigned char SendNum;                 //要发送的数据个数




void DelayMisc(unsigned int temp)
{
	while (temp--);
}


void RSTDOG(void)
{
	WDT_CONTR = 0x34;  //喂狗
}

/******************************
系统初始化部分
*********************************/
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 
{
	
	if (RI==1)         /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
	{                           /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
		/*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/   
		RI=0;
	}
	else
	{   
		TI=0;
		if(OutputPoint==SendNum) 
		{
			return;
		} 
		
		if(OutputStart==0)
		{
            OutputStart=1;
            OutputPoint=0;
		}
		
		SBUF=OutputBuf[OutputPoint++];
		if(OutputPoint==SendNum)          //指定的字节个数已发送完
		{
			OutputStart=0;  
			OutputFlag=1;
			OutputPoint=0;
			SendNum=0;
			
			return;
		}
	}
}


//计算汉明码
void CalHamming(void)
{

	//计算汉明码
	//先填充数据位
	HammingBuf[11] = (DataValue & 0x80) >> 7;
	HammingBuf[10] = (DataValue & 0x40) >> 6;
	HammingBuf[9] =  (DataValue & 0x20) >> 5;
	HammingBuf[8] =  (DataValue & 0x10) >> 4;

	HammingBuf[6] =  (DataValue & 0x08) >> 3;
	HammingBuf[5] =  (DataValue & 0x04) >> 2;
	HammingBuf[4] =  (DataValue & 0x02) >> 1;

	HammingBuf[2] = (DataValue & 0x01);

	//计算4位编码位
	HammingBuf[0] = HammingBuf[2] ^ HammingBuf[4] ^ HammingBuf[6] ^ HammingBuf[8] ^ HammingBuf[10];
	HammingBuf[1] = HammingBuf[2] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[9] ^ HammingBuf[10];
	HammingBuf[3] = HammingBuf[4] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[11];
	HammingBuf[7] = HammingBuf[8] ^ HammingBuf[9] ^ HammingBuf[10] ^ HammingBuf[11];

	//产生最终汉明码
	HammingValue =  HammingBuf[0];
	HammingValue +=  (HammingBuf[1] << 1);
	HammingValue +=  (HammingBuf[2] << 2);
	HammingValue +=  (HammingBuf[3] << 3);
	HammingValue +=  (HammingBuf[4] << 4);
	HammingValue +=  (HammingBuf[5] << 5);
	HammingValue +=  (HammingBuf[6] << 6);
	HammingValue +=  (HammingBuf[7] << 7);
	

	TempInt = HammingBuf[8];
	TempInt <<= 8;
	HammingValue += TempInt;

	TempInt = HammingBuf[9];
	TempInt <<= 9;
	HammingValue += TempInt;

	TempInt = HammingBuf[10];
	TempInt <<= 10;
	HammingValue += TempInt;

	TempInt = HammingBuf[11];
	TempInt <<= 11;
	HammingValue += TempInt;

    //计算完直接显示之
	DATAPORT = DataValue;
	HAMMINGPORTH = (HammingValue / 256) | 0xf0;
	HAMMINGPORTL = HammingValue % 256;
}

void main(void)
{
	DATAPORT = 0;
	HAMMINGPORTL = 0;
	HAMMINGPORTH = 0;
	DelayMisc(50000);
	DATAPORT = 0xff;
	HAMMINGPORTL = 0xff;
	HAMMINGPORTH = 0xff;

    Init();  //系统初始化
	

	CalHamming();  //先计算一次汉明码
    while(1)
    {
		RSTDOG();   //喂狗
		/****随机数据和随机差错码产生*******/
		DataCount++;
		WrongCount++;
		if (WrongCount > 11)
		{
			WrongCount = 0;
		}
		/**********按键检查*****************/
		if (TimeFlag == 1)
		{
			//数据产生键
			if (DATAKEY == 0)
			{
				DataValue = DataCount;
				WrongValue = 0;      //清除差错码
				DisplayCount = 100;  //需要显示刷新

				CalHamming();  //计算汉明码
			}
			//差错产生键
			if (WRONGKEY == 0)
			{
				WrongValue = 1;
				WrongValue <<= WrongCount;
				DisplayCount = 100;  //需要显示刷新

				CalHamming();  //计算汉明码
			}
		}
		/************定时产生发送编码数据*****/	
		//1000ms发送一次
		if (TimeFlag == 1)
		{
			SendCount++;

			if (SendCount > 50)
			{
				SendCount = 0;
				
				OutputBuf[0] = 0xff;
				OutputBuf[1] = 0xaa;
				OutputBuf[2] = (HammingValue ^ WrongValue) % 256;  //先发低字节
				OutputBuf[3] = (HammingValue ^ WrongValue) / 256;  //先发低字节

				//tputBuf[2] = (HammingValue ) % 256;  //先发低字节
				//tputBuf[3] = (HammingValue ) / 256;  //先发低字节
				SendNum = 4;
				START_SEND(); 

			}
		}


		/************差错位置闪动显示处理**************/
		//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 + -