gzsxdpj 发表于 2011-4-25 17:15:38

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

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_633503TF3ZDS.jpg
电路原理图 (原文件名:未命名.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;
}

gzsxdpj 发表于 2011-4-25 17:17:26

顶顶更健康。。。

gzsxdpj 发表于 2011-4-25 17:19:03

上面写错了,是3051光耦2管脚接高电平,灯不亮,接地,灯亮,可控硅电路应该没问题,就是单片机不能控制p1.6管脚电平

biguozi 发表于 2011-6-10 15:23:47

上拉电阻试试

wcm_e 发表于 2011-6-10 16:47:12

看看

ttyy 发表于 2011-7-27 15:09:47

楼主,做出来了没啊,能不能说下是什么书啊,叫什么名字啊

Cheas_Tong 发表于 2011-12-12 16:33:44

顶了

Cheas_Tong 发表于 2011-12-15 13:11:24

我做了一个可控硅调白炽灯的东西,有RS485和无线控制功能的,无线部分还在调试

wjjcyy 发表于 2012-2-9 21:34:10

好好的学习,,,可

dayemike 发表于 2012-3-30 10:24:11

能不能给点资料啊,我也在做这个,不会啊
页: [1]
查看完整版本: 可控硅调光,有完美过零检测信号,可控硅电路也没问题