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

📄 module.lst

📁 一个锅炉温度控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 228   3      			
 229   3      			if (EnablePID==1) {             /*由模块自身进行PID控制*/	
 230   4      				PID();
 231   4      				PIDFlag=0;
 232   4      				
 233   4      				/*=========================
              				临时:自加标志
              				=========================*/
 236   4      				TempPIDUINT++;
 237   4      				
 238   4      			}
 239   3      			
 240   3      			else if( EnablePID == 0 ){ 	        /*上位机给出控制量*/		
 241   4      				U=sPID.CalValue.sValue._UH+sPID.CalValue.sValue._UL/256.0;
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 5   

 242   4      				CheckU();
 243   4      				if ((U-Angle)>Sens) {
 244   5      					set_jdq_mode(2);
 245   5      					MotorDir =2;
 246   5      				}	/*正转*/
 247   4      				else if ((U-Angle)<-Sens) {
 248   5      					set_jdq_mode(1);
 249   5      					MotorDir =1;
 250   5      				}	/*反转*/	
 251   4      				else {
 252   5      					set_jdq_mode(0);
 253   5      					MotorDir = 0;
 254   5      				}   /*停转*/
 255   4      			}			
 256   3      			else if (EnablePID==2)  {              /*由上位机直接控制电机正反转*/
 257   4      				set_jdq_mode(sPID.ReceiveValue.sValue.CMod.MotorDirec);
 258   4      				MotorDir=sPID.ReceiveValue.sValue.CMod.MotorDirec;
 259   4      			}
 260   3      		}
 261   2      		UpdateData();  	                    /*所有参数发送上位机,为测试用总更新*/    
 262   2      		
 263   2      	/****===============****/	
 264   2              if((AutoFlag==0)&&(Angle>0)){  /***==电机反转至关闭==>手动 ==***/
 265   3      			set_jdq_mode(1);
 266   3                  MotorDir =1;    
 267   3      		}
 268   2      	/***===++倒计时差1分钟时开始报警,定时器1修改AlarmFlag ++===***/
 269   2      		if((AlarmFlag==1)&&(AutoFlag == 1)){
 270   3                 PinAlarm();
 271   3      		}
 272   2      				
 273   2      	}while(1);
 274   1      }
 275          
 276          /* 定时器0中断服务子程序,控制主程序计算温度和角度*/
 277          void timer0_int()  interrupt 1 using 1    
 278          {
 279   1      	EA=0;
 280   1      	TR0=0;
 281   1      	TempTimes++;
 282   1      	DispTtime++;
 283   1      	if(TempTimes >= 15)    /*1秒钟计算一次温度和角度*/
 284   1      	{
 285   2      		TempTimes = 0;
 286   2      		TempFlag=1;	
 287   2      	}
 288   1      	
 289   1      	if(DispTtime >= 46){   /*******++++++++++++++++++*******/
 290   2      		DispTtime = 0;
 291   2      		DispTFlag = TRUE;
 292   2      	}
 293   1      	
 294   1      	TH0=0;
 295   1      	TL0=0;/*定时周期65ms*/
 296   1          TR0=1;/*start timer*/
 297   1      	EA=1;
 298   1      	return;
 299   1      }
 300          
 301          /* 定时器1中断服务子程序,控制设定值*/
 302          void Timer1_int() interrupt 3 using 1
 303          {
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 6   

 304   1      	EA = 0;						/*关中断*/
 305   1      	TR1 = 0;					/*停止计数*/
 306   1      	if(SP_nCount >= 200){		/*每隔10s计数一次*/
 307   2      		if(abs(SP2-Rk) >= SPOneStepVal){
 308   3      			
 309   3      			if(SPOneStepValSign == 1){
 310   4      				SP_temp += SPOneStepVal;
 311   4      			}
 312   3      			else {
 313   4      				SP_temp -= SPOneStepVal;
 314   4      			}
 315   3      			
 316   3      			SP_nCount = 0;
 317   3      			Rk = SP_temp;
 318   3      		}					
 319   2      	
 320   2      		 /***+++++++++++++++++++++++***/ 
 321   2      	     AlarmTime++;
 322   2      	     if(SP1toSP2Time<=1)   /***倒计时差一分钟时报警***/
 323   2      	         AlarmFlag = 1;
 324   2      	}							
 325   1      	SP_nCount++;
 326   1      	
 327   1      	if((AlarmTime>=6)&&(SP1toSP2Time>0)){       /***过了一分钟***/
 328   2             SP1toSP2Time--;   /*设定值1到设定值2之间的时间减一*/           
 329   2             AlarmTime=0;
 330   2      	}
 331   1      	
 332   1      	TH1 = 0x3c;
 333   1      	TL1 = 0xaf;					/*定时周50ms*/
 334   1      	TR1 = 1;	
 335   1      	EA = 1;
 336   1      	return;
 337   1      }
 338          
 339          /* 定时器2中断服务子程序,控制计算PID*/
 340          void timer2_int() interrupt 5 using 1
 341          {
 342   1      	EA = 0;
 343   1      	TR2 = 0;				/*定时器2停止计数*/
 344   1      	TF2 = 0;				/*清除定时器2中断标志位,防止反复中断请求*/
 345   1      	PIDTimes++;
 346   1      	if(PIDTimes > (Ts*50))
 347   1      	{
 348   2      		PIDFlag = 1;		/*每个采样周期计算PID,定时周期为20ms,所以乘以50*/	
 349   2      		PIDTimes = 0;		
 350   2      	}
 351   1      	TR2 = 1;				/*定时器2开始计数*/
 352   1      	EA = 1;
 353   1      	return;
 354   1      }
 355          
 356          /*外部中断0 命令帧中断处理函数*/
 357          void sja_receive_int() interrupt 0 using 0
 358          {
 359   1      	BYTE i;
 360   1          BYTE reg;
 361   1      	BYTE can_status; 
 362   1      	BYTE xdata* psb;
 363   1      	EA = 0;
 364   1      	
 365   1      	reg=read_sja(4);
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 7   

 366   1      	write_sja(4,0x00);
 367   1      	can_status=receive();
 368   1      	read_sja(3);
 369   1      	
 370   1      	if(can_status==0x00){/* is command frame */
 371   2      		for(i=0;i<=10;i++){
 372   3      			TXdata[i]=RXdata[i];	
 373   3      		}
 374   2      		TXdata[1] += 0x40;
 375   2      		TXdata[2] += QD;
 376   2      		TXdata[3] += 0x40;/*封装返回帧头*/
 377   2      		
 378   2      		switch(RXdata[4]) {
 379   3      		case 0x02:/* 获取AD7703数据及室温数据 */
 380   3      			if(RXdata[3] >= 0x02)			
 381   3      				break;
 382   3      			TXdata[5] = ad_val_bk[RXdata[3]];
 383   3      			TXdata[6] = _iror_(ad_val_bk[RXdata[3]],8);
 384   3      			TXdata[7] = cool_temp_bk;
 385   3      			TXdata[8] = _iror_(cool_temp_bk,8);
 386   3      			btransmit();
 387   3      			break;
 388   3      			
 389   3      		case 0x04:  /*上位机向模块写ControlMod*/ 
 390   3      			sPID.ReceiveValue.sValue.CMod.Tsample = RXdata[10];
 391   3      			sPID.ReceiveValue.sValue.CMod.MotorDirec = RXdata[9];	  /*电机正反停转,0停1反2正*/
 392   3      			sPID.ReceiveValue.sValue.CMod.PIDNorP = RXdata[8];		 /*PID正作用P,1或负作用N,0*/
 393   3      			sPID.ReceiveValue.sValue.CMod.Feedback = RXdata[7];		 /*判断有无阀位反馈*/
 394   3      			sPID.ReceiveValue.sValue.CMod.PIDModel = RXdata[6];      /*不同PID选择*/
 395   3      			sPID.ReceiveValue.sValue.CMod.EnPID = RXdata[5]; /* PID开断 */
 396   3      			
 397   3      			TXdata[5]=4;
 398   3      			TXdata[6]=4;
 399   3      			TXdata[7]=4;
 400   3      			TXdata[8]=4;
 401   3      			TXdata[9]=4;
 402   3      			TXdata[10]=4;
 403   3      			DataFrame = 2;	/*设置标志,供Update_pid_para用*/
 404   3      			OnNewData = TRUE;
 405   3      			btransmit();
 406   3      			break;
 407   3      			
 408   3      		case 0x05:  /*上位机从模块读ControlMod*/ 
 409   3      			TXdata[10] = sPID.ReceiveValue.sValue.CMod.Tsample;
 410   3      			TXdata[9] = sPID.ReceiveValue.sValue.CMod.MotorDirec;	  /*电机正反停转,0停1反2正*/
 411   3      			TXdata[8] = sPID.ReceiveValue.sValue.CMod.PIDNorP;		  /*PID正作用P,1或负作用N,0*/
 412   3      			TXdata[7] = sPID.ReceiveValue.sValue.CMod.Feedback;			/*判断有无阀位反馈*/
 413   3      			TXdata[6] = sPID.ReceiveValue.sValue.CMod.PIDModel;      /*不同PID选择*/
 414   3      			TXdata[5] = sPID.ReceiveValue.sValue.CMod.EnPID;         /* PID开断 */
 415   3      			btransmit();
 416   3      			break;
 417   3      			
 418   3      		case 0x20:/* 上位机向模块写命令   一帧一帧数据发送*/
 419   3      			i=RXdata[3];
 420   3      			if ((i>=0)&&(i<=1)) {
 421   4      
 422   4      				save_pid(i,RXdata+5);
 423   4      				DataFrame=i;
 424   4      				OnNewData = TRUE; 
 425   4      				TXdata[5] = 1;     	/*发送成功消息给上位机*/
 426   4      				btransmit();
 427   4      			}
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 8   

 428   3      			else {
 429   4      			    TXdata[5] = 0;   /*发送出错消息给上位机*/
 430   4      				TXdata[6] = i;  /*丢失的帧号*/
 431   4      				btransmit();		
 432   4      			}
 433   3      			break;
 434   3      
 435   3      			
 436   3      			
 437   3      			
 438   3      /*========================================================================
              							临时:测试用
                =======================================================================*/
 441   3      		case 0x08:
 442   3      			TXdata[6] = TempPIDUINT;
 443   3      			TXdata[5] = TempPIDUINT >> 8;
 444   3      			
 445   3      			/*测试temp值*/
 446   3      
 447   3      			TXdata[10] = Ek;
 448   3      			TXdata[9] = Ek >> 8;
 449   3      			TXdata[8] = Ek >> 16;
 450   3      			TXdata[7] = Ek >> 24;
 451   3      					
 452   3      			btransmit();
 453   3      			delay(4);
 454   3      			break;
 455   3      		
 456   3      			
 457   3      
 458   3      
 459   3      		case 0x21:/* 上位机向模块读命令  一帧一帧数据接收*/
 460   3      			psb = sPID.SendValue.bValue;
 461   3      			if  ((RXdata[3]>=0)&&(RXdata[3]<=2)) {				

⌨️ 快捷键说明

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