CRC算法的研究

发布者:码梦狂人最新更新时间:2014-12-11 来源: 51hei关键字:CRC算法  AVR  DS18B20 手机看文章 扫描二维码
随时随地手机看文章

这两天,由于用AVR对DS18B20读取数据匹配需要效验,在家里研究CRC算法,借鉴网上的一些方法,我把它终于被研究出来了,编写成了一个C++类库希望对大家有所帮助。经过试验,成功!

直接调用CRC :: get(char* pData, int nLength, char bitWidth)就可返回CRC。

pData:需要效验的数组首地址

nLength:数组的宽度,单位(字节)

bitWidth:需要生成的CRC编码方式,7,8,16可选.

此函数基于IAR AVR设计 


__flash UINT crc16_REF[256]=
{             
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
  0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
  0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
  0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
  0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
  0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
  0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
  0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
  0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
  0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
  0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
  0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
  0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
  0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
  0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
  0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
  0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
  0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
  0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
  0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
  0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
  0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
  0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
  0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
  0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
  0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
  0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
  0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
  0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
  0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
  0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
  0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

class CRC
{
public:
  UINT get(char *pData, int nLength , char bitWidth = 8)
  {
    switch(bitWidth)
    {
    case 7:
      return getCRC8(pData , nLength);
    case 8:
      return getCRC8(pData , nLength);
    case 16:
      return getCRC16(pData , nLength);
    }
    return getCRC8(pData , nLength);
  }
 
  UINT getCRC7(char* pData,int nLength)
  {
    UINT i;
    UINT crc = 0x0000;
    while(nLength--)
    {
      for(i = 0x80; i != 0; i /= 2)
      {
        if((crc & 0x40) != 0)
        {
          crc *= 2;
          crc ^= 0x09;
        }   
        else
        {
          crc *= 2;
        }
        if((*pData & i) != 0)
        {
          crc ^= 0x09;
        }
      }
      pData++;
    }
    crc = crc & 0x7f;
    crc = crc << 1;
    crc = crc | 0x01;
    return(crc);
  }
 
  UINT getCRC8(char* pData, int nLength)
  {
    UINT crc,  j;
    crc = 0;
    for (j = 0; j < nLength; j++)
    {
      char x = *pData++;
      for (char i = 0 ; i < 8 ; i++)
      { 
        if (((crc & 0x01) ^ (x & 0x01)))
        {
          crc ^= 0x18;
          crc >>= 1;
          crc |= 0x80;
        }
        else
          crc >>= 1;
        x >>= 1;
      }
    }
    return crc;
  }
 
  UINT getCRC16(char* pData, int nLength)
  {
    UINT crc = 0x0000;    // 初始化
    unsigned char i;
    while(nLength--)
    {
      i = (unsigned char) (crc / 256); 
      crc <<= 8;  
      crc ^= crc16_REF[i ^ *pData];
      pData++;
    }
    return crc; 
}

}; 

关键字:CRC算法  AVR  DS18B20 引用地址:CRC算法的研究

上一篇:Zigbee节点的硬件设计与实现
下一篇:嵌入式激光显示手持式测量仪方案

推荐阅读最新更新时间:2024-03-16 13:48

基于AVR单片机的I SP1362OTG设计
简介: 本文设计的USB 0TG主从机系统性能稳定,数据传输效率高。测试表明,此设计能够正确地实现USB 0TG主从机间的数据交换,性能可以满足设备间的数据传输要求,同时又能很好地控制成本,具有一定的实用价值。 0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照
[单片机]
基于<font color='red'>AVR</font>单片机的I SP1362OTG设计
基于AVR单片机的医用智能输液系统
  静脉输液是我国目前临床治疗中最主要的一种输液方式,在实践工作中,医护人员一般是靠经验和观察通过转动输液器上的滑轮对滴速进行手动调节的。本系统是一种非接触式全自动的静滴检测和报警控制装置,时刻检测液体的滴速,并且在药液滴完后能够自动地切断液体进行本地和远程报警,以通知医护人员及时更换液体,对提高现代医疗服务系统的效率和质量都有着非常重要的意义。   1. 研究意义   目前,医院静脉输液主要是人工控制,由人监控的静脉输液,无法正确调解药液流速,速度过快由于点滴里有钾元素的成分会造成血管刺激,通常刺激会表现为疼痛。但通常输液快慢要看自身身体情况,但输液还是会对血管和心脏,肾脏有刺激。利用现有的科技设计智能输液系统,即可以控制药
[单片机]
基于<font color='red'>AVR</font>单片机的医用智能输液系统
基于可编程数字电位器的AVR嵌入式单片机剖析
1 引言 AVR嵌入式单片机具有丰富的硬件、软件资源,其中的串行I2C接口能满足很多应用场合的要求,两个AVR单片机通过I2C总线直接连接就可实现单片机相互通信;AVR单片机还可以和任何具有I2C总线接口的外设直接连接而无须其它硬件电路支持。而X9221系列可编程数字电位器在智能测试设备上应用非常广泛,通过I2C总线可以简单地构成单片机与各种外设之间乃至与计算机之间的通信,建立友好的人机界面联系。硬件设计简单、灵活,只需要将所有设备的SDA和SCL信号线分别并联在一起并加上拉电阻即可,有助于提高设备的自动化水平、可靠性、稳定性及电气装配的工艺性。AVR单片机和X9221系列可编程数字电位器都有内置的E2ROM单元,可以非常方便地为
[单片机]
基于可编程数字电位器的<font color='red'>AVR</font>嵌入式单片机剖析
AVR M16实验之四 独立按键
/********************************************************************** * 文件名称: main.c * 程序作者: kidcao1987 * 程序版本: V1.0 * 功能描述: 按动左下角的四个独立按键,在数码管上会显示 1~4 ,这四个不同的数字。 * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部11.0592MHZ晶振 * 技术支持:http://bbs.cepark.com **********************************************************************/ #inc
[单片机]
AVR单片机驱动LCD1602
这几天一直在学习AVR单片机的使用,也移植了几个以前在51单片机上用到的一些函数库,今天在调试LCD1602,把经验分享给大家 在进行读写操作的时候,如果使用了较高的晶振频率,那么在操作时序的时候要适当延时,一般一个空指令就可以了。 在读忙操作的时候要把数据口设置为输入,并开启内部上拉。 下面是实现的代码: #include iom8515.h #define LCD1602_DB PORTA //PA #define LCD1602_RS (1 7) //PC7 #define LCD1602_RW (1 6) //PC6 #define LCD1602_EN (1 5) //PC5 #defi
[单片机]
51单片机外围模块——DS18B20温度传感器
一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 二. DS18B20的特点 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 DS18B20支持多点组
[单片机]
51单片机外围模块——<font color='red'>DS18B20</font>温度传感器
AVR单片机ISP下载线的制作
单片机编程器的作用是将调试好的程序烧写到单片机的存储器中。本文介绍的AVR单片机ISP下载线的成本只有10元左右,非常适合初学者自制。 AVR单片机的程序可以使用串行在线编程(ISP)方式下载写入,即可直接在电路板上进行程序的烧写和修改,所需的装置就是一根ISP下载线。 本文介绍的ISP下载线使用计算机的并口对单片机编程.不仅支持AVR单片机,也支持对51单片机中AT89S系列单片机的编程。 一、下载线电路 下载线的电路见图1。该下载线是STK200/300型的下载线。74HC244是8缓冲器电路,用来作计算机并口和单片机的缓冲隔离。图1中的LPT连接到计算机的并口,作计算机上的下载软件和单片机进行通信
[单片机]
<font color='red'>AVR</font>单片机ISP下载线的制作
基于可编程数字电位器在AVR单片机中的应用
1 引言 AVR嵌入式单片机具有丰富的硬件、软件资源,其中的串行I2C接口能满足很多应用场合的要求,两个AVR单片机通过I2C总线直接连接就可实现单片机相互通信;AVR单片机还可以和任何具有I2C总线接口的外设直接连接而无须其它硬件电路支持。而X9221系列可编程数字电位器在智能测试设备上应用非常广泛,通过I2C总线可以简单地构成单片机与各种外设之间乃至与计算机之间的通信,建立友好的人机界面联系。硬件设计简单、灵活,只需要将所有设备的SDA和SCL信号线分别并联在一起并加上拉电阻即可,有助于提高设备的自动化水平、可靠性、稳定性及电气装配的工艺性。AVR单片机和X9221系列可编程数字电位器都有内置的E2ROM单元,可以非
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
    天是星期天,刚好在家里休息。又是学习ARM的大好时机了。早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的。搞得睡觉,也睡 ...
  • 学习ARM开发(4)
    已经把CPU大体架构学会了,当然我之前已经学习过80X86的结构,所以对于像RISC的计算机,也能想像到它是什么样的东西。如果没有学习过《微机 ...
  • 学习ARM开发(6)
  • 学习ARM开发(7)
  • 学习ARM开发(8)
  • 学习ARM开发(9)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved