单片机crc校验实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程总实验

——实现CRC校验

一、实验目的

⒈通过学习CRC原理,验证,检错,掌握其工作原理;

⒉编写CRC编码程序;

⒊总结实验过程,编写提交实验报告:方案、编程、调试、结果、分析、

结论。

二、实验要求

用单片机实现CRC校验码(10比特数据或任意数据长度、生成多项式用G (x)= x5 + x4 + x2 + 1 ),校验码显示在单片机实验系统数码管上。

二、实验器材

1、装有Keil C51开发工具的PC机一台

2、TD-PIT/TD-PIT-B实验装置一套

三、实验原理

1.设置CRC寄存器,并给其赋初始值。

2.将数据的第一个8-bit 字符与16 位CRC 寄存器的低8 位进行异或,并把结果存入CRC寄存器。

3.CRC 寄存器向右移一位,最高位补零,移出并检查最低位。

4.如果LSB 为0,重复第三步;若LSB 为1,CRC 寄存器与多项式码相异或。

5.重复第 3 与第4 步直到8 次移位全部完成。此时一个8-bit 数据处理完毕。

6.重复第 2 至第5 步直到所有数据全部处理完成。

7.最终CRC 寄存器的内容即为CRC 值。

常用的CRC循环冗余校验标准多项式如下:CRC (12 位) =X12+X11+X3+X2+X+1 CRC (16 位) = X16+X15+X2+1CRC (CCITT) = X16+X12 +X5+1 CRC (32 位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+ X5+X4+X2+X+1 以CRC (16 位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101本次实验以10比特为例。显示到六位数码管中。

其实验连接图如下图所示。

四、实验步骤

1.打开Keil C51开发工具,新建开发工具,并保存至相应路径。

2.新建文件,编写代码。

3.按照实验连线图在实验箱上连线。

4.编译运行代码勿误后,打开实验箱,点击调试,运行。

五、实验结果

经过调试程序,在实验箱数码管上显示二进制数001110.

六、实验源代码

#include "Absacc.h"

#define C8255_A XBYTE[0x7F00] //8255端口地址定义

#define C8255_B XBYTE[0x7F01]

#define C8255_C XBYTE[0x7F02]

#define C8255_CON XBYTE[0x7F03]

//数码管显示编号

unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,

0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

long MD;

long GD;

void delay(unsigned int time)

{

unsigned int i;

for(i=0; i

}

void display() //显示函数

{

unsigned char i, j = 0xDF;

for(i=0; i<6; i++)

{

C8255_A = 0xFF;

C8255_B = a[b[i]]; //查表输出显示

C8255_A = j;

delay(0x100);

j = (j>>1)|(j<<7);

}

}

void clear() //清屏

{

C8255_B = 0x00;

}

void CRC_check(long MD1,long GD1)

{ long MD = MD1 ; // 需要校验的数据

long GD = GD1;

long tmp; //临时变量保存多个移位,或恢复原值信息int count_MD; //校验数据的位数

int count_GD; //多项式的位数

int count; //两者位数差

long tst0 = 1; //判断余数最高位是否为0

int i;

tmp = MD; //数MD 有多少位tmp用于暂存MD

for(count_MD = 0 ; MD != 0 ; count_MD++)

MD >>= 1;

MD = tmp;

tmp = GD; //数GD有多少位tmp用于暂存GD

for(count_GD = 0 ; GD != 0 ; count_GD++)

GD >>= 1;

GD = tmp ;

//构造CRC码序列

for(tmp = 1 ; tmp < count_GD ; tmp ++) //左移count_GD-1位

MD <<= 1;

count = count_MD - 1;

//将GD 与MD 构造等长,低位用0填充tmp = count; //长度均为count_GD+count_MD-1

while(count--)

{

GD <<= 1 ;

}

count = tmp;

//tst0 和MD 求与运算,确定MD最高位是否为1,

确定是否应该求模

tmp = count_GD + count_MD -1 ;

while(--tmp) //循环tmp-1次,位数为1+tmp-1

tst0 <<= 1;

相关文档
最新文档