蝈蝈叶子吧 关注:3贴子:140
  • 1回复贴,共1

遥控调光无极限 点亮台灯每一天

只看楼主收藏回复

/*======================================================================
程序名:    无线可调光LED台灯
编写人:    胡康
CPU说明:   AT89C2051型单片机 12MHZ晶体振荡器
======================================================================*/
//====================================================================//
#include <reg2051.H>
//===========================定义部分=================================//
#define LED_lamp P1_7
#define LED_dis     P3_4
void  delay(unsigned int d);
void  delay1(unsigned int d);
bit  Power_flag=0;
bit On_off_flag=0;
bit  On_off_press_flag=0;
bit Set_bri_flag=0;
sbit On_off      =   P3^0;
sbit Step_ctr    = P3^1;
sbit Inc_bri = P3^2;
sbit Dec_bri = P3^3;
//=========================键值读取函数===============================//
unsigned char Key(void)
{
if(On_off==1)return(1);//当开关灯键接下时,返回值为1。
if(Step_ctr==1)return(2);//当八级调光键接下时,返回值为2。
if(Inc_bri==1)return(3);//当增加亮度键接下时,返回值为3。
if(Dec_bri==1)return(4);//当降低亮度键接下时,返回值为4。
else return(0);//当无键接下时,返回值为0。
}
//=======================状态指示灯闪烁函数===========================//
void Led(void)
{
LED_dis=0;
delay(50000);
LED_dis=1;
delay(10000);
}
//========================无线LED台灯主函数===========================//
void main(void)

unsigned char a, b; //a控制延时长度,b控制循环周期。
P1=0x00;    //初始化,LED台灯关闭。
P3=0x00;    //初始化,关闭状态指示灯,键盘接口置低电平。
    while(1)
    {
    //------------------------------开灯------------------------------//
while((On_off==1)&&(Power_flag==0)) //按下开关灯键,开灯标志为0,则开灯。
{
Power_flag=1;   //置开关灯标志为1。
while(On_off==1);   //等待开关灯按键释放。
On_off_press_flag=0;    //开关灯按键释放标志置0。
LED_lamp=0;
LED_dis=0;
      a=0x00;
      
      //---------------开灯亮度逐渐增加至1/3过程----------------//
    for(b=80;b>0;b--)   //开机亮度默认为1/3,但感觉上会认为是一半亮度。
    {
a++;    //每份时间内点亮的时间逐渐增加。
    delay(a);   //每份时间内点亮的时间延时。
LED_lamp=0; //每份时间内的关闭时间开始。
//LED_dis = 0;
        a = ~a; //a取反后的值即为每份时间减点亮的时间,即关闭时间。
        delay(a);   //每份时间内关闭的时间延时。



IP属地:山东1楼2009-06-05 07:45回复
    LED_lamp=1; //点亮LED,准备进行下一份时间的动作。
    //LED_dis = 1;
            a = ~a; //a再次取反,此时a值还原为点亮时间值。
        }
    while(1)
    {    
    //------------------保持亮度--------------------------//
    delay1(a);  //每份时间内点亮的时间延时。
    LED_lamp=0; //每份时间内的关闭时间开始。
    //LED_dis=0;
    a=~a;   //a取反后的值即为每份时间减点亮的时间,即关闭时间。
    delay1(a);  //每份时间内关闭的时间延时。
    LED_lamp=1; //点亮LED,进行下一份时间的动作。
    //LED_dis=1;
    a=~a;   //a再次取反,此时a值还原为点亮时间值。
                    //-----------------按键动作处理-----------------------//
    if(Key()==1)On_off_press_flag=1;    //开关灯按键按下,释放标志置1。
    if((Key()==2)&&(Set_bri_flag==0)){a+=30;Set_bri_flag=1;if(a>=240)a=10;} //八级调光。
    if(Step_ctr==0)Set_bri_flag=0;  //当八级调光键释放,置其释放标志为0。
    if(Key()==3){a++;if(a>=240)a=240;}  //减光。
    if(Key()==4){a--;if(a<=10)a=10;}    //加光。
    if((On_off_press_flag==1)&&(On_off==0))break;   //当开关灯键释放才动作,到关灯过程。
    }
    break;
    }
            //--------------------------关灯------------------------------//
    while(Power_flag==1) //当开关灯标志为1,则关机。
    {
    Power_flag=0;   //置开关灯标志为0。
        for(b=250;b>0;b--)//因为a值最大为240,所以b值要比a值大才能使a值减小到0(即亮度为0)。
    {
         if(a<=1)break; //当a值不大于1时,此时灯已灭,跳出关灯函数。
    a--;    //每份时间内点亮的时间逐渐减小。
    LED_lamp=1; //每份时间内的点亮时间开始。
    //LED_dis = 1;
    delay(a);   //每份时间内点亮的时间延时。
            a=~a;   //a取反后的值即为每份时间减点亮的时间,即关闭时间。
    LED_lamp=0; //每份时间内的关闭时间开始。
    //LED_dis = 0;
    delay(a);   //每份时间内关闭的时间延时。
            a=~a;   //a再次取反,此时a值还原为点亮时间值。
        }
    LED_lamp=0; //关闭LED台灯。
    //LED_dis = 0;
    while(On_off==1);   //等待开关灯按键释放。
    }
    Led(); //Led状态指示灯闪烁提示,已经关机。
    }
    }
    //===================带按键开关灯按键中断延时函数=====================//
    void delay(unsigned int d)  //d决定延时时间的长短
    {
    unsigned char i;
    while(--d!=0)
    {
    for(i=0;i<10;i++);
    if(On_off==1)break; //加入开关键判断,可在延时中也迅速作出动作。
      }       
    }
    //============================延时函数================================//
    void delay1(unsigned int t)  //t决定延时时间的长短
    {
    unsigned char j;
    while(--t!=0)
    {
    for(j=0;j<2;j++);
      }       
    }
    //================================完==================================//


    IP属地:山东2楼2009-06-05 07:45
    回复