?? 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 + -