📄 module.lst
字号:
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 + -