题目
http://链接:https://pan.baidu.com/s/1sN-UPOZnxFIKTCjGSId_MQ 提取码:o8sf
注意
用到了555,底层读取键值部分记得注释掉P34=0!!!
如果代码有可以改进或者有不理解的地方可以联系我一起讨论
代码
main.c
#include <iic.h>
#include <tim.h>
#include <seg.h>
#include <key.h>
#include <stdio.h>
#include <ds1302.h>
#include <onewire.h>
unsigned char ucLED;
unsigned char Seg_Buf[10],Seg_Code[8],Seg_Pos,Seg_Dly;
unsigned char Key_Up,Key_Down,Key_Val,Key_Old,Key_Dly;
unsigned char Sys_Mod,Reg_Mod;
unsigned int F_dat,F_dat_now;//频率,实时频率
unsigned char ucRtc[3]={0,0,0};
unsigned char Temp_Max,Temp_Dat=30;//最大温度,温度参数
unsigned int Temp_now,Temp,Temp_ave,Temp_Old;//实时温度,温度和,平均温度,上一个温度
unsigned char Water_Max,Water_now,Water_Old;//最大湿度,实时湿度,上一个湿度
unsigned int Water,Water_ave;//湿度和,平均湿度
unsigned char dat,Rtc[2];//触发次数,触发时间
unsigned char Volt,Volt_Mod;//光敏电压,环境状态
bit Seg3_Flag,LED6_Flag,LED4_Flag;
unsigned long xdata t;
unsigned long xdata Key_t;
bit flag;
unsigned int u1s,t2;
unsigned char t3;
void LED_Proc(void);
void Seg_Proc(void);
void Key_Proc(void);
void Dat_Proc(void);
void main(void)
{
Close_Ws();
Timer0_Init();
Timer1_Init();
sprintf(Seg_Buf," ");
Seg_Tran(Seg_Buf,Seg_Code);
Write_Rtc(ucRtc);
Temp_now=Read_Temperture();
while(1)
{
Seg_Proc();
Key_Proc();
}
}
void Dat_Proc(void)
{
Volt=Read_ADC(0x41);
Read_Rtc(ucRtc);
switch(Volt_Mod)
{
case 0:
if(Volt>40)
{
Volt_Mod=1;//亮
}
break;
case 1:
if(Volt<=40)
{
flag=1;
F_dat_now=F_dat;
Temp_now=Read_Temperture();
Rtc[0]=ucRtc[0];
Rtc[1]=ucRtc[1];
Volt_Mod=0;//暗
Seg3_Flag=1;
if((Temp_now>Temp_Old) &&(((0.4*F_dat_now+10)/9)>Water_Old) && (F_dat_now>200) && (F_dat_now<2000)) LED6_Flag=1;
else LED6_Flag=0;
if(Temp_Old>Temp_now)
{
if(Temp_Max> (Temp_Old/16)) Temp_Max=Temp_Max;
else Temp_Max=Temp_Old/16;
}
else
{
if(Temp_Max>(Temp_now/16)) Temp_Max=Temp_Max;
else Temp_Max=Temp_now/16;
}
Temp=Temp+Temp_now;
Temp_Old=Temp_now;
if((F_dat_now>200) && (F_dat_now<2000))
{
if(Water_Old>((0.4*F_dat_now+10)/9))
{
if(Water_Old>Water_Max) Water_Max=Water_Old;
else Water_Max=Water_Max;
}
else
{
if(((0.4*F_dat_now+10)/9)>Water_Max) Water_Max=(0.4*F_dat_now+10)/9;
else Water_Max=Water_Max;
}
Water=Water+(0.4*F_dat_now+10)/9;
Water_Old=(0.4*F_dat_now+10)/9;
}
else
{
Water=Water;
Water_Max=Water_Max;
}
if(((F_dat_now>200) && (F_dat_now<2000)))
{
dat++;
Temp_ave=Temp/dat;
Water_ave=(Water/dat)*10;
}
else
{
dat=dat;
Water_ave=Water_ave;
Temp_ave=Temp_ave;
}
}
break;
}
}
void Seg_Proc(void)
{
if(Seg_Dly) return;
Seg_Dly=1;
Dat_Proc();
if(Seg3_Flag==0)
{
switch(Sys_Mod)
{
case 0:sprintf(Seg_Buf,"%02d-%02d-%02d",(unsigned int)ucRtc[0],(unsigned int)ucRtc[1],(unsigned int)ucRtc[2]);break;
case 1:
switch(Reg_Mod)
{
case 0:
if(dat==0) sprintf(Seg_Buf,"C ");
else sprintf(Seg_Buf,"C %02d-%03.1f",(unsigned int)Temp_Max,Temp_ave/16.0);
break;
case 1:
if(dat==0) sprintf(Seg_Buf,"H ");
else sprintf(Seg_Buf,"H %02d-%03.1f",(unsigned int)Water_Max,Water_ave/10.0);
break;
case 2:
if(dat==0) sprintf(Seg_Buf,"F%02d ",(unsigned int)dat);
else sprintf(Seg_Buf,"F%02d%02d-%02d",(unsigned int)dat,(unsigned int)Rtc[0],(unsigned int)Rtc[1]);
break;
}
break;
case 2:sprintf(Seg_Buf,"P %02d",(unsigned int)Temp_Dat);break;
}
}
else
{
if((F_dat_now>200) && (F_dat_now<2000))
{
Water_now=(0.4*F_dat_now+10)/9;
sprintf(Seg_Buf,"E %02d-%02d",Temp_now/16,(unsigned int)Water_now);
}
else sprintf(Seg_Buf,"E %02d-AA",Temp_now/16);
}
Seg_Tran(Seg_Buf,Seg_Code);
}
void Key_Proc(void)
{
if(Key_Dly) return;
Key_Dly=1;
LED_Proc();
Key_Val=Read_Key();
Key_Down=Key_Val&(Key_Old^Key_Val);
Key_Up=~Key_Val&(Key_Old^Key_Val);
Key_Old=Key_Val;
if(Seg3_Flag==0)
{
if(Key_Down==4)
{
switch(Sys_Mod)
{
case 0:
Sys_Mod=1;
Reg_Mod=0;
break;
case 1:Sys_Mod=2;break;
case 2:Sys_Mod=0;break;
}
}
if(Key_Down==5)
if(Sys_Mod==1)
if(++Reg_Mod==3) Reg_Mod=0;
if(Key_Down==8)
{
if(Sys_Mod==2)
{
Temp_Dat++;
if(Temp_Dat>99) Temp_Dat=0;
}
}
if(Key_Down==9)
{
if(Sys_Mod==2)
{
Temp_Dat--;
if(Temp_Dat>99) Temp_Dat=99;
}
else if(Sys_Mod==1)
{
if(Reg_Mod==2)
{
Key_t=t;
}
}
}
if((Key_Up==9)&&(t-Key_t>2000))
{
if(Sys_Mod==1)
{
if(Reg_Mod==2)
{
t=0;
Key_t=0;
dat=0;
Rtc[0]=0;
Rtc[1]=0;
Water=0;
Water_ave=0;
Water_Max=0;
Water_now=0;
Water_Old=0;
Temp_now=0;
Temp_ave=0;
Temp_Max=0;
Temp_Old=0;
Temp=0;
}
}
}
}
}
void LED_Proc(void)
{
switch(Sys_Mod)
{
case 0:ucLED=ucLED&0xf8|0x01;break;
case 1:ucLED=ucLED&0xf8|0x02;break;
default:ucLED=ucLED&0xfc;
}
if((F_dat_now>200) && (F_dat_now<2000)) ucLED=ucLED&0xef;
else if(flag==0) ucLED=ucLED&0xef;
else ucLED=ucLED&0xef|0x10;
if(Seg3_Flag) ucLED=ucLED&0xf8|0x04;
else ucLED=ucLED&0xfb;
if((dat>1) && (LED6_Flag==1)) ucLED=ucLED&0xdf|0x20;
else ucLED=ucLED&0xdf;
if(((Temp_now/16)>Temp_Dat) && ((Temp_now/16)!=85)) LED4_Flag=1;
else LED4_Flag=0;
LED_Disp(ucLED);
}
void Timer1_Isr(void) interrupt 3
{
t++;
u1s++;
if(!(u1s%1000))
{
u1s=0;
TR0=0;
F_dat=(TH0<<8)+TL0;
TH0=0;
TL0=0;
TR0=1;
}
if(Seg3_Flag==1)
{
t2++;
if(t2==3000)
{
Seg3_Flag=0;
t2=0;
}
}
if(LED4_Flag==1)
{
t3++;
if(t3==100)
{
t3=0;
ucLED^=8;
}
}
else ucLED=ucLED&0xf7;
Seg_Disp(Seg_Code,Seg_Pos);
if(++Seg_Pos==8) Seg_Pos=0;
if(++Seg_Dly==100) Seg_Dly=0;
if(++Key_Dly==10) Key_Dly=0;
}
tim.c
#include <tim.h>
void Close_Ws(void)
{
P0=0xff;
P2=P2&0x1f|0x80;
P2=P2&0x1f;
P0=0;
P2=P2&0x1f|0xa0;
P2=P2&0x1f;
}
void Timer0_Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x05; //设置定时器模式
TH0 = 0x00;
TL0 = 0x00; //设置定时器0初始值
TF0 = 0;
TR0 = 1; //定时器0开始工作
}
void Timer1_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初始值
TH1 = 0xFC; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
EA=1;
}
void LED_Disp(unsigned char ucLED)
{
P0=~ucLED;
P2=P2&0x1f|0x80;
P2=P2&0x1f;
}
其余底层可以参考以前发布的文章