📄 deng.c
字号:
/*======================================================================
程序名: 无线可调光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); //每份时间内关闭的时间延时。
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++);
}
}
//================================完==================================//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -