📄 pcckmodbus.src
字号:
L?0067:
USING 0
MOV R3,#01H
MOV R7,#040H
_IRcvByte:
USING 0
; SOURCE LINE # 224
;---- Variable 'c?449' assigned to Register 'R1/R2/R3' ----
;---- Variable 'sla?448' assigned to Register 'R7' ----
; {
; SOURCE LINE # 225
; GetBus(); /*启动总线*/
; SOURCE LINE # 226
LCALL GetBus
; SendByte(sla+1); /*发送器件地址*/
; SOURCE LINE # 227
MOV A,R7
INC A
MOV R7,A
LCALL _SendByte
; if(I2STAT!=0X40){I2CON=0XD5;return(0);}
; SOURCE LINE # 228
MOV A,I2STAT
XRL A,#040H
JZ ?C0017
SJMP ?C0063
?C0017:
; I2CON=0XC1; /*接收一字节数据即发送非应答位*/
; SOURCE LINE # 229
MOV I2CON,#0C1H
?C0019:
; while(SI==0); /*等待接收数据*/
; SOURCE LINE # 230
JNB SI,?C0019
?C0020:
; if(I2STAT!=0X58){I2CON=0XD5;return(0);}
; SOURCE LINE # 231
MOV A,I2STAT
XRL A,#058H
JZ ?C0021
?C0063:
MOV I2CON,#0D5H
CLR C
RET
?C0021:
; *c=I2DAT; /*读取数据*/
; SOURCE LINE # 232
MOV A,I2DAT
LCALL ?C?CSTPTR
; I2CON=0XD5; /*结束总线*/
; SOURCE LINE # 233
MOV I2CON,#0D5H
; return(1);
; SOURCE LINE # 234
SETB C
; } /*******************************************************************
; SOURCE LINE # 235
?C0018:
RET
; END OF _IRcvByte
; 向有子地址器件读取多字节数据函数
; 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
; 功能: 从启动总线到发送地址子地址,读数据结束总线的全过程,从器件
; 地址sla 子地址suba 读出的内容放入s 指向的存储区读no 个字节
; 如果返回1 表示操作成功否则操作有误
; ********************************************************************/
; bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
RSEG ?PR?_IRcvStr?PCCKMODBUS
_IRcvStr:
USING 0
; SOURCE LINE # 242
;---- Variable 'sla?550' assigned to Register 'R6' ----
XCH A,R6
MOV A,R7
XCH A,R6
;---- Variable 's?552' assigned to Register 'R1/R2/R3' ----
;---- Variable 'suba?551' assigned to Register 'R5' ----
; {
; SOURCE LINE # 243
; uchar i;
; GetBus(); /*启动总线*/
; SOURCE LINE # 245
LCALL GetBus
; SendByte(sla); /*发送器件地址*/
; SOURCE LINE # 246
LCALL _SendByte
; if(I2STAT!=0X18){I2CON=0XD5;return(0);}
; SOURCE LINE # 247
MOV A,I2STAT
XRL A,#018H
JZ ?C0022
SJMP ?C0066
?C0022:
; SendByte(suba); /*发送器件子地址*/
; SOURCE LINE # 248
XCH A,R7
MOV A,R5
XCH A,R7
LCALL _SendByte
; if(I2STAT!=0X28){I2CON=0XD5;return(0);}
; SOURCE LINE # 249
MOV A,I2STAT
XRL A,#028H
JZ ?C0024
?C0064:
SJMP ?C0066
?C0024:
; I2CON=0XE5; /*重新启动总线*/
; SOURCE LINE # 250
MOV I2CON,#0E5H
?C0025:
; while(SI==0);
; SOURCE LINE # 251
JNB SI,?C0025
?C0026:
; SendByte(sla+1);
; SOURCE LINE # 252
MOV A,R6
INC A
MOV R7,A
LCALL _SendByte
; if(I2STAT!=0X40){I2CON=0XD5;return(0);}
; SOURCE LINE # 253
MOV A,I2STAT
XRL A,#040H
JZ ?C0027
?C0065:
SJMP ?C0066
?C0027:
; for(i=0;i<no-1;i++)
; SOURCE LINE # 254
;---- Variable 'i?554' assigned to Register 'R7' ----
CLR A
MOV R7,A
?C0028:
MOV DPTR,#no?553
MOVX A,@DPTR
DEC A
MOV R6,A
MOV A,R7
CLR C
SUBB A,R6
JNC ?C0029
; {
; SOURCE LINE # 255
; I2CON=0XC5; /*接收一字节数据并发送应答位*/
; SOURCE LINE # 256
MOV I2CON,#0C5H
?C0031:
; while(SI==0); /*等待接收数据*/
; SOURCE LINE # 257
JNB SI,?C0031
?C0032:
; if(I2STAT!=0X50){I2CON=0XD5;return(0);}
; SOURCE LINE # 258
MOV A,I2STAT
XRL A,#050H
JZ ?C0033
?C0066:
MOV I2CON,#0D5H
CLR C
RET
?C0033:
; *s=I2DAT; /*读取数据*/
; SOURCE LINE # 259
MOV A,I2DAT
LCALL ?C?CSTPTR
; s++;
; SOURCE LINE # 260
MOV A,#01H
ADD A,R1
MOV R1,A
CLR A
ADDC A,R2
MOV R2,A
; }
; SOURCE LINE # 261
INC R7
SJMP ?C0028
?C0029:
; I2CON=0XC1; /*接收最后一字节数据并发送非应答位*/
; SOURCE LINE # 262
MOV I2CON,#0C1H
?C0034:
; while(SI==0);
; SOURCE LINE # 263
JNB SI,?C0034
?C0035:
; *s=I2DAT;
; SOURCE LINE # 264
MOV A,I2DAT
LCALL ?C?CSTPTR
; I2CON=0XD5; /*结束总线*/
; SOURCE LINE # 265
MOV I2CON,#0D5H
; return(1);
; SOURCE LINE # 266
SETB C
; }
; SOURCE LINE # 267
?C0023:
RET
; END OF _IRcvStr
; /*C51 软件包应用实例
; #include <668I2C.h> /*软件包头文件的包含*/
; //#include <REG668.H>
; /********************************************************************
; 读CSI24WC02 函数
; 原型: void Read_S24();
; 功能:读取24WC02 上指定子地址的内容,并在LED 上显示出来使用前起动总线
; 发出读PCF8574 地址
; ********************************************************************/
; void Read_S24()
RSEG ?PR?Read_S24?PCCKMODBUS
Read_S24:
USING 0
; SOURCE LINE # 277
; {
; SOURCE LINE # 278
?C0036:
; uchar dat,addr;
; while(1)
; SOURCE LINE # 280
; {
; SOURCE LINE # 281
; IRcvByte(PCF8574,&addr); /*读I/O 口的数据作地址*/
; SOURCE LINE # 282
MOV R2,#HIGH (addr?656)
MOV R1,#LOW (addr?656)
LCALL L?0067
; IRcvStr(CSI24WCXX,addr,&dat,1); /*读CSI24WCXX 指定地址上的数据*/
; SOURCE LINE # 283
MOV DPTR,#addr?656
MOVX A,@DPTR
MOV R5,A
MOV R2,#HIGH (dat?655)
DEC R1
MOV DPTR,#?_IRcvStr?BYTE+05H
MOV A,#01H
MOVX @DPTR,A
MOV R7,#0A0H
LCALL _IRcvStr
; // Disp_SAA1064(chg_tab[addr>>4],1); /*将地址,数据进行显示*/
; // Disp_SAA1064(chg_tab[addr&0x0f],2);
; // Disp_SAA1064(chg_tab[dat>>4],3);
; // Disp_SAA1064(chg_tab[dat&0x0f],4);
; }
; SOURCE LINE # 288
SJMP ?C0036
; END OF Read_S24
; }
; /********************************************************************
; 写CSI24WC02 函数
; 原型: void Write_S24();
; 功能: 顺序写24WC02 上指定子地址的内容,并在LED 上显示当前地址使
; 用前起动总线发出读PCF8574 地址
; ********************************************************************/
; void Write_S24()
RSEG ?PR?Write_S24?PCCKMODBUS
Write_S24:
USING 0
; SOURCE LINE # 296
; {
; SOURCE LINE # 297
; uchar adr_cnt,dat,dat_bak;
; adr_cnt=0;dat_bak=0;
; SOURCE LINE # 299
;---- Variable 'adr_cnt?757' assigned to Register 'R4' ----
CLR A
MOV R4,A
MOV DPTR,#dat_bak?759
MOVX @DPTR,A
; while(1)
; SOURCE LINE # 300
; { while(dat==dat_bak)
; SOURCE LINE # 301
?C0041:
MOV DPTR,#dat_bak?759
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#dat?758
MOVX A,@DPTR
XRL A,R7
JNZ ?C0042
; //.............
; IRcvByte(PCF8574,&dat); /*读取数据*/
; SOURCE LINE # 303
MOV R2,#HIGH (dat?758)
MOV R1,#LOW (dat?758)
LCALL L?0067
SJMP ?C0041
?C0042:
; //.................
; ISendStr(CSI24WCXX,adr_cnt,&dat,1); /*进行写操作*/
; SOURCE LINE # 305
XCH A,R5
MOV A,R4
XCH A,R5
MOV R3,#01H
MOV R2,#HIGH (dat?758)
MOV R1,#LOW (dat?758)
MOV DPTR,#?_ISendStr?BYTE+05H
MOV A,#01H
MOVX @DPTR,A
MOV R7,#0A0H
LCALL _ISendStr
; adr_cnt++; /*地址计数器加1*/
; SOURCE LINE # 306
INC R4
; }
; SOURCE LINE # 307
SJMP ?C0041
; END OF Write_S24
; }
; /********************************************************************
; PCF8574 的IO 测试函数
; 原型: void Test_IO();
; 功能: 读取24WC02 上指定子地址的内容,并在LED 口上显示出来
; ********************************************************************/
; void Test_IO()
RSEG ?PR?Test_IO?PCCKMODBUS
Test_IO:
USING 0
; SOURCE LINE # 314
; {
; SOURCE LINE # 315
?C0044:
; uchar i;
; while(1)
; SOURCE LINE # 317
; {
; SOURCE LINE # 318
; /* 读I/O 口 */
; IRcvByte(PCF8574,&i);
; SOURCE LINE # 320
MOV R3,#01H
MOV R2,#HIGH (i?860)
MOV R1,#LOW (i?860)
MOV R7,#040H
LCALL _IRcvByte
; // Disp_SAA1064(chg_tab[i>>4],2); /*显示高4 位输入值*/
; // Disp_SAA1064(chg_tab[i&0x0f],4); /*显示低4 位输入值*/
; // for(i=0;i<254;i++);
; // }
; }
; SOURCE LINE # 325
SJMP ?C0044
; END OF Test_IO
; }
;
; /*void main()
; {
; uchar com;
; SCL 0
; SDA 1
; if(SDA==0)I2cErr() ; //SCL SDA 短路或SDA 被锁为低
; SCL=1;
; if(SCL==0)I2cErr() ; //SCL 被锁为低,I2cErr()函数由用户编写
; ETI 1 //开定时器I 中断
; EA 1
; Scan_led();
; //读I/O 口,分析命令
; IRcvByte(PCF8574,&com);
; switch(com)
; {
; case 0x00: Write_S24();
; break;
; case 0xff: Read_S24();
; break;
; default : Test_IO();
; }
; } */
; /*特述应用
; 对比较特殊的器件操作如24WC256 它的子地址是16 位的而平台只提供8 位器件子地址这种
; 情况该如何对它进行操作
; 现行地址读/写直接调用IRcvByte 和 IsendByte 函数即可
; 1. 随机地址读步骤
; (1) 先写入16 位地址
; uchar xxl=*;
; …
; IsendStr(CSI24WC256,xxh,&xxl,1) */
; /*把子地址低8 位放在xxl*/
; /*对指定存储单元进行写,16 位子地址*/
; //(2) 读入字节数据
;
; //IrcvByte(CSI24WC256,&retdat); /*读取一个字节*/
; /*若要连续读N 个字节只能用循环单字节读出”它会顺序读不能用IRcvStr */
; //2. 随机地址写
; //子地址的低8 位放在发送区的开头后面的是数据即可调用ISendStr
; /*归一化子函数接口
; bit IRcvByte(uchar sla,uchar *c) 立即地址读单字节数据(定义uchar 为unsigned char,以下相同)
; 参数sla 器件从地址
; *c 接收数据变量的指针
; 返回位1 表示操作正确
; bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) 随机地址读多字节数据
; 参数sla 器件从地址
; suba 器件子地址随机地
; *s 接收区指针
; no 字节数
; 返回位1 表示操作正确
; bit ISendByte(uchar sla,uchar c) 无子地址写单字节数据
; 参数sla 器件从地址
; c 将要写入的数据
; 返回位1 表示操作正确
; bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) 随机地址写多字节数据
; 参数sla 器件从地址
; suba 器件子地址随机地
; *s 发送区指针依次存着要写入的数据
; no 字节数
; 返回位1 表示操作正确
; 系统工作主频不要高于12MHz
; 系统启动时最好检查一总线是否正常
; SCL 0
; SDA 1
; if(SDA==0)I2cErr();
; //SCL SDA 短路或SDA 被锁为低.
; SCL=1;
; if(SCL==0)I2cErr();
; //SCL 被锁为低,I2cErr()函数由用户编写
; 软件包的使用把668I2C.H 复制到C51 设定的头文件路径下把668I2C.LIB 复制到C51 设定的库连
; 接路径下在你的程序的开头#include <668I2C.H>,连接时加入668I2C.LIB 即可
; void GetBus()
; {
; {
; I2DAT=c; */
; //-------------------------------------------------------
; unsigned int CRC16(unsigned char xdata *puchMsg,unsigned char usDataLen)
RSEG ?PR?_CRC16?PCCKMODBUS
_CRC16:
USING 0
; SOURCE LINE # 404
MOV DPTR,#usDataLen?962
MOV A,R5
MOVX @DPTR,A
;---- Variable 'puchMsg?961' assigned to Register 'R6/R7' ----
; //unsigned char *puchMsg ;/* 要进行CRC校验的消息 */
; //unsigned short usDataLen ; /* 消息中字节数 */
; {
; SOURCE LINE # 407
; unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
; SOURCE LINE # 408
;---- Variable 'uchCRCHi?963' assigned to Register 'R5' ----
MOV R5,#0FFH
; unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
; SOURCE LINE # 409
;---- Variable 'uchCRCLo?964' assigned to Register 'R4' ----
MOV R4,#0FFH
?C0047:
; unsigned char uIndex ; /* CRC循环中的索引 */
; while (usDataLen--) /* 传输消息缓冲区 */
; SOURCE LINE # 411
MOV DPTR,#usDataLen?962
MOVX A,@DPTR
MOV R3,A
DEC A
MOVX @DPTR,A
MOV A,R3
JZ ?C0048
; {
; SOURCE LINE # 412
; uIndex = uchCRCHi ^ *puchMsg ; /* 计算CRC */
; SOURCE LINE # 413
MOV DPL,R7
MOV DPH,R6
MOVX A,@DPTR
XRL A,R5
;---- Variable 'uIndex?965' assigned to Register 'R1' ----
MOV R1,A
; puchMsg++;
; SOURCE LINE # 414
INC R7
CJNE R7,#00H,?C0057
INC R6
?C0057:
; uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
; SOURCE LINE # 415
MOV A,R1
MOV DPTR,#auchCRCHi
MOVC A,@A+DPTR
XRL A,R4
MOV R5,A
; uchCRCLo = auchCRCLo[uIndex];
; SOURCE LINE # 416
MOV A,R1
MOV DPTR,#auchCRCLo
MOVC A,@A+DPTR
MOV R4,A
; }
; SOURCE LINE # 417
SJMP ?C0047
?C0048:
; return (uchCRCHi *256 | uchCRCLo);
; SOURCE LINE # 418
MOV A,R5
MOV R6,A
XCH A,R5
MOV A,R4
XCH A,R5
MOV A,R5
MOV R7,A
; }
; SOURCE LINE # 419
?C0049:
RET
; END OF _CRC16
; /***************************/
; /*unsigned int crc(unsigned char xdata *p,unsigned char crc_len)
; {
; unsigned int a,b;
; unsigned char i,j;
; a=0xffff;
; for(i=0;i<crc_len;i++)
; {
; b=*p;
; a=a^b;
; for(j=0;j<8;j++)
; {
; if ((a&0x01)==0)
; {
; a=a/2;
; }
; else
; {
; a=a/2;
; a=a^0xa001;
; }
; }
; p++;
; }
; return(a);
; }*/ /*
; void chush0()
; {
; #pragma asm
; ANL SSTAT,#0FAH //; clr the BR, it is SSTAT.2
; MOV BRGCON,#00H
;
; ORL AUXR1,#40H // ; setb the EBRR
; MOV SCON,#50H // ; setup UART mode 1, enables serial reception.
; MOV BRGR1,#90H
; MOV BRGR0,#00H
; MOV BRGCON,#03H // ; Baud Rate Generator Enable.
;
; #pragma ENDASM
; } */
; //=============================================================================
; void main()
RSEG ?PR?main?PCCKMODBUS
main:
USING 0
; SOURCE LINE # 461
; {
; SOURCE LINE # 462
; unsigned int i,j;
;
; IEN0=0;
; SOURCE LINE # 465
CLR A
MOV IEN0,A
; SSTAT=SSTAT&0xfa; //; clr the BR, it is SSTAT.2
; SOURCE LINE # 466
ANL SSTAT,#0FAH
; BRGCON=0;
; SOURCE LINE # 467
MOV BRGCON,A
; AUXR1=AUXR1 | 0x40; // ; setb the EBRR
; SOURCE LINE # 468
ORL AUXR1,#040H
; SCON=0x50; // ; setup UART mode 1, enables serial reception.
; SOURCE LINE # 469
MOV SCON,#050H
; BRGR1=0x90;
; SOURCE LINE # 470
MOV BRGR1,#090H
; BRGR0=0x00;
; SOURCE LINE # 471
MOV BRGR0,A
; BRGCON=0x03; // ; Baud Rate Generator Enable.
; SOURCE LINE # 472
MOV BRGCON,#03H
;
; if (sipm==0)
; SOURCE LINE # 474
JB sipm,?C0051
; {
; SOURCE LINE # 475
; // Pc=00;
; #pragma asm
; JMP 0000 ; endless loop
JMP 0000 ; endless loop
; #pragma endasm
; }
; SOURCE LINE # 480
?C0051:
; //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; while(1)
; SOURCE LINE # 482
; {
; SOURCE LINE # 483
; for (i=0;i<=0x0fff;i++)
; SOURCE LINE # 484
;---- Variable 'i?1066' assigned to Register 'R6/R7' ----
CLR A
MOV R7,A
MOV R6,A
?C0053:
; {
; SOURCE LINE # 485
; j++;
; SOURCE LINE # 486
MOV DPTR,#j?1067
CLR A
MOV B,#01H
LCALL ?C?IILDX
; }
; SOURCE LINE # 487
INC R7
CJNE R7,#00H,?C0058
INC R6
?C0058:
MOV A,R7
JNZ ?C0059
MOV A,R6
XRL A,#010H
?C0059:
JNZ ?C0053
?C0054:
;
; led1=led1 ^ 1;
; SOURCE LINE # 489
MOV C,led1
CPL C
MOV led1,C
;
; }
; SOURCE LINE # 491
SJMP ?C0051
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -