单片机检测交流电掉电程序应用(RGB控制)
程序如下:
#include
__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 { 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 { 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; } else if(num==2) { GP0=0; GP1=1;//红色亮 } else if(num==3) { GP0=0; GP1=0; } } } RGB函数构造比较巧妙,不知道原创者是谁?不想多费唇舌。交流掉电检测才是要说的重点,
GP4=0;
GP4=0;
GP4=1;//蓝色亮
if()
{}
else
{}
格式,开始时,如果GP5口上有低电平出现,对变量key2_time_cnt进行自加,当数值大于1000,(大概是12MS)左右,认为是交流电掉电了,让断电标志key_flag置1 ,当GP5口变为高电平的时候,把key2_time_cnt清零,同时判断断电标志是否有效,如果有效,让分档变量num加1,如果有4种功能那么从0加到3就要归零。此交流检测函数简单实用,可以放在主程序循环中,检测掉电不会漏档。如何在渐变中响应交流检测,就是利用检测函数作为延时的循环主体。这样既可以延时,又可以检测IO口的变化。
单片机检测交流电掉电程序RGB控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)