爆闪灯
一,电子
1, 灯闪模式,灯闪模式可调,4个输出端口
蓝—红—蓝—红
1 2 3 4
a,四路轮流闪烁,频率可调,每路间隔可调,可一路闪,两路闪,三路闪,四路闪可调
节 例如(12—34—1234)
b,四路变换工作,每路间隔可调,例如(1—2—3—4 黄闪灯模式)
c,四路组合变换闪烁,每路间隔可调,例如(1—2—3—4—12—34—1234)
2,输出,电池板,蓄电池,开关的端口采用接线槽(路灯控制器那种接线端子)
3, LED一种颜色的数量在45—60PCS之间,电流控制在150mA-600mA
4, 电池板在15W,10W,6W
5,电池在20Ah,14Ah,8Ah
二,结构
1, 开一套LED反光杯,以提高亮度,
2, 电池板的方向可灵活调动
3, 电池需固定好,不能左右,上下晃动
4, 灯板和透明罩可采用插槽式的,以便好组装
5, 控制器可以固定在灯壳里面,不能有漏水到上面
6, 外壳设计成插槽拼接的,减少螺丝的使用率
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sfr P0M0=0X94;
sfr P0M1=0X93;
sfr P2M0=0X96;
sfr P2M1=0X95;
sfr P1M0=0X92;
sfr P1M1=0X91;
sfr IAP_DATA=0XC2;
sfr IAP_ADDRH=0XC3;
sfr IAP_ADDRL=0XC4;
sfr IAP_CMD=0xc5;
sfr IAP_TRIG=0XC6;
sfr IAP_CONTR=0XC7;
unsigned char liang_temp=1;
unsigned char an_temp=1;
unsigned char R_to_B_temp=1;
unsigned char stop_temp=1;
unsigned char mode=1;
unsigned char time_key=0;
unsigned char time_temp=0;
unsigned char mode1_temp=0;
uchar
ajs,ljs;
uchar rtobjs,stopjs,js3c=1;
uchar rba=0;
bit la=1;ksj=0;
unsigned char code zhifu0[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char code zhifu2[16]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0XFe,0Xf6,0Xee,0X3e,0X9c,0X7a,0X9e,0X8e};
//*********************************************************
void delay20(void) //误差 -0.000000000002us
{
unsigned char a,b,c;
for(c=2;c>0;c--)
for(b=95;b>0;b--)
for(a=209;a>0;a--);
}
//*********************************************************
void delay500(void) //误差 0us 500ms
{
unsigned char a,b,c;
for(c=23;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
}
//*********************************************************
void eeprom_erase(unsigned char a)
{
unsigned int add=512;
unsigned int add1=0;
add1=add*a;
IAP_ADDRH=add1/255;
IAP_ADDRL=add1%255;
IAP_CONTR=0X8C;
IAP_CMD=0X03;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
}
//*********************************************************
void eeprom_writer(unsigned int add,unsigned char date)
{
IAP_DATA=date;
IAP_ADDRH=add/255;
IAP_ADDRL=add%255;
IAP_CONTR=0X8C;
IAP_CMD=2;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
}
//***********************************************************
unsigned char eeprom_read(unsigned int add)
{
unsigned char date=0;
IAP_ADDRH=add/255;
IAP_ADDRL=add%255;
IAP_CONTR=0X8C;//
IAP_CMD=0X01;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
date=IAP_DATA;
return(date);
}
//*********************************************************
void show(unsigned char a)
{
unsigned char shi;
unsigned char ge;
unsigned char *p;
unsigned char *p1;
p=zhifu0;
p1=zhifu2;
shi=a/10;
shi=*(p+shi);//得到编码值
ge=a%10;
ge=*(p1+ge);
P0=shi;
P2=ge;
}
//**********************************************************
void liang_key()
{
if(!P1_0)
{
delay20();
if(!P1_0)
{
liang_temp++;
if(liang_temp>99)
{liang_temp=1;}
show(liang_temp);
while(!P1_0)
{
while(ksj){liang_temp++;delay20();if(liang_temp>99)liang_temp=1;show(liang_temp);}
}
}
delay20();
}
}
//***********************************************************
void an_key()
{
if(P1_0==0)
{
delay20();
if(P1_0==0)
{
an_temp++;
if(an_temp>99)
{an_temp=1;}
show(an_temp);
while(!P1_0)
{
while(ksj){an_temp++;delay20();if(an_temp>99)an_temp=1;show(an_temp);}
}
}
delay20();
}
}
//***********************************************************
void R_to_B_key()
{
if(P1_0==0)
{
delay20();
if(P1_0==0)
{
R_to_B_temp++;
if(R_to_B_temp>99)
{
R_to_B_temp=1;
}
show(R_to_B_temp);
while(!P1_0)
{
while(ksj){R_to_B_temp++;delay20();if(R_to_B_temp>99)R_to_B_temp=1;show(R_to_B_temp);}
}
}
delay20();
}
}
//***********************************************************
void stop_key()
{
if(P1_0==0)
{
delay20();
if(P1_0==0)
{
stop_temp++;
if(stop_temp>99)
{stop_temp=1;}
show(stop_temp);
while(!P1_0)
{
while(ksj){stop_temp++;delay20();if(stop_temp>99)stop_temp=1;show(stop_temp);}
}
}
delay20();
}
}
//************************************************************
void show_mode(unsigned char a)
{
unsigned char ge=0;
unsigned char *p1;
p1=zhifu2;
ge=*(p1+a);
//
P0=0x00;
P2=ge;
}
//************************************************************
void set_mode()
{
if(!P1_0)
{
delay20();
TR1=1;//开定时器
if(!P1_0)
{
show_mode(mode);
}
while(time_key==0)
{
if(!P1_0)
{
delay20();
if(!P1_0)
{
mode++;
if(mode>5)
{
mode=1;
time_temp=0;
}
}
show_mode(mode);
delay20();
}
}
TR1=0;//关定时器
time_key=0;
time_temp=0;
TH1 = 0x3C;
TL1 = 0xB0;
eeprom_erase(1);
eeprom_writer(0,mode);
P0=0;
P2=0;
rtobjs= R_to_B_temp;
stopjs=stop_temp;
ajs=an_temp;
ljs=liang_temp;
rba=0;
}
}
//***********************************************************
void set_fun()//设置时间的顺序是从亮,暗,红到蓝,停,4个步骤 第一个模式
{
unsigned char panduan=0;
if(!P1_1)
{
delay20();
if(!P1_1)
{
P0=zhifu0[15];
P2=zhifu2[1];
delay500();
delay500();
panduan=1;
while(panduan)
{
liang_key();
show(liang_temp);
if(!P1_1)
{
delay20();
panduan=0;
ljs=liang_temp;
delay20();
}
}
panduan=1;
P0=zhifu0[15];
P2=zhifu2[2];
delay500();
delay500();
while(panduan)
{
an_key();
show(an_temp);
if(!P1_1)
{
delay20();
panduan=0;
ajs=an_temp;
delay20();
}
}
panduan=1;
P0=zhifu0[15];
P2=zhifu2[3];
delay500();
delay500();
while(panduan)
{
R_to_B_key();
show(R_to_B_temp);
if(!P1_1)
{
delay20();
panduan=0;
rtobjs=R_to_B_temp;
delay20();
}
}
panduan=1;
P0=zhifu0[15];
P2=zhifu2[4];
delay500();
delay500();
while(panduan)
{
stop_key();
show(stop_temp);
if(!P1_1)
{
delay20();
panduan=0;
stopjs=stop_temp;
delay20();
}
}
eeprom_erase(0);
eeprom_writer(0,liang_temp);
eeprom_writer(1,an_temp);
eeprom_writer(2,R_to_B_temp);
eeprom_writer(3,stop_temp);
P0=0X0;
P2=0X0;
//
red=1;
//
blue=0;
//
yq=yq2=0;
rtobjs = R_to_B_temp;
stopjs = stop_temp;
ajs = an_temp;
ljs = liang_temp;
rba=0;
}
}
}
//***********************************************************
void mode_out(bit a1,bit a2,bit a3,bit a4)//a为停留时间,各位为输出值
{
P1_4=a1;
P1_5=a2;
P1_6=a3;
P1_7=a4;
}
void redfun(void)
{
if(js3c<4)
{
if(la) mode_out(1,0,1,0);
else mode_out(0,0,0,0);
}
else
{
mode_out(0,0,0,0);
}
}
void bluefun(void)
{
if(js3c<4)
{
if(la) mode_out(0,1,0,1);
else mode_out(0,0,0,0);
}
else mode_out(0,0,0,0);
}
void allfun(void)
{
if(js3c<4)
{
if(la) mode_out(1,1,1,1);
else mode_out(0,0,0,0);
}
else mode_out(0,0,0,0);
}
//***********************************************************
void mode1()//模式1
{
//unsigned char a=0;
switch(rba)
{
case 0: redfun();break;
case 1: bluefun();break;
case 2: allfun();break;
default:break;
}
}
//***********************************************************
void mode_work(unsigned char a)//参数为模式
{
switch(a)
{
case 1: mode1(); break; //第一种模式
case 2: mode1(); break;
case 3: mode1(); break;
case 4: mode1(); break;
case 5: mode1(); break;
}
}
//***********************************************************
/*
void decipherment_dog()//解密完后才能使用本控制器
{
if((P1_0==0)&(P1_1==0))
{
}
} */
//***********************************************************
void InitTimer1(void)
{
TMOD = 0x11;
TH1 = 0x3C;
TL1 = 0xB0;
EA = 1;
ET1 = 1;
}
//***********************************************************
void InitTimer0(void)
{
TH0 = 0xf2;
TL0 = 0xfb;
ET0 = 1;
TR0 = 1;
}
//***********************************************************
main()
{
InitTimer1();
InitTimer0();
P0M0=0XFF;//配成强上拉
P0M1=0X00;
P2M0=0XFF;
P2M1=0X00;
P1M1=0X00;
P1M0=0XF0;
P0=0;
P2=0;
P1_4=0;
P1_5=0;
P1_6=0;
P1_7=0;
liang_temp=eeprom_read(0);
an_temp=eeprom_read(1);
R_to_B_temp=eeprom_read(2);
stop_temp=eeprom_read(3);
rtobjs= R_to_B_temp;
stopjs=stop_temp;
ajs=an_temp;
ljs=liang_temp;
while(1)
{
set_fun();
set_mode();
mode_work(mode);
}
}
//**********************************************************
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x7d;
TL1 = 0xcb;
time_temp++;
if(time_temp>30)
{
time_key=1;
}
}
//************************************************************
void Timer0Interrupt(void) interrupt 1
{
// TR0=0;
static uchar i=0;
static uchar kj=0;
TH0 = 0xf2;
//10 ms
TL0 = 0xfb;
if(js3c<4)
{
if(la)
//如果在亮计时
{
ljs--;
//亮计数自减
if(ljs==0)
//亮的时间到
{
la=0;
//置0亮暗计数
ajs=an_temp;
//还原暗计数值
}
}
else
//如果在暗计时
{
ajs--;
//晚计数自减
if(ajs==0)
//保持暗的时间到
{
la=1;
//点亮
ljs=liang_temp;
//还原亮计数初值
js3c++;
}
}
}
//else P1&=0x0f;
if(rba==0 && js3c>=3)
{
i++;
if(i>5)
{
i=0;rtobjs--;
//红到蓝时间自减
}
if(rtobjs==0)
//时间到进入到蓝亮
{
js3c=1;rba=1;rtobjs=R_to_B_temp;
}
}
if(rba==1 && js3c>=3)
{
i++;
if(i>5)
{
i=0;rtobjs--;
//红到蓝时间自减
}
//红到蓝时间自减
if(rtobjs==0)
//时间到进入到蓝亮
{
js3c=1;rba=2;
stopjs=stop_temp;
}
}
if(rba==2 && js3c>=3)
{ i++;
if(i>5)
{
i=0;
stopjs--;
//红到蓝时间自减
}
if(stopjs==0)
//时间到进入到蓝亮
{
js3c=1;rba=0;
rtobjs=R_to_B_temp;
}
}
if(!P1_0)
//ksj为长按标记。如果长按,ksj置1,否则置0
{
kj++;if(kj>70){kj=0;ksj=1;}
}
else
{
kj=0;
ksj=0;
}
}