⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus16.lis

📁 一个16位单片机modbus通信例程
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0006           ; 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 0006           ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 0006           ; 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 0006           ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
 0006           ; 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
 0006           ; 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 0006           ; 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 0006           ; 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
 0006           ; } ; 
 0006           ; /* CRC低位字节值表*/ 
 0006           ; const uint8 auchCRCLo[] = { 
 0006           ; 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
 0006           ; 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
 0006           ; 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
 0006           ; 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
 0006           ; 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
 0006           ; 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
 0006           ; 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
 0006           ; 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
 0006           ; 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
 0006           ; 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
 0006           ; 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
 0006           ; 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
 0006           ; 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
 0006           ; 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
 0006           ; 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
 0006           ; 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
 0006           ; 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
 0006           ; 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
 0006           ; 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
 0006           ; 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
 0006           ; 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
 0006           ; 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
 0006           ; 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
 0006           ; 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
 0006           ; 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
 0006           ; 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
 0006           ; } ;
 0006           ; 
 0006           ; uint8   testCoil; //用于测试 位地址1
 0006           ; uint16  testRegister; //用于测试 字地址0
 0006           ; 
 0006           ; uint8 localAddr = 1;  //地址
 0006           ; uint8 sendCount;              //发送字节个数
 0006           ; uint8 receCount;              //接收字节个数
 0006           ; uint8 sendPosi;               //发送位置
 0006           ; uint8 sendBuf[32],receBuf[32];        //发送,接收缓冲区   
 0006           ; uint8 checkoutError;                          //校验结果
 0006           ; uint8 receTimeOut;                            //接收超时
 0006           ; 
 0006           ; uint16 crc16(uint8 *puchMsg, uint16 usDataLen) 
 0006           ; { 
 0006                   .dbline 78
 0006           ;       uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ 
 0006 6FEF              ldi R22,255
 0008                   .dbline 79
 0008           ;       uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ 
 0008 4FEF              ldi R20,255
 000A 2FC0              xjmp L3
 000C           L2:
 000C                   .dbline 82
 000C                   .dbline 83
 000C F801              movw R30,R16
 000E 2190              ld R2,Z+
 0010 8F01              movw R16,R30
 0012 3324              clr R3
 0014 462E              mov R4,R22
 0016 5524              clr R5
 0018 4224              eor R4,R2
 001A 5324              eor R5,R3
 001C 1201              movw R2,R4
 001E 4424              clr R4
 0020 37FC              sbrc R3,7
 0022 4094              com R4
 0024 5524              clr R5
 0026 47FC              sbrc R4,7
 0028 5094              com R5
 002A FE01              movw R30,R28
 002C 2082              std z+0,R2
 002E 3182              std z+1,R3
 0030 4282              std z+2,R4
 0032 5382              std z+3,R5
 0034                   .dbline 84
 0034 80E0              ldi R24,<_auchCRCHi
 0036 90E0              ldi R25,>_auchCRCHi
 0038 AF93              push R26
 003A BF93              push R27
 003C A081              ldd R26,z+0
 003E B181              ldd R27,z+1
 0040 FD01              movw R30,R26
 0042 BF91              pop R27
 0044 AF91              pop R26
 0046 E80F              add R30,R24
 0048 F91F              adc R31,R25
 004A E491              lpm R30,Z
 004C 642F              mov R22,R20
 004E 6E27              eor R22,R30
 0050                   .dbline 85
 0050 80E0              ldi R24,<_auchCRCLo
 0052 90E0              ldi R25,>_auchCRCLo
 0054 FE01              movw R30,R28
 0056 AF93              push R26
 0058 BF93              push R27
 005A A081              ldd R26,z+0
 005C B181              ldd R27,z+1
 005E FD01              movw R30,R26
 0060 BF91              pop R27
 0062 AF91              pop R26
 0064 E80F              add R30,R24
 0066 F91F              adc R31,R25
 0068 4491              lpm R20,Z
 006A                   .dbline 86
 006A           L3:
 006A                   .dbline 81
 006A           ;       uint32 uIndex ; /* CRC循环中的索引 */ 
 006A           ;       while (usDataLen--) /* 传输消息缓冲区 */ 
 006A 1901              movw R2,R18
 006C 2150              subi R18,1
 006E 3040              sbci R19,0
 0070 2220              tst R2
 0072 09F0              breq X1
 0074 CBCF              xjmp L2
 0076           X1:
 0076 3320              tst R3
 0078 09F0              breq X2
 007A C8CF              xjmp L2
 007C           X2:
 007C           X0:
 007C                   .dbline 87
 007C           ;       { 
 007C           ;               uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */ 
 007C           ;               uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
 007C           ;               uchCRCLo = auchCRCLo[uIndex] ; 
 007C           ;       } 
 007C           ;       return (uchCRCHi << 8 | uchCRCLo) ; 
 007C 042F              mov R16,R20
 007E 162F              mov R17,R22
 0080                   .dbline -2
 0080           L1:
 0080 2496              adiw R28,4
 0082 0E940000          xcall pop_gset2
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbsym r uchCRCLo 20 c
 0088                   .dbsym r uchCRCHi 22 c
 0088                   .dbsym l uIndex 0 l
 0088                   .dbsym r usDataLen 18 i
 0088                   .dbsym r puchMsg 16 pc
 0088                   .dbend
 0088                   .dbfunc e beginSend _beginSend fV
                        .even
 0088           _beginSend::
 0088                   .dbline -1
 0088                   .dbline 92
 0088           ; }//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
 0088           ; 
 0088           ; //开始发送
 0088           ; void beginSend(void)
 0088           ; {     
 0088                   .dbline 93
 0088           ;       sendEnable();   //设为发送
 0088 C79A              sbi 0x18,7
 008A                   .dbline 95
 008A           ;       
 008A           ;       sendPosi = 0;
 008A 2224              clr R2
 008C 20924300          sts _sendPosi,R2
 0090                   .dbline 96
 0090           ;       if(sendCount > 1)
 0090 81E0              ldi R24,1
 0092 20904500          lds R2,_sendCount
 0096 8215              cp R24,R2
 0098 20F4              brsh L6
 009A                   .dbline 97
 009A           ;               sendCount--;
 009A 822D              mov R24,R2
 009C 8150              subi R24,1
 009E 80934500          sts _sendCount,R24
 00A2           L6:
 00A2                   .dbline 98
 00A2           ;       UDR = sendBuf[0];
 00A2 20902300          lds R2,_sendBuf
 00A6 2CB8              out 0xc,R2
 00A8                   .dbline -2
 00A8                   .dbline 99
 00A8           ; }//void beginSend(void)
 00A8           L5:
 00A8                   .dbline 0 ; func end
 00A8 0895              ret
 00AA                   .dbend
 00AA                   .dbfunc e readCoil _readCoil fV
 00AA           ;         result -> <dead>
 00AA           ;        crcData -> R22,R23
 00AA           ;      byteCount -> R20
 00AA           ;              k -> R22
 00AA           ;           exit -> y+4
 00AA           ;           addr -> y+3
 00AA           ;       bitCount -> R10
 00AA           ;       position -> R12
 00AA           ;       tempData -> y+0
 00AA           ;       tempAddr -> y+2
 00AA           ;              i -> R14
                        .even
 00AA           _readCoil::
 00AA 0E940000          xcall push_gset5
 00AE 2597              sbiw R28,5
 00B0                   .dbline -1
 00B0                   .dbline 104
 00B0           ; 
 00B0           ; 
 00B0           ; //读线圈状态
 00B0           ; void readCoil(void)
 00B0           ; {
 00B0                   .dbline 114
 00B0           ;       uint8 addr;
 00B0           ;       uint8 tempAddr;
 00B0           ;       uint8 byteCount;
 00B0           ;       uint8 bitCount;
 00B0           ;       uint16 crcData;
 00B0           ;       uint8 position;
 00B0           ;       uint8 i,k;
 00B0           ;       uint8  result;
 00B0           ;       uint16 tempData;
 00B0           ;       uint8  exit = 0;
 00B0 0024              clr R0
 00B2 0C82              std y+4,R0
 00B4                   .dbline 118
 00B4           ;       
 00B4           ;       //addr = (receBuf[2]<<8) + receBuf[3];  
 00B4           ;       //tempAddr = addr & 0xfff;
 00B4           ;       addr = receBuf[3];
 00B4 20900600          lds R2,_receBuf+3
 00B8 2B82              std y+3,R2
 00BA                   .dbline 119
 00BA           ;       tempAddr = addr;
 00BA 022C              mov R0,R2
 00BC 0A82              std y+2,R0
 00BE                   .dbline 122
 00BE           ; 
 00BE           ;       //bitCount = (receBuf[4]<<8) + receBuf[5];      //读取的位个数
 00BE           ;       bitCount = receBuf[5];
 00BE A0900800          lds R10,_receBuf+5
 00C2                   .dbline 124
 00C2           ; 
 00C2           ;       byteCount = bitCount / 8;                                       //字节个数
 00C2 18E0              ldi R17,8
 00C4 0A2D              mov R16,R10
 00C6 0E940000          xcall div8u
 00CA 402F              mov R20,R16
 00CC                   .dbline 125
 00CC           ;       if(bitCount%8 != 0)
 00CC 18E0              ldi R17,8
 00CE 0A2D              mov R16,R10
 00D0 0E940000          xcall mod8u
 00D4 0023              tst R16
 00D6 09F0              breq L11
 00D8                   .dbline 126
 00D8           ;               byteCount++;
 00D8 4395              inc R20
 00DA           L11:
 00DA                   .dbline 128
 00DA           ;                                                                       
 00DA           ;       for(k=0;k<byteCount;k++)
 00DA 6627              clr R22
 00DC 37C0              xjmp L16
 00DE           L13:
 00DE                   .dbline 129
 00DE           ;       {//字节位置
 00DE                   .dbline 130
 00DE           ;               position = k + 3;
 00DE 862F              mov R24,R22
 00E0 8D5F              subi R24,253    ; addi 3
 00E2 C82E              mov R12,R24
 00E4                   .dbline 131
 00E4           ;               sendBuf[position] = 0;
 00E4 80E0              ldi R24,<_sendBuf
 00E6 90E0              ldi R25,>_sendBuf
 00E8 EC2D              mov R30,R12
 00EA FF27              clr R31
 00EC E80F              add R30,R24
 00EE F91F              adc R31,R25
 00F0 2224              clr R2
 00F2 2082              std z+0,R2
 00F4                   .dbline 132
 00F4           ;               for(i=0;i<8;i++)
 00F4 EE24              clr R14
 00F6 22C0              xjmp L20
 00F8           L17:
 00F8                   .dbline 133
 00F8           ;               {
 00F8                   .dbline 134
 00F8           ;                       getCoilVal(tempAddr,&tempData);
 00F8 9E01              movw R18,R28
 00FA 0A81              ldd R16,y+2
 00FC 1127              clr R17
 00FE 1FD2              xcall _getCoilVal
 0100                   .dbline 136
 0100           ;                       
 0100           ;                       sendBuf[position] |= tempData << i;
 0100 80E0              ldi R24,<_sendBuf
 0102 90E0              ldi R25,>_sendBuf
 0104 2C2C              mov R2,R12
 0106 3324              clr R3
 0108 280E              add R2,R24
 010A 391E              adc R3,R25
 010C 2E2D              mov R18,R14
 010E 3327              clr R19
 0110 0881              ldd R16,y+0
 0112 1981              ldd R17,y+1
 0114 0E940000          xcall lsl16
 0118 F101              movw R30,R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -