📄 p87lpc764+万能遥控调光调速器.lst
字号:
254 2 if(Key==0){
255 3 KeyDown=1; /*键已按下*/
256 3 AGE++; /*按键年龄增长*/
257 3 if(NO_R_SW){ /*不是遥控开关,才能设置为持续方式*/
258 4 if(AGE>=30){
259 5 CONTI=1;
260 5 goto retu;
261 5 }/*按下按键超过0.3s,为持续方式*/
262 4 }
263 3 else{/*开关模式下,按下2.5s 进行红外学习*/
264 4 if(AGE==50) SwStyTime++;
265 4 if(SwStyTime==6){
266 5 SwStyTime=0;
267 5 CONTI=1;
268 5 DownTimes=2;
269 5 IKCLK=120;
270 5 goto retu;
271 5 }
272 4 }
273 3 }
274 2 else{
275 3 if(KeyDown==1 && AGE>=3 && AGE<=30){
276 4 DownTimes++;
277 4 if(!NO_R_SW) IKCLK=120; /*是遥控开关,立即执行功能*/
278 4 }
279 3 KeyDown=0; /*键已释放*/
280 3 AGE=0; /*按键弹起时,清除年龄*/
281 3 SwStyTime=0;
282 3 CONTI=0; /*清除持续标志*/
283 3 }
284 2 }
285 1 if(Key==1) CONTI=0; /*键已释放,清除持续标志*/
286 1 retu:;
287 1 }
288 /*主程序*/
289 main()
290 {
291 1 WDFeed(); /*清看门狗*/
292 1 WDCON=0X16; /*设置看门狗*/
293 1 /*初始化比较器,用于过零检测,Vref=5V*/
294 1 CMP1 &= 0xFE; /*清比较器中断标志*/
295 1 PT0AD=0X30; /* 禁止CN1A,CMPREF 作为数字输入口 */
296 1 P0M2 &= 0XCF; /* 禁止CN1A,CMPREF 作为数字输出口*/
297 1 P0M1 |= 0X30; /*开放比较器功能*/
298 1 CMP1=0X24; /*CHN1A 作为比较器正输入端,CMPREF 为参考电压,比较结果送CMP1*/
299 1 Delay(1); /*延时1ms*/
300 1 CMP1 &= 0xFE; /*清比较器1 中断标志*/
301 1 EC1=1;/*使能比较器一中断*/
302 1 /*设置定时器*/
303 1 TMOD=0X11; /*定时器0,1 方式1*/
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 6
304 1 IT1=1; /*外部中断1 为边沿触发方式*/
305 1 EX1=1;
306 1 Led=0; /*LED ON*/
307 1 Calc_MaxFireAngle(); /*计算半周期对应的定时器值*/
308 1 Write_MaxFireAngle();
309 1 IP1H=0X20; /*比较器1 中断最高优先级*/
310 1 ReadEE(0,50,Buf);
311 1 Read_Last_FireAngle(); /*从存储器中读出上一次的速度(亮度)值*/
312 1 Fire_Angle=Last_FireAngle;
313 1 EA =1; /*开中断*/
314 1 do{
315 2
316 2 WDFeed(); /*清看门狗*/
317 2 ReadEE(0,50,Buf); /*循环读出,加强抗干扰能力*/
318 2 Read_MaxFireAngle();
319 2 if(Task_Ovr==1) Task_10ms();
320 2 if(FuncSet==1) FuncHandle();
321 2 }while(1);
322 1 }
323 /*任务处理,由电压过零激活*/
324 void Task_10ms()
325 {
326 1 if(KeyStart==0 && Key==0){/*检测键处理周期中的第一次按键*/
327 2 AGE=0; /*清除按键年龄*/
328 2 IKCLK=0; /*清除识别计时器*/
329 2 DownTimes=0; /*清除击键次数*/
330 2 KeyStart=1; /*开始进行按键处理*/
331 2 }
332 1 if(IKCLK<100) goto Remote;/*未完,等待下一次任务*/
333 1 if(CONTI==0) /*识别时间完,设置功能代码*/
334 1 FuncCode=DownTimes;
335 1 else
336 1 FuncCode=DownTimes+4;
337 1 FuncSet=1; /*允许进行功能处理*/
338 1 IKCLK=0;
339 1 DownTimes=0;
340 1 KeyStart=0; /*关闭按键处理*/
341 1 goto Task_Ret;
342 1 Remote:
343 1 if(IRCLK<100) goto Task_Ret;
344 1 IRCLK=0;
345 1 if(CONTI_R){
346 2 if(RKeySt1) FuncCode=4;
347 2 else if(RKeySt2) FuncCode=5;
348 2 else FuncCode=0;
349 2 }
350 1
351 1
352 1 else{
353 2 if(RKeySt1) FuncCode=1;
354 2 else if(RKeySt2) FuncCode=2;
355 2 else FuncCode=0;
356 2 }
357 1 RKeySt1=0; /*清除状态*/
358 1 RKeySt2=0;
359 1 RmtStart=0;
360 1 FuncSet=1; /*允许进行功能处理*/
361 1 Task_Ret:
362 1 Task_Ovr=0; /*清任务进程标志*/
363 1 }
364 void FuncHandle()
365 {
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 7
366 1 unsigned char data i;
367 1 switch(FuncCode){
368 2 case 1: /*点击一次*/
369 2 if(!NO_R_SW){ /*遥控开关*/
370 3 if(ON){
371 4 ON=0;
372 4 Led=0;
373 4 SW=1;
374 4 }
375 3 else{
376 4 Fire_Angle=AngleLimit;/*可控硅全导通*/
377 4 ON=1;
378 4 Led=1;
379 4 SW=0;
380 4 }
381 3 break;
382 3 }
383 2 Read_Last_FireAngle();
384 2 if(ON==0){
385 3 /*渐亮到上一次调定的亮度*/
386 3 ON=1; /*允许可控硅触发*/
387 3 Led=1; /*指示灯灭*/
388 3 if(CtlLamp)
389 3 for(Fire_Angle=10;Fire_Angle>Last_FireAngle;Fire_Angle--) Delay(1);
390 3
391 3 else{
392 4 Fire_Angle=MaxFireAngle/2; /*中速运转*/
393 4 Delay(3000); /*延迟5s*/
394 4 /*转变为上次调定的转速*/
395 4 if(Fire_Angle>Last_FireAngle){
396 5 while(Fire_Angle>Last_FireAngle){
397 6 Fire_Angle--;
398 6 Delay(1);
399 6 }
400 5 }
401 4 else{
402 5 while(Fire_Angle<Last_FireAngle){
403 6 Fire_Angle++;
404 6 Delay(1);
405 6 }
406 5 }
407 4 }
408 3 }
409 2 else{
410 3 Led=0; /*指示灯点亮*/
411 3 if(CtlLamp)
412 3 /*渐暗到最小亮度后关闭*/
413 3 for(Fire_Angle=Last_FireAngle;Fire_Angle<MaxFireAngle-
414 3 AngleLimit;Fire_Angle++) Delay(1);
415 3 ON=0; /*不允许可控硅触发*/
416 3 }
417 2 break;
418 2 case 2: /*点击二次*/
419 2 if(!CtlLamp) break;
420 2 if(ON==0){
421 3 Read_Last_FireAngle();
422 3 Fire_Angle=Last_FireAngle;
423 3 ON=1; /*可控硅打开为上次亮度*/
424 3 Led=1; /*指示灯关闭*/
425 3 }
426 2 else{
427 3 /*可控硅关闭*/
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 8
428 3 ON=0;
429 3 Led=0;
430 3 }
431 2 break;
432 2 case 3: /*点击三次*/
433 2 break;
434 2
435 2 case 4: /*持续按住*/
436 2 EX1=0;
437 2 i=0;
438 2 while(CONTI || CONTI_R){/*亮度逐渐增大,直到放开*/
439 3 WDRST=0X1E; /*清看门狗*/
440 3 WDRST=0XE1;
441 3 if(ON==0){ /*原来关闭,亮度从0 开始,是电机,不予理会*/
442 4 if(CtlLamp){
443 5 ON=1;
444 5 Led=1;
445 5 Fire_Angle=MaxFireAngle-AngleLimit;
446 5 }
447 4 }
448 3 if(ON){
449 4 if(CtlLamp){/*灯*/
450 5 if(Fire_Angle>AngleLimit){
451 6 Fire_Angle-=1;
452 6 Delay(1);
453 6 }
454 5 else
455 5 Fire_Angle=AngleLimit;
456 5 }
457 4 else{/*电机*/
458 5 if(Fire_Angle>AngleLimit+SpeedLimit){
459 6 Fire_Angle-=1;
460 6 Delay(1);
461 6 }
462 5 else
463 5 Fire_Angle=AngleLimit+SpeedLimit;
464 5 }
465 4 }
466 3 if(INT1){ /*等待遥控键释放*/
467 4 if(i++>100) CONTI_R=0;
468 4 }
469 3 else
470 3 i=0;
471 3 }
472 2 Write_FireAngle();
473 2 EX1=1;
474 2 break;
475 2 case 5: /*点击一次,持续*/
476 2 EX1=0;
477 2 i=0;
478 2
479 2 while(CONTI || CONTI_R){/*亮度逐渐减小,直到放开*/
480 3 WDRST=0X1E; /*清看门狗*/
481 3 WDRST=0XE1;
482 3 if(ON){
483 4 if(CtlLamp){
484 5 if(Fire_Angle<MaxFireAngle-AngleLimit) {
485 6 Fire_Angle+=1;
486 6 Delay(1);
487 6 }
488 5 else{
489 6 Fire_Angle=MaxFireAngle-AngleLimit;
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 9
490 6 ON=0;
491 6 Led=0;
492 6 }
493 5 }
494 4 else{
495 5 if(Fire_Angle<MaxFireAngle-AngleLimit-SpeedLimit) {
496 6 Fire_Angle+=1;
497 6 Delay(1);
498 6 }
499 5 else{
500 6 Fire_Angle=MaxFireAngle-AngleLimit-SpeedLimit;
501 6 ON=0;
502 6 Led=0;
503 6 }
504 5 }
505 4 }
506 3 if(INT1){ /*等待遥控键释放*/
507 4 if(i++>100) CONTI_R=0;
508 4 }
509 3 else
510 3 i=0;
511 3 }
512 2 Write_FireAngle();
513 2 EX1=1;
514 2 break;
515 2 case 6: /*点击二次,持续*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -