[DemoCode下载] 单片机检测交流电掉电程序应用

[复制链接]
1911|4
 楼主| 仙女山 发表于 2016-3-23 20:27 | 显示全部楼层 |阅读模式
BG软灯带是,等灯饰配件中常见的负载。一般作为背景灯装饰,以及护栏管。程序实现功能,利用墙壁开关,控制RGB灯带,分成4档,第一档:RGB之间实现渐变效果。第二档:R亮,第三档,B亮,第四档:G亮。当然还有其他很多花样。本程序难点,构造简单实用的RGB渐变函数,第二,如何在渐变中检测交流电掉电。实验器材:PIC12F509一片,RGB灯带一条,RGB控制线路板一块。
程序如下:

  1. #include<pic.h>

  2. __CONFIG(0X01A);

  3. #define uchar unsigned char

  4. #define uint unsigned int

  5. #define TIME_MAX 1000



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

  7. uchar num;

  8. uchar key_flag;

  9. uint PWM;



  10. uint  a,c;

  11. uchar i,p,num,f,k;

  12. uint r,g,b;



  13. void delay(uint x)

  14. {

  15. uint c,d;

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

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



  18. }



  19. void timer1(uint t)

  20. {

  21. uint n;

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

  23. {



  24. if(GP5==0)//

  25. {

  26.        key2_time_cnt++;

  27.        if(key2_time_cnt==TIME_MAX)

  28.        {

  29.         

  30.          key_flag=1;

  31.        }

  32. }



  33. else

  34. {

  35.        key2_time_cnt=0;

  36.        if(key_flag==1)

  37.        {

  38.        key_flag=0;

  39.        num=1;

  40.        }



  41. }

  42. }

  43. }



  44. void timer2(uint t)

  45. {

  46. uint n;

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

  48. {



  49. if(GP5==0)//

  50. {

  51.        key2_time_cnt++;

  52.        if(key2_time_cnt==TIME_MAX)

  53.        {

  54.         

  55.          key_flag=1;

  56.        }

  57. }



  58. else

  59. {

  60.        key2_time_cnt=0;

  61.        if(key_flag==1)

  62.        {

  63.        key_flag=0;

  64.        num=3;

  65.        }



  66. }

  67. }

  68. }



  69. void led1_on()               

  70. {

  71.   GP0=1;

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

  73.        {

  74.               g--;

  75.               r++;

  76.        }

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

  78.          {

  79.               r--;

  80.               b++;

  81.          }

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

  83.        {

  84.        b--;

  85.        g++;

  86.        }

  87.    if(g+r+b!=50)

  88.        {

  89.        g=40;

  90.        r=5;

  91.        b=5;

  92.        }

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

  94. {

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

  96.         {

  97.       

  98.                GP1=0;

  99.                timer1(g);

  100.      

  101.                GP1=1;

  102.         }



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

  104.          {

  105.                 GP2=0;

  106.                 timer1(r);

  107.                 GP2=1;

  108.          }

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

  110.         {

  111.               GP4=0;

  112.               timer1(b);

  113.               GP4=1;

  114.         }



  115.   }



  116. }



  117. void key_scan()

  118. {

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

  120. {

  121.        key2_time_cnt++;

  122.        if(key2_time_cnt==TIME_MAX)

  123.        {

  124.         

  125.          key_flag=1;

  126.        }

  127. }



  128. else

  129. {

  130.        key2_time_cnt=0;

  131.        if(key_flag==1)

  132.        {

  133.        key_flag=0;

  134.        num++;

  135.        if(num>3)num=0;

  136.        }



  137. }



  138. }

  139. void main()

  140. {

  141. TRIS=0b00110000;

  142. GP0=1;

  143. GP1=0;

  144. GP2=0;

  145. g=40;

  146. r=5;

  147. b=5;

  148. while(1)

  149. {

  150. key_scan();

  151. if(num==0)

  152. {

  153.   led1_on();

  154. }



  155. else if(num==1)

  156. {

  157. GP0=1;//绿色亮

  158. GP1=0;
  159. GP4=0;

  160. }

  161. else if(num==2)

  162. {

  163. GP0=0;

  164. GP1=1;//红色亮
  165. GP4=0;

  166. }

  167. else if(num==3)

  168. {

  169. GP0=0;

  170. GP1=0;
  171. GP4=1;//蓝色亮

  172. }





  173. }



  174. }

  175. RGB函数构造比较巧妙,不知道原创者是谁?不想多费唇舌。交流掉电检测才是要说的重点,
  176. if()
  177. {}
  178. else
  179. {}
格式,开始时,如果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 | 显示全部楼层
单片机还能够检测交流电,检测的是正弦波吗
Bermanrep 发表于 2016-3-27 20:35 | 显示全部楼层
是用单片机控制交流的开闭吧,中间是不是要用到继电器?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

340

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部