搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2011-4-25 17:15:38 | 显示全部楼层 |阅读模式

电路原理图 (原文件名:未命名.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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-4-25 17:17:26 | 显示全部楼层
顶顶更健康。。。

出0入0汤圆

 楼主| 发表于 2011-4-25 17:19:03 | 显示全部楼层
上面写错了,是3051光耦2管脚接高电平,灯不亮,接地,灯亮,可控硅电路应该没问题,就是单片机不能控制p1.6管脚电平

出0入0汤圆

发表于 2011-6-10 15:23:47 | 显示全部楼层
上拉电阻试试

出0入0汤圆

发表于 2011-6-10 16:47:12 | 显示全部楼层
看看

出0入0汤圆

发表于 2011-7-27 15:09:47 | 显示全部楼层
楼主,做出来了没啊,能不能说下是什么书啊,叫什么名字啊

出0入0汤圆

发表于 2011-12-12 16:33:44 | 显示全部楼层
顶了

出0入0汤圆

发表于 2011-12-15 13:11:24 | 显示全部楼层
我做了一个可控硅调白炽灯的东西,有RS485和无线控制功能的,无线部分还在调试

出0入0汤圆

发表于 2012-2-9 21:34:10 | 显示全部楼层
好好的学习,,,可

出0入0汤圆

发表于 2012-3-30 10:24:11 | 显示全部楼层
能不能给点资料啊,我也在做这个,不会啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 01:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表