2、主要程序
<1>按键扫描
不断扫描按键判断是手动控制和自动控制。程序代码:
void keyscan() {
ad(); if(key==1)
//key4松开,a恒为0 ,通过读c的值确定b的值
{
if(c<0.40) last=0;
else if((c>=0.40)&&(c<2.0)) last=2;
else if((c>=2.0)&&(c<3.0)) last=5;
else if((c>=3.0)&&(c<4.0)) last=7; else
last=10;
}
if(key==0)
//key4按下, { if(key1==0)
{ delayms(10); //去抖
if(key1==0)
last=1; } if(key2==0) { delayms(10);
if(key2==0)
last=6; } if(key3==0)
{ delayms(10);
if(key3==0)
last=10; }
}
}
手动控制 9
<2>AD转换
定时器1产生CLK信号,定时时间为2us,亦即CLK周期为0.4us。程地址为011, 即IN3口输入。利用公式getdata*1.0/255*VREV+对数字量进行变化。程序代码如下:
void ad() { }
ST=0;//关闭转换 OE=0;//关闭输出 ST=1;//开启转换 ST=0;//关闭转换 P34=1;//选择通道0 P35=1;
P36=0;
while(EOC==0);//判断是否转换结束:是则执行以下语句,否则等待 OE=1;//开启数据输出允许
getdata=P0;//将数据取走,存放在变量getdata中
OE=0;//关闭输出
c=getdata*1.0/255*4.85;//电压值转换,5V作为参考电压,分成256
<3>PWM调节
定时器0控制PWM周期和占空比。程序代码如下: void into(void) interrupt 1 { TH0=(65536-500)/256; TL0=(65536-500)%6;
count++; if(count>CIRCLE)
{
count=1; }
if(count<=last) pwm=0; //占空比,使用反相器应为1 else pwm=1;
10
四、总结
基于C51单片机和PWM调光的LED台灯以STC89C51作为主控芯片,设置了手动控制和自动控制。在手动控制时,分为三档,输出不同的PWM占空比实现了对光度的手动调节。在自动控制时,通过ADC0809模拟-数字转换芯片不断检验光敏电阻的电压来间接测量感应光度,将电压和预设的阈值进行对比,调整PWM的占空比实现了对光度的自动调节。该LED台灯电路简单,很大程度上节省电能,延长LED灯寿命,适宜阅读。
同时,在本次课程设计中,主要有以下体会:
1、对LED的驱动有进一步的了解,明白了如何对LED进行规定电流驱动,并通过输出不同的占空比来调节LED的亮度,从而对LED的耗电进行相应的管理;
2、进一步掌握了AD转换原理以及相关芯片的应用,通过ADC0809对外界的模拟量进行转换。
3、培养了自己的团队意识,能够比较好的和队员就项目进行及时的沟通,在分工和整合方面做的不错。
11
附录1:作品照片
12
相关推荐: