可控硅调光,有完美过零检测信号,可控硅电路也没问题

2020-02-04 09:22发布


电路原理图 (原文件名:未命名.jpg)


过零检测信号接INT1 ,波形正常,将P1.6高地电平,可控硅调光电路灯能亮灭,但是接入单片机后,按键无法控制p1.6的电平,程序代码如下,是在51单片机开发的一本书上搜来的,请高手看下程序哪有问题,刚学,求大大指教

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
#define LOW 0                     /* 低电平 */
#define HIGH 1                    /* 高电平 */
#define DEVIBRATE_FACTOR   0x03   /* 去抖动因子 */
sbit LIGHT=P1^6;                  /* 调光灯触发端  */
sbit LIGHT_KEY=P1^0;              /* 调光灯按键  */
bit LIGHT_KEYold;                 /* 按键去抖变量  */
bit LIGHTState;                   /* 调光标志位,0:开关状态,1:调光状态  */
bit LIGHTSwitch;                  /* 开灯标志位  */
bit LIGHTKeyPress;                /* 当前时刻按键状态  */
bit LIGHTKeyPressOld;             /* 前一时刻按键状态  */
bit LIGHTDimmer;                   /* 调光过程,0:渐亮,1:渐暗 */
uint LIGHTValueH,LIGHTValueL;    /* 调光定时器初值  */
uint LIGHT_KEYcounter;           /* 去抖动数  */
uint LIGHTNum;                   /* 按键时长计数值  */
uint LIGHTLevel;                 /* 调光灯亮度等级  */
uint idata LIGHTValue;          /* 调光初值  */


/* Function Definitions */            
void Initialize(void);                          /* 初始化单片机  */
void Check();                        /* 检查按键和灯所处状态  */
void delay6ms (void);             /* 延时6毫秒 */
void main()
{
     Initialize();
     do
     {
       Check();
      }
      while(1);
}
void Initialize(void)
{
     T2CON=0x00;
     /* TIMER2.用于调光灯的驱动. */
     PT0=1;
     IT1=1;
     TR0=0;
     TR2=0;
     ET0=1;
     ET2=1;
     EX1=1;
     EA=1;
     EX0=1;
     LIGHTState=0;
     LIGHTSwitch=0;
     LIGHTNum=0;
}

/*-----------------------------------------------*/
void Check(void)                                                        /* 检查按键和灯所处状态  */
{
    LIGHT_KEY=HIGH;                                                        /* 确保各苏茹管脚处在输入状态 */
    if(LIGHT_KEY==LOW)
    {
       if(LIGHT_KEYold==HIGH)
       {
          delay6ms();
          if(LIGHT_KEY==LOW)                             /* 灯调光键按下,”LOW” 为有效点评. */
          {
              if(LIGHT_KEYcounter>DEVIBRATE_FACTOR)
             {
                 LIGHTKeyPress=1;
                 LIGHT_KEYold=LOW;
                 LIGHT_KEYcounter=0;
             }
             else LIGHT_KEYcounter++;
          }
          else LIGHT_KEYcounter=0;
       }
       else
       {
            LIGHTKeyPress=1;
            LIGHT_KEYcounter=0;
        }
    }
    else
    {
         if(LIGHT_KEYold==LOW)
        {
           delay6ms();
           if(LIGHT_KEY==HIGH)                  /* 灯调光键抬起. */
          {
               if(LIGHT_KEYcounter>DEVIBRATE_FACTOR)
              {
                  LIGHTKeyPress=0;
                  LIGHT_KEYold=HIGH;
                  LIGHT_KEYcounter=0;
              }
              else LIGHT_KEYcounter++;
          }
          else LIGHT_KEYcounter=0;
        }
        else
       {
           LIGHTKeyPress=0;
           LIGHT_KEYcounter=0;
       }
    }
}
/*-----------------------------------------------*/            

ServiceINT1() interrupt 2 using 1
{
      /*过零检测时间到. */
      TR2=0;
      LIGHT=HIGH;
      /*调光灯触发端关闭. */
      if(LIGHTKeyPress==1)   /* 调光键在按下. */
      {
          LIGHTKeyPressOld=1;
          if(LIGHTState==0)  /* 调光灯处在开关状态 */
         {
             if(LIGHTNum>=0x32)   /* 调光按键长时按下. */
             {
                 LIGHTState=1;
                 /* 调光灯切换至调光状态  */
                 LIGHTLevel|=0x10;
                 LIGHTNum=0;
             }
             else LIGHTNum++;
         }
         else                       /* 调光灯处在调光状态 */
         {
             if(LIGHTSwitch==0)
             {
                 if(LIGHTNum>=0x42)
                 {
                    LIGHTSwitch=1;
                    LIGHTNum=0;
                 }
                 else LIGHTNum++;
              }
              else
              {
                   if(LIGHTDimmer==0)   /*  进入调亮灯光过程 */
                   {
                      if(LIGHTValue>0xffe0)   /* 灯光最亮定时器限度 */
                      LIGHTDimmer=1;
                      /* 设置调暗灯光标志 */
                      else LIGHTValue+=0x13;
                      /* 增加定时器初值 */
                   }
                   else           /* 进入调暗灯光过程 */
                   {
                       if(LIGHTValue<0xe000) /* 灯光最暗定时器限度 */
                      {
                          LIGHTDimmer=0;
                           /* 设置调亮灯光标志 */
                          LIGHTSwitch=0;
                          LIGHTNum=1;
                      }
                      else LIGHTValue-=0x13;
                      /* 减少定时器初值 */
                   }
              }
          }
      }
      else                    /*  调光键已抬起 */
      {
          if(LIGHTKeyPressOld==1)    /* 调光键刚抬起 */
          {
             LIGHTKeyPressOld=0;
             LIGHTNum=0;
             if(LIGHTState==0)        /* 调光键抬起前为开关状态. */
             {
                if(LIGHTSwitch==0)
                {
                    LIGHTSwitch=1;
                   /* 调光灯设置为开. */
                    LIGHTLevel|=0x10;
                }
                else
                {
                    LIGHTSwitch=0;
                    /* 调光灯设置为关  */
                    LIGHTLevel&=0xef;
                }
             }
             else        /* 调光键抬起前为调光状态. */
             {
                 LIGHTState=0;
                 /* 调光键恢复为开关状态. */
                 LIGHTLevel&=0x10;
                 if(LIGHTValue>0xe000)
                 LIGHTLevel+=(LIGHTValue-0xe000)/0x01fe;
                 else LIGHTLevel+=0;
                 LIGHTValueH=LIGHTValue>>8;
                 LIGHTValueL=LIGHTValue&0xff;
                 EX0=1;
             }
          }
      }
      LIGHTValueH=LIGHTValue>>8;
      /* 打开本次过零周期的定时器. */
      LIGHTValueL=LIGHTValue&0xff;
      TH2=LIGHTValueH;
      TL2=LIGHTValueL;
      TR2=1;
}
/*-----------------------------------------------*/

void delay6ms (void)
{
      int delaycnt;
      for(delaycnt=0;delaycnt<=460;delaycnt++);
}
/*-----------------------------------------------*/

void ServiceTimer2() interrupt 5 using 1
{
    if(LIGHTSwitch==1)
    LIGHT=LOW;
    /* 触发调光灯晶闸管  */
    TR2=0;
    TF2=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。