智能台灯:
1、系统具有自动模式和手动模式。
2、自动模式:传感器检测到有人时,根据环境亮度控制台灯的亮度(PWM控制)。
3、手动模式:可手动控制启停。
4、具有定时关闭功能,定时时间可调。
sbit smg3=P2^2;
//--定义使用的IO口--// P1数据口
sbit adc0808_start=P2^6;
sbit adc0808_eoc =P2^5;
sbit adc0808_oe =P2^4;
sbit led=P3^6;//led
sbit ir_in=P3^7;
sbit k1=P3^0;//按钮
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5;
sbit beep=P2^3;//蜂鸣器
sbit out=P2^7;//台灯
//数码管编码
uchar code smgduan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar time=0,mode=0;//系统变量
uchar miao=0,fen=1,set=1;//时间
uchar light=0;//光照
uchar start=0;//启停
uchar pwm=0;//亮度
uchar beep_time=0;//蜂鸣器计时
//延时
void delay(uint i)
{
while(i--);
}
uchar adc0808_read()//读取
{
uchar i;
_nop_();
adc0808_start=1;//启动转换
_nop_();
adc0808_start=0;
while(!adc0808_eoc)//等待转换结束
{
}
adc0808_oe=1;//读取
_nop_();
i=P1;
adc0808_oe=0;
return i;
}
//主函数
void main()
{
uchar k=0,i=0;
uint j=0;
adc0808_start=0;
adc0808_oe=0;
TMOD|=0X01;//初始化定时器
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//显示时间
if(start==1)//启动模式
{
P0=0XFF;
smg3=0;smg2=0;smg1=0;
P0=smgduan[fen/10];
delay(100);
P0=0XFF;
smg3=0;smg2=0;smg1=1;
P0=smgduan[fen%10]+0x80;
delay(100);
P0=0XFF;
smg3=0;smg2=1;smg1=0;
P0=smgduan[miao/10];
delay(100);
P0=0XFF;
smg3=0;smg2=1;smg1=1;
P0=smgduan[miao%10];
delay(100);
}
else //停止模式
{
P0=0XFF;
smg3=0;smg2=0;smg1=0;
P0=smgduan[set/10];
delay(100);
P0=0XFF;
smg3=0;smg2=0;smg1=1;
P0=smgduan[set%10]+0x80;
delay(100);
P0=0XFF;
smg3=0;smg2=1;smg1=0;
P0=smgduan[0];
delay(100);
P0=0XFF;
smg3=0;smg2=1;smg1=1;
P0=smgduan[0];
delay(100);
}
//显示光照
P0=0XFF;
smg3=1;smg2=0;smg1=0;
P0=smgduan[light/10];
delay(100);
P0=0XFF;
smg3=1;smg2=0;smg1=1;
P0=smgduan[light%10];
delay(100);
//启停指示
if(start)
{
P0=0XFF;
smg3=1;smg2=1;smg1=0;
P0=0xbf;
delay(100);
}
//显示亮度
P0=0XFF;
smg3=1;smg2=1;smg1=1;
P0=smgduan[pwm];
delay(100);
if(!k1 &&(k!=1) &&(start==0))//启动
{
k=1;
start=1;
fen=set;
miao=0;
}
if(!k2 &&(k!=2))//停止
{
k=2;
start=0;
}
if(!k3 &&(k!=3))//手动,自动
{
k=3;
mode=!mode;
}
if(start==0)
{
if(!k4 &&(k!=4))//时间加
{
k=4;
if(set<99)
set++;
}
if(!k5 &&(k!=5))//时间减
{
k=5;
if(set>1)
set--;
}
}
if(mode==1)
{
if(!k6 &&(k!=6))//亮度切换
{
k=6;
if(pwm<9)
pwm++;
else
pwm=1;
}
}
if(k1 && k2 && k3 && k4 && k5 && k6)
k=0;
资料借鉴于此纷传
阅读全文