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

📄 pcckmodbus.src

📁 lpc932芯片 用于modbus通讯的范例
💻 SRC
📖 第 1 页 / 共 3 页
字号:
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 + -