;modbus CRC16
TEST_CRC16: ;R0,R3,R4,DPH,DPL,A,PSW. R0为起始单元 R4为数据长度,结果在DPH,DPL中
;① 装入一个16位寄存器,所有数位均为1。
MOV DPH,#0FFH
MOV DPL,#0FFH
CRCJ1:
MOV R3,#8
MOV A,@R1
XRL A,DPL
;② 该16位寄存器的低位字节与开始8位字节进行"异或"运算。运算结果放入这个16 位寄存器。
MOV DPL,A
CRCJ2:
MOV A,DPH
CLR C
RRC A
MOV DPH,A
MOV A,DPL
RRC A
MOV DPL,A
;③ 把这个16寄存器向右移一位。
JNC CRCJ3
;④ 若向右(标记位)移出的数位是1,则用多项式1010000000000001 和这个寄存器进行"异或"运算;若向右移出的数位是0,则返回③。
;--------------
MOV A,#01H
XRL A,DPL
MOV DPL,A
MOV A,#0A0H
XRL A,DPH
MOV DPH,A
CRCJ3:
;⑤ 重复③和④,直至移出8位。
DJNZ R3,CRCJ2
;⑥ 另外8位与该十六位寄存器进行"异或"运算。
INC R1
;⑦ 重复③~⑥,直至该报文所有字节均与16位寄存器进行"异或"运算,并移位8次。
DJNZ R4,CRCJ1
CRC_END:
;⑧ 这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。
;MOV 70H,DPL ;发送与返回的CRC16代码,低字节在前,高字节在后
;MOV 71H,DPH
RET
文章评论(0条评论)
登录后参与讨论