热度 21
2015-8-5 12:59
1748 次阅读|
0 个评论
;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