原创 modbus A51校验子程序 CRC16

2015-8-5 12:59 1774 21 21 分类: 消费电子
 
;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
 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
21
关闭 站长推荐上一条 /3 下一条