|
之前用stc12c5a60s2做的一个室内光线自动控制系统。
其实说白了就是通过光敏电阻采集各个方向的光强,通过ad采集,然后分析各个方向光线强弱,然后通过pwm控制不同的灯的亮度达到控制室内光线的自动平衡。
首先我自己做了一个小的模型,就是一个光敏电阻和一个led灯。效果基本达到了,但是在光线的反馈调节上有些问题。就是通过ad采集led的光强,当led靠近ad时ad采集到的光强大,led变暗,当led变暗,ad采集的光强变弱,led又通过pwm变亮,感觉灯强一直在变动。通过设置ad值得梯度来控制led基本可以达到效果,但是感觉led有突变,不是线性。希望大家能帮忙看看。
程序如下:
#include<stc12c5a60s2.h>
#include<datatype.h>
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit wela=P2^7;
sbit dula=P2^6;
void Delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void AD_init()
{
P1ASF=BIT1;
P1M0=BIT1;
P1M1=BIT1;
ADC_CONTR=0xe0;
// AUXR1|=BIT2; //ADC_RES高八位 ADC_RESL 低二位
}
int GET_AD()
{
float offset;
ADC_CONTR|=BIT7+BIT3;
while(!ADC_CONTR&BIT4);
offset=((float)ADC_RES*4+(float)(ADC_RESL%0x04)); //AD结果高8位左移2位,低2位不变,然后相加
ADC_CONTR&=~BIT4;
return(offset);
}
void Init_pwm()
{
CCON=0; //PCA初始化
CL=0; //PCA的16位计数器低八位
CH=0; //PCA的16位计数器高八位
CMOD=0x00; //选择系统时钟12为计数脉冲 f=sysclk/12,则Pwm的频率F=f/256
CCAP0L=0x00;
CCAP0H=0x00; // 占空比控制
PCA_PWM0=0x00; //占空比的第九位为0
CCAPM0=0x42; //允许P13作为PWM输出
CR=1; //启动PCA计数器
}
void SET_pwm(uchar n)
{
CCAP0L=n;
CCAP0H=n;
}
float AD_av()
{
float a=0;
uchar num;
for(num=500;num>0;num--)
{
a+=GET_AD();
}
a/=500.0;
a=a*5.0/1024; //原始电压值
a=a*1000;//放大一千倍
return(a);
}
void Display(uchar num ,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0xff;
// i=i&(~((0x00)<<(num)));
// P0=i;
switch(num)
{
case 0:
P0=0xfe;
break;
case 1:
P0=0xfd;
break;
case 2:
P0=0xfb;
break;
case 3 :
P0=0xf7;
break;
}
wela=1;
wela=0;
Delay(1);
P0=0xff;
}
void Display_cl(float t)
{
int i;
i=(int)t/1000;
Display(0,i);
i=(int)t%1000/100;
Display(1,i);
i=(int)t%100/10;
Display(2,i);
i=(int)t%100%10;
Display(3,i);
}
main()
{
float b;
uchar l=0;
Init_pwm();
AD_init();
while(1)
{
b=AD_av();
if(b<1550)
{
if(l<32)l++;
else l--;
}
if(1500<b&&b<1600)
{
if(l<64)
l++;
else l--;
}
if(1550<b&&b<1650)
{
if(l<96) l++;
else l--;
}
if(1600<b&&b<1700)
{
if(l<128) l++;
else l--;
}
if(1650<b&&b<1750)
{
if(l<160) l++;
else l--;
}
if(1700<b&&b<1800)
{
if(l<192) l++;
else l--;
}
if(1750<b&&b<1850)
{
if(l<224) l++;
else l--;
}
if(1800<b&&b<1950)
{
if(l<255)
{l++;if(l>=255) l=255;}
else l--;
}
if(b>1950) l=255;
else l--;
SET_pwm(l);
Display_cl(b);
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|