蓝桥杯14届省赛代码

本文描述了一个嵌入式系统,通过I2C、定时器、ADC等技术采集环境数据(如温度、湿度和光敏电压),并使用DS1302实时时钟和OneWire接口进行数据同步。程序实时处理数据,控制LED和数码管显示,还具有中断机制来优化性能。
摘要由CSDN通过智能技术生成

题目

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;
}

其余底层可以参考以前发布的文章

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值