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

📄 !crc16table.c

📁 一个生成反相CRC-CCITT校验码表的单片机C程序
💻 C
字号:
/******************************************
*功能:    生成反相CRC-CCITT校验码表
*多项式:  反相CRC-CCITT= 0x8408
*输出:    反向输出,即先输出低位
*CRC初值: 0x00
*创建日期:2006.06.23
******************************************/
#define uchar unsigned char
#define uint  unsigned int  

uint xdata crcbuff [256];  //存储生成的CRC码表
   
//生成一个无符号字符型数据的反相CRC码,写法1
/*************************************************************
*函数名称:生成一个数据字节的反相CRC-CCITT码
*函数参数:Data-----待进行反相CRC-CCITT计算的数据
*局部变量:crc------计算后的反相CRC-CCITT数据
		   i--------用于一个数据反相CRC-CCITT计算结束旗标
* 程序(1),(2),(3) 可以理解成移位前crc 的Bit0 与数据
* 对应的Bit(Data&i)做XOR 运算,根据此结果来决定是否执行
* crc^=0x8408。只要明白两次异或运算与原值相同,就不难
* 理解这个程序。
*************************************************************/   
/*uint crc16r(uint Data)
{
	uint crc=0; // CRC 码
	unsigned char i;
	for(i=0x01;i!=0;i <<= 1)
	{
		if((crc&0x0001)!=0)	   
		{
			crc >>= 1;		  //(1)
			crc ^= 0x8408;
		}
		else 
		{
			crc >>= 1;		   //(2)
		}
		if((Data&i)!=0)	 //依次判断数据的每一位是否为1,从低位开始
		{ 
			crc ^= 0x8408;	   //(3)
		}
	}
	return(crc);
	/*************************************************************
	(1),(2),(3)表示只有当CRC的最低位和Data的最低位相异时,CRC才
	与生成多项式异或因为二次异或的结果与 原值(即未异或)相同
	*************************************************************/
//}	  

//生成一个无符号字符型数据的反相CRC码,写法2
/*************************************************************
*函数名称:反相CRC-CCITT码表生成子程序
*函数参数:Data----待生成反相CRC-CCITT码的数据
*局部变量:i-------反相CRC-CCITT计算完成判断
           crc-----计算结束得到的反相CRC-CCITT码  
*************************************************************/
uint crc16r(uint Data) //Data为进行CRC校验的数据字节
{
	uchar i;
	uint crc=0; // CRC 码
	for(i=8; i!=0; i--)
	{
	/*************************************************************
	* 只有当CRC的最低位和Data的最低位相异时,CRC才与生成多项式异或
	*************************************************************/		
		if(((Data^crc)&0x0001) != 0)//CRC的最低位和Data的最低位相异
		{												
			crc>>=1; 		//CRC右移一位然后和生成多项式异或						   
			crc^=0x8408;
		} 
		else //CRC的最低位和Data的最低位相同
		{
			crc>>=1;
		}
		Data>>=1;	//数据右移一位,以便由低到高逐位判断Data的每一位
		 								
	} 
	return(crc);
}
	
void main(void)
{
	uint Count;
	for(Count=0;Count<256;Count++)
	{
		crcbuff[Count]=crc16r(Count);
	}
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -