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

📄 zhu19200.lst

📁 动力环境监控系统 动力环境监控系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 299   1      	tempFlag1 = RamRom_Convert;
 300   1      	tempFlag0 = RamIO_Convert;		//保护地址状态
 301   1      	RamRom_Convert=1;			//128RAM
 302   1      	RamIO_Convert=1;//切换RAM与端口
 303   1      	TL1  = 0xFA;
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 6   

 304   1      	TH1  = 0x3C;
 305   1      	if( lockFlagDn )		//要求延时,枷锁
 306   1      	{
 307   2      		if( DelayCount++>=DelayNms )	//延时N个50ms
 308   2      		{
 309   3      			DelayCount=0;
 310   3      			lockFlagDn=0;
 311   3      		}	//延时时间解锁
 312   2      	}
 313   1      	else	DelayCount=0;
 314   1      	if( ReceConFlag )		//收到控制命令闪
 315   1      	{
 316   2      		if(ledcount2++>4)	//控制灯闪
 317   2      		{
 318   3      			led3Flag=!led3Flag;
 319   3      			ledcount2=0;
 320   3      		}
 321   2      		if(ledcount3++>15)	//闪灯八次
 322   2      		{
 323   3      			ledcount3=1;
 324   3      			ReceConFlag=0;
 325   3      		}
 326   2      	}
 327   1      	else	ledcount2=0;
 328   1      
 329   1      	if(ledcount0++>4)	//运行灯闪
 330   1      	{
 331   2      		led1Flag=!led1Flag;
 332   2      		ledcount0=0;
 333   2      	}
 334   1      	if(ledcount1++>1)	//通信灯灭
 335   1      	{
 336   2      		led2Flag=1;
 337   2      		ledcount1=0;
 338   2      	}
 339   1      	if(ZhengChCount++>1105*ZhengChJianGe)	//曲线历史记录定时*20*60
 340   1      	{
 341   2      		ZhengChFlag = 1;		//保存正常历史记录间隔为10分钟)
 342   2      		ZhengChCount = 0;		//,测试为1分钟(768/6/24=5.3天
 343   2      	}
 344   1      	if( NoReceFlag == 1 )	//20分钟没收发送数据,保存20*60*10=12000
 345   1      	{			//256/2/24=5.3天,测试为2分钟
 346   2      		if ( ReBaudCount++ > 1105*DuanKaiJianGe )//56次就一分钟了
 347   2      		{
 348   3      			ReBaudCount = 0;
 349   3      			ReBaudFlag = 1;		//保存断开历史记录
 350   3      		}
 351   2      	}
 352   1      	else	ReBaudCount=0;
 353   1      	if(KuaiShFlag)		//测试512坏,控制灯快闪
 354   1      	{
 355   2      		led3Flag=!led3Flag;
 356   2      		if(led3Kuai++>150)
 357   2      		{
 358   3      			led3Kuai=0;
 359   3      			KuaiShFlag=0;
 360   3      			led3Flag=1;	//闪灯后灭
 361   3      		}
 362   2      	}
 363   1      	if(ManShFlag)		//测试512好,控制灯慢闪
 364   1      	{
 365   2      		led3Man++;
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 7   

 366   2      		if(led3Man%10==0)
 367   2      		{
 368   3      			led3Flag=!led3Flag;
 369   3      			if(led3Man>150)
 370   3      			{
 371   4      				led3Man=0;
 372   4      				ManShFlag=0;
 373   4      				led3Flag=1;	//闪灯后灭
 374   4      			}
 375   3      		}
 376   2      	}
 377   1      	NoReceFlag = 1;	//在外部中断函数里清零,定时器中断函数置一;
 378   1      			//不进外部中断发送状态,不发标准位就一直为一
 379   1      	ledled=AddLed;
 380   1      	RamRom_Convert= tempFlag1;
 381   1      	RamIO_Convert = tempFlag0;	//恢复地址状态
 382   1      }
 383          
 384          void InterruptS() interrupt 4 using 3	//串口中断
 385          {
 386   1      	uchar data ReceByte;	//不对端口操作,不用保护端口状态
 387   1      	bit tempFlag0,tempFlag1;
 388   1      	tempFlag1 = RamRom_Convert;
 389   1      	tempFlag0 = RamIO_Convert;	//保护地址状态
 390   1      	RamRom_Convert=1;		//128RAM
 391   1      	RamIO_Convert=1;		//切换RAM与端口
 392   1      	if( RI )		//接收状态
 393   1      	{
 394   2      		RI=0;
 395   2      		ReceByte=SBUF;
 396   2      		if ( ReceCount0 >= MaxRece0-1 )	//最大接收缓冲区
 397   2      		{
 398   3      			ReceCount0 = 0;
 399   3      		}
 400   2      		else if ( ReceByte != 0x0D )
 401   2      		{
 402   3      			ReceSbuf0[ReceCount0++]=ReceByte;
 403   3      		}
 404   2      		else
 405   2      		{
 406   3      			ReceSbuf0[ReceCount0++]=ReceByte;
 407   3      			ReceEndFlag0=1;
 408   3      		}
 409   2      	}
 410   1      	else		//发送状态
 411   1      	{
 412   2      		TI=0;
 413   2      		if ( SendCount0 >= MaxSend0-1 )	//发送缓冲区要越界,结束发送
 414   2      		{
 415   3      			SendCount0 = 0;		//发完一包数据
 416   3      			TB8=1;			//发送完,以便下次发送地址
 417   3      		}
 418   2      		else if ( SendSbuf0[SendCount0] != 0x0A )
 419   2      		{
 420   3      			_nop_();
 421   3      			SBUF=SendSbuf0[SendCount0++];
 422   3      			TB8=0;
 423   3      		}
 424   2      		else
 425   2      		{                             	//发完一包数据
 426   3      			TB8=1;			//发送完,以便下次发送地址
 427   3      		}
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 8   

 428   2      	}
 429   1      	RamRom_Convert= tempFlag1;
 430   1      	RamIO_Convert = tempFlag0;	//恢复地址状态
 431   1      }
 432          void Analyse0()		//下行通信解析函数
 433          {
 434   1      	uint i,ReceCheck,SumCheck;//,broadid;
 435   1      	uint length = 0;
 436   1      	ReceEndFlag0 = 0;	//结束完标志位清零
 437   1      	lockFlagDn = 0;		//开锁
 438   1      	for( i = 0;i < MaxRece0;i++ )		//计算包长度
 439   1      	{
 440   2      		if( ReceSbuf0[i] == '\r')
 441   2      		{
 442   3      			length = i + 1;	//数据包长度
 443   3      			break;
 444   3      		}
 445   2      	}
 446   1      	if( length < 10)	//无效数据包
 447   1      	{
 448   2      		ReceCount0=0;	//串口0接收计数器清零
 449   2      		return;
 450   2      	}
 451   1      	SumCheck=CrcCheck( ReceSbuf0,length-5 );//crc读取
 452   1      	ReceCheck=4096 * toint(ReceSbuf0[length-5]) + 256*toint(ReceSbuf0[length-4]) + 16*toint(ReceSbuf0[length-
             -3]) + toint(ReceSbuf0[length-2]);
 453   1      	if( SumCheck != ReceCheck)	//crc校验
 454   1      	{
 455   2      		return;
 456   2      	}
 457   1      	ReceCheck = 4096*toint(ReceSbuf0[3]) + 256*toint(ReceSbuf0[4]) + 16*toint(ReceSbuf0[5]) + toint(ReceSbuf0
             -[6]);
 458   1      	if(ReceCheck != length-12)	//长度校验
 459   1      	{
 460   2      		return;
 461   2      	}
 462   1      	ReceCheck = 16 * toint(ReceSbuf0[1]) + toint(ReceSbuf0[2]);
 463   1      	if(ReceCheck != RTdataAns)
 464   1      	{
 465   2      		return;	//非实时数据响应
 466   2      	}
 467   1      	switch( ReceSbuf0[0] )	//收到是那块从模块信息
 468   1      	{
 469   2      		case 0x1F://0:			//AIDI有AIDI量
 470   2      			FalseTime0 = 0;		//错误次数清零
 471   2      			memcpy( RealTimeData+6, ReceSbuf0+11, 44 );		//AI量
 472   2      			memcpy( RealTimeData+12+AIsum, ReceSbuf0+59, B00DI/2 );	//DI量
 473   2      			break;
 474   2      		case 0x1E://1:			//电池板只有AI量
 475   2      			FalseTime1 = 0;		//错误次数清零
 476   2      			memcpy( RealTimeData+50, ReceSbuf0+11, B11AI*4 );		//AI量
 477   2      			break;
 478   2      		case 0x1D://2:			//电池板只有AI量
 479   2      			FalseTime2 = 0;		//错误次数清零
 480   2      			memcpy( RealTimeData+178, ReceSbuf0+11, B22AI*4 );	//AI量
 481   2      			break;
 482   2      		case 0x1C://3:			//IP板
 483   2      			FalseTime3 = 0;		//错误次数清零
 484   2      			memcpy( RealTimeData+306, ReceSbuf0+11, B33AI*4 );		//AI量
 485   2      			memcpy( RealTimeData+12+AIsum+B00DI/2, ReceSbuf0+15+B33AI*4, B33DI/2 );	//DI量
 486   2      			break;
 487   2      		default :
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 9   

 488   2      			break;
 489   2      	}
 490   1      
 491   1      //2003.12.11;11:46 modify
 492   1      	RealTimeData[0]=0x38;				//AI标号
 493   1      	RealTimeData[1]=0x30;
 494   1      	hex2asc1(RealTimeData+2,75+B33AI);		//AI通道数
 495   1      	RealTimeData[AIsum+6]=0x38;			//DI标号
 496   1      	RealTimeData[AIsum+7]=0x31;
 497   1      	hex2asc1(RealTimeData+AIsum+8,(8+B33DI)/4);	//DI通道数,压缩
 498   1      
 499   1      	ReceCount0=0;	//串口0接收计数器清零
 500   1      }
 501          
 502          void Analyse1()
 503          {
 504   1      	uchar data j,i,data00;
 505   1      	uint  data kk,TemLen,kk0;
 506   1      	uchar  readID, state, length, ReceLen, typeCom,RTclock[6];
 507   1              uint SumCheck, ReceCheck;
 508   1      	ReceEndFlag1 = 0;
 509   1      	if( ReceSbuf1[0] != 0x7E )		//没有数据包头
 510   1      	{
 511   2      		memset( ReceSbuf1, 0, 50 );	//串口1接收缓冲区清零
 512   2      		ReceCount1 = 0;			//串口1接收计数器清零
 513   2      		return;
 514   2      	}
 515   1      	for( i = 0;i < MaxRece1;i++ )		//计算包长度
 516   1      	{
 517   2      		if( ReceSbuf1[i] == '\r')
 518   2      		{
 519   3      			length = i+1;
 520   3      			break;
 521   3      		}
 522   2      	}
 523   1      	if( length < 10 && length > 60 )	//无效数据包
 524   1      	{
 525   2      		memset( ReceSbuf1, 0, 40 );	//串口1接收缓冲区清零
 526   2      		ReceCount1 = 0;			//串口1接收计数器清零
 527   2      		return;
 528   2      	}
 529   1      	readID = toint( ReceSbuf1[5] ) * 16 + toint( ReceSbuf1[6] );
 530   1      	if( readID != Read_ID() )			//采集箱的ID号校验
 531   1      	{
 532   2      		memset( ReceSbuf1, 0, 50 );	//串口1接收缓冲区清零
 533   2      		ReceCount1 = 0;			//串口1接收计数器清零
 534   2      		return;
 535   2      	}
 536   1      	SendSbuf1[SendCount1++] = '\r';		//结束上次发送(最好发送)
 537   1      	SendSbuf1[SendCount1] = '\n';		//结束上次发送(结束发送)
 538   1      	state = 0;			//返回状态
 539   1      	if( ReceSbuf1[0] != 0x7E ) state = 1;	//起始符校验
 540   1      	if( ReceSbuf1[1] != VERh && ReceSbuf1[2] != VERl)
 541   1      	{					//版本号校验
 542   2      		state = 2;
 543   2      	}/*
 544   1      	if( ReceSbuf1[17] >0x31  ||  ReceSbuf1[19] >0x33 ||  ReceSbuf1[21] >0x32 ||  ReceSbuf1[23] >0x36 ||  Rece
             -Sbuf1[25] >0x36)
 545   1      	{					//日期时间
 546   1      		state = 10;			//日期时间错
 547   1      		return;
 548   1      	}*/
C51 COMPILER V6.02  ZHU19200                                                               07/05/2004 14:20:33 PAGE 10  

 549   1      	SumCheck=CrcCheck( ReceSbuf1+1,length-6 );	//计算CRC	//接收CRC
 550   1      	ReceCheck=4096 * toint( ReceSbuf1[length-5] )+256 * toint( ReceSbuf1[length-4] )+16 * toint( ReceSbuf1[le
             -ngth-3] )+toint( ReceSbuf1[length-2] );
 551   1      	if( SumCheck != ReceCheck ) state=5;	//crc校验
 552   1      	ReceLen = 0x10*toint( ReceSbuf1[13] ) + toint( ReceSbuf1[14] );
 553   1      	if(ReceLen != length-20)    state=4;	//数据块长度
 554   1      	typeCom = 16 * toint( ReceSbuf1[7] ) + toint( ReceSbuf1[8] );
 555   1      	TemLen = 0;
 556   1      	if(KaiJiShZhFlag)	//开机时钟校正
 557   1      	{
 558   2      		for(i = 0;i < 12;)	//更新时钟
 559   2      		{
 560   3      			RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
 561   3                              i+=2;
 562   3      		}
 563   2      		setup_write();		//设置实时时钟操作方式
 564   2      		clock_write(RTclock);	//修改时钟命令
 565   2      		KaiJiShZhFlag=0;
 566   2      	}
 567   1      	switch( typeCom )
 568   1      	{
 569   2      		case ResetCom:			//系统复位命令
 570   2      			typeCom = ResetAns;
 571   2      			TemLen = 20 + 12;
 572   2      			ResetAnsFlag = 1;	//复位标志位置一
 573   2      			break;
 574   2      		case ClockCom:	//时钟校正命令
 575   2      			typeCom = ClockAns;
 576   2      			TemLen = 20 + 12;
 577   2      			for(i = 0;i < 12;)	//更新时钟
 578   2      			{
 579   3      				RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
 580   3      				i+=2;
 581   3      			}
 582   2      			setup_write();		//设置实时时钟操作方式
 583   2      			clock_write(RTclock);	//修改时钟命令
 584   2      			for(i=0;i<6;i++)
 585   2      			{
 586   3      				RTclock[i]=0;
 587   3      			}
 588   2      			clock_read(RTclock);	//读修改后的时钟
 589   2      			for(i=0;i<6;i++)	//读取修改后的实时时钟
 590   2      			{
 591   3      				hex2asc0(ReceSbuf1+15+2*i,RTclock[i]);
 592   3      			}
 593   2      			break;
 594   2      		case BaudCom:			//串口设置命令
 595   2      			typeCom = BaudAns;
 596   2      			TemLen = 20 + 16;
 597   2      			for( i = 27;i < 31;i++)	//保存参数
 598   2      			{
 599   3      				SendSbuf1[i] = ReceSbuf1[i];

⌨️ 快捷键说明

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