打印
[DemoCode下载]

单片机检测交流电掉电程序应用

[复制链接]
1652|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
仙女山|  楼主 | 2016-3-23 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
BG软灯带是,等灯饰配件中常见的负载。一般作为背景灯装饰,以及护栏管。程序实现功能,利用墙壁开关,控制RGB灯带,分成4档,第一档:RGB之间实现渐变效果。第二档:R亮,第三档,B亮,第四档:G亮。当然还有其他很多花样。本程序难点,构造简单实用的RGB渐变函数,第二,如何在渐变中检测交流电掉电。实验器材:PIC12F509一片,RGB灯带一条,RGB控制线路板一块。
程序如下:

#include<pic.h>

__CONFIG(0X01A);

#define uchar unsigned char

#define uint unsigned int

#define TIME_MAX 1000



uint key2_time_cnt;//按键去抖计数器

uchar num;

uchar key_flag;

uint PWM;



uint  a,c;

uchar i,p,num,f,k;

uint r,g,b;



void delay(uint x)

{

uint c,d;

for(c=x;c>0;c--)

   for(d=110;d>0;d--);



}



void timer1(uint t)

{

uint n;

for(n=0;n<t;n++)

{



if(GP5==0)//

{

       key2_time_cnt++;

       if(key2_time_cnt==TIME_MAX)

       {

        

         key_flag=1;

       }

}



else

{

       key2_time_cnt=0;

       if(key_flag==1)

       {

       key_flag=0;

       num=1;

       }



}

}

}



void timer2(uint t)

{

uint n;

for(n=0;n<t;n++)

{



if(GP5==0)//

{

       key2_time_cnt++;

       if(key2_time_cnt==TIME_MAX)

       {

        

         key_flag=1;

       }

}



else

{

       key2_time_cnt=0;

       if(key_flag==1)

       {

       key_flag=0;

       num=3;

       }



}

}

}



void led1_on()               

{

  GP0=1;

  if(g!=0&&b==5)

       {

              g--;

              r++;

       }

   if(r!=0&&g==5)

         {

              r--;

              b++;

         }

  if(b!=0&&r==5)

       {

       b--;

       g++;

       }

   if(g+r+b!=50)

       {

       g=40;

       r=5;

       b=5;

       }

   for(a=0;a<30;a++)

{

        if(g!=0) //绿色渐变

        {

      

               GP1=0;

               timer1(g);

     

               GP1=1;

        }



         if(r!=0) //红色渐变

         {

                GP2=0;

                timer1(r);

                GP2=1;

         }

        if(b!=0) //蓝色渐变

        {

              GP4=0;

              timer1(b);

              GP4=1;

        }



  }



}



void key_scan()

{

if(GP5==0)//按键按下

{

       key2_time_cnt++;

       if(key2_time_cnt==TIME_MAX)

       {

        

         key_flag=1;

       }

}



else

{

       key2_time_cnt=0;

       if(key_flag==1)

       {

       key_flag=0;

       num++;

       if(num>3)num=0;

       }



}



}

void main()

{

TRIS=0b00110000;

GP0=1;

GP1=0;

GP2=0;

g=40;

r=5;

b=5;

while(1)

{

key_scan();

if(num==0)

{

  led1_on();

}



else if(num==1)

{

GP0=1;//绿色亮

GP1=0;
GP4=0;

}

else if(num==2)

{

GP0=0;

GP1=1;//红色亮
GP4=0;

}

else if(num==3)

{

GP0=0;

GP1=0;
GP4=1;//蓝色亮

}





}



}

RGB函数构造比较巧妙,不知道原创者是谁?不想多费唇舌。交流掉电检测才是要说的重点,
if()
{}
else
{}
格式,开始时,如果GP5口上有低电平出现,对变量key2_time_cnt进行自加,当数值大于1000,(大概是12MS)左右,认为是交流电掉电了,让断电标志key_flag置1 ,当GP5口变为高电平的时候,把key2_time_cnt清零,同时判断断电标志是否有效,如果有效,让分档变量num加1,如果有4种功能那么从0加到3就要归零。此交流检测函数简单实用,可以放在主程序循环中,检测掉电不会漏档。如何在渐变中响应交流检测,就是利用检测函数作为延时的循环主体。这样既可以延时,又可以检测IO口的变化。
沙发
huangcunxiake| | 2016-3-25 11:56 | 只看该作者
重要的是方式,比如用二极管。反正有点复杂。

使用特权

评论回复
板凳
zhuomuniao110| | 2016-3-25 17:19 | 只看该作者
楼主没有提供个电路图吗,这个是纯软件实现的,还是软硬结合的。

使用特权

评论回复
地板
neeringstu| | 2016-3-26 23:12 | 只看该作者
单片机还能够检测交流电,检测的是正弦波吗

使用特权

评论回复
5
Bermanrep| | 2016-3-27 20:35 | 只看该作者
是用单片机控制交流的开闭吧,中间是不是要用到继电器?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

340

帖子

2

粉丝