回 帖 发 新 帖 刷新版面

主题:一个完整无误的CRC-16循环冗余校验MCS-51汇编源代码

网上提供的CRC-16循环冗余校验很多,但几乎没有一个完全正确的,参考网上的做了一些修改便通过了,供大家参考:

TEMP        EQU    40H
CHKSUMBYL   EQU    46H                  ;校验和低字节
CHKSUMBYH   EQU    47H                  ;校验和高字节

DATALENGTH  EQU    4FH                  ;待校验的数据串长度
            
            ORG 0000H
            MOV   TEMP,#1EH
            MOV   TEMP+1,#6
            MOV   TEMP+2,#20H
            MOV   TEMP+3,#0
            MOV   TEMP+4,#0
            MOV   TEMP+5,#2
            LCALL MAKE_CHKSUM
            SJMP  $
            
;-----------------------------------------------------------------------------
;运行:  1E 06 20 00 00 02 01 A4  ,16进制,设备地址,命令,存储器地址高,存储器地址低,参数高,参数低,校验高,校验低。
;停止:  1E 06 20 00 00 01 41 A5  , 9600,8,N,2
;送参数:1E 06 20 01 0B B8 D6 E7
;-----------------------------------------------------------------------------
MAKE_CHKSUM:     ;RTU 模式,CRC - 16 校验,用软件模拟仿真检查无误,在台达变频器上通过
            MOV   R0,#TEMP
            MOV   CHKSUMBYL,#0FFH       ;1.预置 16 位寄存器为十六进制 FFFF(即全为 1),低字节
            MOV   CHKSUMBYH,#0FFH       ;  预置 16 位寄存器为十六进制 FFFF(即全为 1),高字节
            MOV   DATALENGTH,#6         ;待校验的数据串长度
CHKSUM_LP1:
            MOV   A,@R0                 ;2.把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,
            XRL   A,CHKSUMBYL
            MOV   CHKSUMBYL,A           ;并把结果放于CRC 寄存器

            MOV   R7,#8
CHKSUM_LP2:
            MOV   A,CHKSUMBYH
            CLR   C
            RRC   A                     ;3.把寄存器的内容右移一位(朝低位),先移动高字节
            MOV   CHKSUMBYH,A

            MOV   A,CHKSUMBYL
            RRC   A                     ;再移动低字节
            MOV   CHKSUMBYL,A

            JNC   CHKSUM_JP             ;4.检查最低位(移出位),如果最低位为 0 ,重复第 3 步(再次移位)
            MOV   A,CHKSUMBYL
            XRL   A,#01H                ;如果最低位为 1,CRC 寄存器与多项式 A001 进行异或
            MOV   CHKSUMBYL,A

            MOV   A,CHKSUMBYH
            XRL   A,#0A0H
            MOV   CHKSUMBYH,A
CHKSUM_JP:
            DJNZ  R7,CHKSUM_LP2         ;5.重复步骤 3 和 4,直到右移 8 次,这样整个 8 位数据全部进行了处理
            INC   R0
            DJNZ  DATALENGTH,CHKSUM_LP1 ;6.重复步骤2 到步骤 5,进行下一个 8 位数据的处理
            RET
            
            
            END

附CRC-16循环冗余校验码验证软件:

回复列表 (共3个回复)

沙发

本论坛似乎不谈论单片机?

板凳


这里有一个网友用VB编写的 CRC-16错误校验程序.rar在主帖里,大家可以用来验证自己的程序对否。

3 楼


非常好,非常感谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册