ADC读取的时候读的是上一个值,也就是说,你以为你读的是Rb2,其实是光敏电阻,网上说的有两种解决方法
(1).每个值读两次,我是采用这种方法的,
(2).二者的地址反着取,
但是两种方法都会有问题,目前还没有找到完美解决方法,找到了我会放上来,大家注意一下就好了。
void main()
{
uchar last_sec,k,m,index;
bit light_start=0;
uchar temp,shidu,light;
uchar hour,min,sec;
uchar stay_hour,stay_min,stay_sec;
uint stay_time;
AllInit();
rd_temperature();
Delay750ms();
set_time(23,59,55);
light_InitVal=read_adc(0x01)-20;
Delay20ms();
Timer0Init();
UartInit();
while(1)
{
//获取温、湿、亮度
temp=rd_temperature();
EA=0;
shidu=read_adc(0x03)*0.389 ;
EA=1;
Delay20ms();
EA=0;
shidu=read_adc(0x03)*0.389 ;
EA=1;
Delay20ms();
EA=0;
sec=Read_Ds1302_Byte(0x81);
min=Read_Ds1302_Byte(0x83);
hour=Read_Ds1302_Byte(0x85);
EA=1;
Delay20ms();
EA=0;
light=read_adc(0x01);
EA=1;
Delay20ms();
EA=0;
light=read_adc(0x01);
EA=1;
Delay20ms();
if(light < light_InitVal)
{
close=1;
light_start=1;
if(stay_flag==0)
{
stay_sec=sec;
stay_min=min;
stay_hour=hour;
stay_flag=1;
}
}
else
{
close=0;
}
if(close==0 && stay_flag==1)
{
stay_flag=0;
stay_time=( (hour-stay_hour)*3600+(min-stay_min)*60+(sec-stay_sec) );
rom_dat[0]=temp;rom_dat[1]=shidu;rom_dat[2]=hour;
rom_dat[3]=min;rom_dat[4]=sec;rom_dat[5]=stay_time;
for(k=0;k<6;k++)
{
write_rom(k+addr,rom_dat[k]);
Delay20ms();
}
addr+=6;
if(addr==30)addr=0;
}
if(light_start==0)stay_time=0;
//按键单元
if(key_flag)
{
key_flag=0;
BTN();
if(Trg & 0x08)//s4
{
mode=~mode;
}
if(Trg & 0x04)//s5
{
menu_index++;
if(menu_index==4)menu_index=1;
}
}
//发送数据
if(send_en)
{
if(mode==0)
{
if(last_sec!=sec)
{
last_sec=sec;
send_buf[0]='{';send_buf[1]=temp/10+'0';send_buf[2]=temp%10+'0';send_buf[3]='-';
send_buf[4]=shidu/10+'0';send_buf[5]=shidu%10+'0';send_buf[6]='%';send_buf[7]='}';
send_buf[8]='{';send_buf[9]=hour/10+'0';send_buf[10]=hour%10+'0';send_buf[11]='-';
send_buf[12]=min/10+'0';send_buf[13]=min%10+'0';send_buf[14]='-';
send_buf[15]=sec/10+'0';send_buf[16]=sec%10+'0';send_buf[17]='}';
send_buf[18]='{';send_buf[20]='}';
if(close)send_buf[19]='1';
else send_buf[19]='0';
send_buf[21]='\r';send_buf[22]='\n';
for(k=0;k<23;k++)SendData(send_buf[k]);
}
}else if(mode==1)
{
send_en=0;
for(m=0;m<5;m++)
{
for(k=0;k<6;k++)
{
rom_dat[k]=read_rom(k+m*6);
}
send_buf[0]='{';send_buf[1]=rom_dat[0]/10+'0';send_buf[2]=rom_dat[0]%10+'0';send_buf[3]='-';
send_buf[4]=rom_dat[1]/10+'0';send_buf[5]=rom_dat[1]%10+'0';send_buf[6]='%';send_buf[7]='}';
send_buf[8]='{';send_buf[9]=rom_dat[2]/10+'0';send_buf[10]=rom_dat[2]%10+'0';send_buf[11]='-';
send_buf[12]=rom_dat[3]/10+'0';send_buf[13]=rom_dat[3]%10+'0';send_buf[14]='-';
send_buf[15]=rom_dat[4]/10+'0';send_buf[16]=rom_dat[4]%10+'0';send_buf[17]='}';
send_buf[18]='{';
if(rom_dat[5]<10)
{
send_buf[19]=rom_dat[5]+'0';send_buf[20]='}';
send_buf[21]='\r';send_buf[22]='\n';
for(index=0;index<23;index++)SendData(send_buf[index]);
}else
{
send_buf[19]=rom_dat[5]/10+'0';
send_buf[20]=rom_dat[5]%10+'0';
send_buf[21]='}';
send_buf[22]='\r';send_buf[23]='\n';
for(index=0;index<24;index++)SendData(send_buf[index]);
}
}
}
}
//数码管单元
if(menu_index==1)
{
menu1[0]=tab[temp/10];
menu1[1]=tab[temp%10];
menu1[2]=0xc6;
menu1[3]=0xff;menu1[4]=0xff;
menu1[5]=tab[shidu/10];
menu1[6]=tab[shidu%10];
menu1[7]=0x89;
}else if(menu_index==2)
{
menu2[0]=tab[hour/10];
menu2[1]=tab[hour%10];
menu2[3]=tab[min/10];
menu2[4]=tab[min%10];
menu2[6]=tab[sec/10];
menu2[7]=tab[sec%10];
if(sec%2==0){menu2[2]=0xff;menu2[5]=0xff;}
else {menu2[2]=0xbf;menu2[5]=0xbf;}
}else if(menu_index==3)
{
menu3[0]=0xff;menu3[1]=0xff;
menu3[2]=0xff;menu3[3]=0xbf;
menu3[4]=tab[stay_time/1000];
menu3[5]=tab[stay_time%1000/100];
menu3[6]=tab[stay_time%100/10];
menu3[7]=tab[stay_time%10];
}
//LED
if(mode==0 && close==0)
{
P0=~0x01;
P2=0x80;P0=~0x01;P2=0;
}else if(mode==0 && close==1)
{
P0=~0x05;
P2=0x80;P0=~0x05;P2=0;
}else if(mode==1 && close==0)
{
P0=~0x02;
P2=0x80;P0=~0x02;P2=0;
}else if(mode==1 && close==1)
{
P0=~0x06;
P2=0x80;P0=~0x06;P2=0;
}
}
}
我是采用初始光敏电阻模拟值-20来作为是否遮光的起始值,因为官方也没给明确的值,而且如果不-20的话变化就很敏感了。
【点击这里】下载。