搜索
bottom↓
回复: 19

自己编写VB、C、汇编 CRC16算法,供参考【恢复】

[复制链接]

出0入0汤圆

发表于 2008-9-24 17:05:45 | 显示全部楼层 |阅读模式
'VB算法

Public Function CRC16(data() As Byte) As Byte()

  Dim CRC16Lo As Byte, CRC16Hi As Byte      'CRC寄存器

  Dim CL As Byte, CH As Byte                '多项式码&HA001

  Dim SaveHi As Byte, SaveLo As Byte

  Dim i As Integer

  Dim Flag As Integer

  Dim ReturnData(1) As Byte

    

  CRC16Lo = &HFF

  CRC16Hi = &HFF

  CL = &H1

  CH = &HA0

  For Ii = 0 To UBound(data) 

      CRC16Lo = CRC16Lo Xor data(Ii) '每一个数据与CRC寄存器进行异或

      For Flag = 0 To 7

          SaveHi = CRC16Hi

          SaveLo = CRC16Lo

          CRC16Hi = CRC16Hi \ 2            '高位右移一位

          CRC16Lo = CRC16Lo \ 2            '低位右移一位

          If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1

              CRC16Lo = CRC16Lo Or &H80    '则低位字节右移后前面补1

          End If                           '否则自动补0

          If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或

              CRC16Hi = CRC16Hi Xor CH

              CRC16Lo = CRC16Lo Xor CL

          End If

      Next Flag

  Next Ii

  ReturnData(0) = CRC16Lo              'CRC低位

  ReturnData(1) = CRC16Hi              'CRC高位

  CRC16 = ReturnData

End Function



'C算法

void crc16(unsigned char r_data[],unsigned int length)

{

    unsigned char cl,ch;

    unsigned char savehi,savelo;

    int ii,flag;

    crc16hi=0xFF;

    crc16lo=0xFF;

    cl=0x1;

    ch=0xA0;

    for (ii=0;ii<length;ii++)

    {

        crc16lo=(crc16lo ^ r_data[ii]);

        for (flag=0;flag<8;flag++)

        {

            savehi=crc16hi;

            savelo=crc16lo;

            crc16hi=(crc16hi>>1);

            crc16lo=(crc16lo>>1);

            if ((savehi & 0x01)==0x01)

                    crc16lo=(crc16lo | 0x80);

            if ((savelo & 0x01)==0x01)

            {

                    crc16hi = (crc16hi ^ ch);

                    crc16lo = (crc16lo ^ cl);

            }        

        }

    }

}



'汇编算法

;**********************************************************

;CRC16校验子程序

;R1 需进行CRC校验数据起始地址

;CRC16_L CRC校验数据低字节 CRC16_H CRC校验数据高字节

;R7 需进行CRC校验的字节数

;**********************************************************

CRC16:   

        MOV CRC16_L,#0FFH

        MOV CRC16_H,#0FFH

CRC16_LOOP1:              

        MOVX A,@R1

        XRL CRC16_L,A

        MOV R6,#08H

CRC16_LOOP2:

        MOV R3,CRC16_L

        MOV R4,CRC16_H

        CLR C

        MOV A,CRC16_H

        RRC A

        MOV CRC16_H,A

        MOV A,CRC16_L

        RRC A

        MOV CRC16_L,A

        JNC CRC16_STEP

        XRL CRC16_L,#01H

        XRL CRC16_H,#0A0H

CRC16_STEP:

        DJNZ R6,CRC16_LOOP2

        INC R1

        DJNZ R7,CRC16_LOOP1

        RETI





本贴被 saimo 编辑过,最后修改时间:2008-09-24,17:06:58.

出0入0汤圆

发表于 2009-1-13 23:28:08 | 显示全部楼层
谢谢!做个标记,慢慢学习。 

出0入0汤圆

发表于 2009-1-13 23:01:41 | 显示全部楼层
请问你的程序生成的校验多项式是  X^16+X^12+X^5+1 吗?

出0入0汤圆

发表于 2009-1-11 15:47:21 | 显示全部楼层
我用的vb crc16的代码也是来自这里的!呵呵

出0入0汤圆

发表于 2009-1-10 12:11:05 | 显示全部楼层
好,不错

出0入0汤圆

发表于 2008-9-24 22:29:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-9-24 17:18:36 | 显示全部楼层
谢谢!做个标记,慢慢学习。

出0入0汤圆

发表于 2010-7-6 22:52:10 | 显示全部楼层
正想用,收下了,谢谢楼主

出0入0汤圆

发表于 2010-10-20 11:00:13 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-10-20 15:31:50 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-10-20 21:15:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-21 08:55:12 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-11-29 16:28:02 | 显示全部楼层
补充一个 汇编语言 测试成功的

.include                "tn13def.inc"

.def    polyhi   = R16
.def    polylo   = R17
.def    crchi    = R18 ;crc高字节
.def    crclo    = R19 ;crc低字节
.def    bitcnt   = R20 ;
.def    buflen   = R21 ;数量

;-------------------------------------------------------------------------
                .cseg
                .org 0
;-------------------------------------------------------------------------
avr0000:
            rjmp        RESET

RESET:  ldi        ZL,RamEnd               
                out        SPL, zl

                ldi           Zh, high(2*data)
                ldi           Zl, low(2*data)
                ldi           buflen, low(2*data_en)-low(2*data)
                rcall  crc_go
                rjmp    pc


;*********************************************************
;   eXtreme compact CRC16 procedure (c) Gleb Daniloff
;   08/01/2007 harley@hotbox.ru
;   registry usage: Z,r0,polylo,polyhi,crclo,crchi,bitcnt
;   input:   Z - pointer to string, buflen - buffer length
;   output:   crclo,crchi - CRC16
;*********************************************************

crc_go:
      ldi      polyhi,0xa0      ; polynom inilialization - once at all
      ldi      polylo,0x01
      ldi      crchi,0xff;clr      crchi         ; crc initialization - once per call
      ldi      crclo,0xff;clr      crclo         
crc16:
      lpm         
      adiw      ZL,1
      ldi      bitcnt,8
crc01:
      eor      crclo,r0
      bst      crclo,0
      eor      crclo,r0
      lsr      r0
      lsr      crchi
      ror      crclo
      brtc      crc02
      eor      crchi,polyhi
      eor      crclo,polylo
crc02:
      dec      bitcnt
      brne      crc01
      dec      buflen
      brne      crc16
      ret

data: .db 0x01,0x02,0x00,0xc4,0x00,0x16
data_en:

出0入0汤圆

发表于 2010-11-29 17:33:13 | 显示全部楼层
很好~~哈哈

出0入0汤圆

发表于 2010-11-30 13:42:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 14:29:44 | 显示全部楼层
补充一个CRC8 的 汇编语言
;CRC8 校验计算通过
.include                "tn13def.inc"

.def    poly8    = R16
.def    crc8     = R17

.def    bitcnt   = R20 ;
.def    buflen   = R21 ;数量
.def    xor      = r22

;-------------------------------------------------------------------------
                .cseg
                .org 0
;-------------------------------------------------------------------------
avr0000:
            rjmp        RESET

RESET:  ldi        ZL,RamEnd               
                out        SPL, zl

                ldi           Zh, high(2*data)
                ldi           Zl, low(2*data)
                ldi           buflen, low(2*data_en)-low(2*data)

                rcall  crc_go
                rjmp    pc
               



;*********************************************************
;   eXtreme compact CRC8 procedure (c) Gleb Daniloff
;   08/01/2007 harley@hotbox.ru
;   registry usage: Z,r0,poly8,crc8,bitcnt
;   input:   Z - pointer to string, buflen - buffer length
;   output:   crc8 - CRC8
;*********************************************************

crc_go:
      ldi      poly8,0x8C      ; polynom inilialization - once at all
      ldi      crc8,0;0xff;clr      crc8         ; crc initialization - once per call
crc8_:
      lpm         
      adiw     ZL,1
      ldi      bitcnt,8
crc01:
      eor      crc8,r0
      bst      crc8,0
      eor      crc8,r0
      lsr      r0
      lsr      crc8
      brtc     crc02
      eor      crc8,poly8
crc02:
      dec      bitcnt
      brne      crc01
      dec      buflen
      brne      crc8_
      ret
          
data:
.db 0x68,0x1B,0x1B,0x68,0x02,0x00,0x7C,0x32
data_en:

出0入0汤圆

发表于 2010-12-2 14:31:28 | 显示全部楼层
上传一个CRC8计算的软件  初始值是00

点击此处下载 ourdev_601800HX9CBB.rar(文件大小:262K) (原文件名:crc8_calc.rar)

出0入0汤圆

发表于 2010-12-2 14:50:07 | 显示全部楼层
CRC32计算器

点击此处下载 ourdev_601809ORBU4A.rar(文件大小:49K) (原文件名:CRC32Calc (No Install).rar)

出0入0汤圆

发表于 2011-11-30 13:57:59 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-10-16 08:16:07 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表