/*********************************************************************************************
DB1-010 感应式阅读灯
STC11L08XE单片机:
PxM0=0x00; //准双向
PxM1=0x00;
PxM0=0x11;//强推挽
PxM1=0x00;
PxM0=0x00;//高阻
PxM1=0x11;
PxM0=0x11;//开漏
PxM1=0x11;
程序功能:
1.首次开灯时,为最高亮度.
2.手压在外壳上方时,LED会逐渐变暗至最低亮度.
3.手放开时,LED会保持在当前亮度.
4.再次压住外壳,LED将会逐渐变亮至最大亮度.
5.DYS412红外传感器,平时输出高电平,有反射信号输出低电平.
6.可开关和无极调光.
/*********************************************************************************************
说明:
/*********************************************************************************************/
#include <DB1.H> //STC11Fxx或STC11Lxx系列单片机头文件 #include<reg52.h>
#include <intrins.h> //51基本运算(包括_nop_空函数)
#define LED P20 //灯组1
#define DYS412 P45 //DYS412传感器输入
unsigned char MENU;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
void DELAY (unsigned char a){//颜色PWM用延时
unsigned char i;
while( a-- != 0){
for(i = 0; i < 2; i++);
}
}
/*********************************************************************************************/
void LEDPWM (unsigned char i,unsigned char a){//显示程序(需不断调用)
unsigned char x;
for(x=0;x<a;x++){//设置循环显示次数
LED = 0;
DELAY (i);
LED = 1;
DELAY (255-i);
}
}
/*********************************************************************************************/
void init (void){ //初始IO程序
P4SW = 0xff; //启动P4接口
P0M0 = 0x00; //设置I/O口工作方式(推挽)
P0M1 = 0x00; //设置I/O口工作方式(高阻)
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
}
/**********************************************************************************************/
void main (void){
unsigned char DY_PWM;
unsigned int c;
bit ONOFF;//开/关灯标志位
bit aad;//调光加减标志位
DELAY_MS (500);
init();//初始程序
ONOFF = 0;c = 0;DY_PWM = 255;
while(1){
if(ONOFF==1){//灯开关控制位
LEDPWM(DY_PWM,1);//调光程序
}
if(DYS412==0){//按键/感应 处理程序部分
while(DYS412==0&&c<800){//长按到时跳转
c++;LEDPWM(DY_PWM,1);
}
if(c>700){//长键处理
while(DYS412==0){
if(aad){
DY_PWM++;
if(DY_PWM>254){
LEDPWM(210,30);
DY_PWM=254;
}
LEDPWM(DY_PWM,20);
}else{
DY_PWM--;
if(DY_PWM<2){
LEDPWM(3,30);
DY_PWM=2;
}
LEDPWM(DY_PWM,20);
}
}
aad=~aad;//下次调光时是反向调整的
ONOFF = 1;//调光后必然是开灯状态的
}else{//短键处理
ONOFF=~ONOFF;
while(DYS412==0)LEDPWM(DY_PWM,1);
}
c=0;
}
}
}
|