蓝桥杯第十二届决赛源码

特点:繁琐  细节更多

完整工程在文章底部,仅供参考

main.c




#include "sys.h"

u8 s=0;
u8 smgtime=0;
u8 keytime=0;



bit uic=0;//数据显示界面 0:数据显示 1参数  
u8 uicd=0; // 0 :时间 1:距离数据显示
           // 2:数据记录显示
bit mode1=0;//0:C 1:F 在距离数据显示界面下
u8 mode2=0;//0:最大值 1:最小值 2:平均值 在数据记录显示界面
bit uicp=0; //0 采集时间设置 1距离参数

u8 ctime=2;//时间参数
u16 cdis=10;//距离参数
u8 ctemp[2]={2,20};//临时参数拷贝

 
u8 i=0;//当前所测的距离
u16 clockt=0;
u8 flasht=0;
u8 adc=0;//读取到的光敏电阻值
u8 old_adc=0;
u16 workt=0;
u8 dact=0;//dac间隔输出时间
bit cge=0;//参数是否修改标志




typedef struct dis{
	u16 maxdis;
	u16 avgdis;//小数扩大了10倍
	u16 mindis;
}Mydis;

Mydis dis={0,0,0};


void DacOut(){
	
	if(DISES[i]<=10)PCF8591_W(51);
	else if(DISES[i]>=80)PCF8591_W(255);
	else 
		PCF8591_W(2.9*DISES[i]+22);
}
u8 JudgeScope(){
	
	u8 min=cdis-5;
	u8 max=cdis+5;
	u8 t;
	for(t=0;t<3;t++){
		if(DISES[t]>=min&&DISES[t]<=max){
			
			}
		else{
			return 0;
		}
	}
 
	
	
	return 1;
	
}
void update(){
	
	u16 max=DISES[0];
	u16 min=DISES[0];
	u8 a=0;
	dis.avgdis=(DISES[0]+DISES[1]+DISES[2])*10/3;

 for(a=1;a<3;a++){
	 if(max<DISES[a])max=DISES[a];
	 if(min>DISES[a])min=DISES[a];
	 
 }
 dis.maxdis=max;
 dis.mindis=min;
	
	
}
void LedSetting(){
	if(!uic){
		if(uicd==0)LEDDT[0]=1;
		else if(uicd==1)LEDDT[0]=2;
		else if(uicd==2)LEDDT[0]=3;
	}
	else 
		LEDDT[0]=0;
	if(!mode1){
		LEDDT[1]=4;
	}
	else {
		
		if(JudgeScope())LEDDT[1]=5;
		else LEDDT[1]=0;
		
	}
	if(adc>45)LEDDT[2]=6;
	else LEDDT[2]=0;
 
}

void SetC(){
		if(cge&&!uic){
		ctime=ctemp[0];
		cdis=ctemp[1];
		cge=0;
		}
}

void UISetting(){
	
if(smgtime>45){
		smgtime=0;
	if(!uic){
		if(uicd==0){
			DT[0]=TIME[0]/10%10;
			DT[1]=TIME[0]%10;
			DT[2]=27;
			DT[3]=TIME[1]/10%10;
			DT[4]=TIME[1]%10;
			DT[5]=27;
			DT[6]=TIME[2]/10%10;
			DT[7]=TIME[2]%10;
			
		}
		else if(uicd==1){
				DT[0]=22;
				DT[1]=!mode1?21:23;
				DT[2]=10;
				DT[3]=10;
				DT[4]=10;
				DT[5]=DISES[i]>=100?DISES[i]/100%10:10;
				DT[6]=DISES[i]>10?DISES[i]/10%10:10;
				DT[7]=DISES[i]%10;
			
			
		}
		else if(uicd==2){
 
				DT[0]=24;
				DT[2]=10;
				DT[3]=10;
				if(mode2==0){ 
				DT[1]=26;
				DT[4]=10;
				DT[5]=dis.maxdis>=100?dis.maxdis/100%10:10;
				DT[6]=dis.maxdis>=10?dis.maxdis/10%10:10;
				DT[7]=dis.maxdis%10;
				}
				else if(mode2==1){
					DT[1]=27;
					DT[4]=dis.avgdis>=1000?dis.avgdis/1000%10:10;
					DT[5]=dis.avgdis>=100?dis.avgdis/100%10:10;
					DT[6]= dis.avgdis/10%10+11;
					DT[7]=dis.avgdis%10;
				}
				else{
					DT[1]=28;
					DT[4]=10;
					DT[5]=dis.mindis>=100?dis.mindis/100%10:10;
					DT[6]=dis.mindis>=10?dis.mindis/10%10:10;
					DT[7]=dis.mindis%10;
						
				}
		}
		
		
	}
	else {
		DT[0]=25;
		DT[1]=!uicp?1:2;
		DT[2]=10;
		DT[3]=10;
		DT[4]=10;
		DT[5]=10;
		DT[6]=!uicp?ctemp[0]/10%10:ctemp[1]/10%10;
		DT[7]=!uicp?ctemp[0]%10:ctemp[1]%10;
	}
	
	}
}

void KeyConsole(){
	
	if(keytime>13){
		keytime=0;
		key_scan();
		
		if(rkey){
			
			switch(rkey){
				
				case 4:
				 
					if(!uic){
						uic=1;
						uicp=0;//默认采集时间设置
					}
					else {
						uic=0;
						uicd=0;//默认当前时间数据显示
					}
					break;
				
				
				case 5:
					//数据显示界面下
			 
					if(!uic){
						uicd=++uicd%3;
						if(uicd==2)mode2=0;//默认数据显示的最大值
						
					}
					else {
						uicp=~uicp;
					}
					break;
				
				case 8://模式设置
				 
					if(!uic){
						if(uicd==1)mode1=~mode1;
						else if(uicd==2)mode2=++mode2%3;
					}
					break;
				
				case 9://参数设置界面
					cge=1;
				 if(uic&&!uicp){
					 if(ctemp[0]==2)ctemp[0]=3;
					 else if(ctemp[0]!=9)ctemp[0]+=2;
					 else ctemp[0]=2;
				 }
				 else if(uic&&uicp){ 
					 if(ctemp[1]!=80)ctemp[1]+=10;
					 else ctemp[1]=10;
				 }
					break;

			}
		}
	}
}
void main(){
	
		sys_init();
		Timer1Init();
		WtiteTime();
		Timer0Init();
		while(1){
			KeyConsole();
			UISetting();
			SetC();
			
			
			if(clockt>=999){
				clockt=0;
				ReadTime();
			}
		 
				
				//触发模式
			
			if(workt>400){
					workt=0;
					if(!mode1){
						old_adc=adc;
						
						adc=PCF8591_R(0x01);
					 
						if(old_adc>45&&adc<45){
								i=++i%3;
							DISES[i]=get_dis();//由亮变暗
							
						}
						
					} 
					else {
						 
						if(TIME[2]%ctime==0){
								i=++i%3;
							DISES[i]=get_dis();
							
						}
						
					}
					update();
			}
			if(dact>234){
				dact=0;
				DacOut();
				
			}
		 
			
		}
}

void T1() interrupt 3{
	
	smgtime++;
	keytime++;
	smg_play(DT[s],s++);
	if(s>7)s=0;
	if(flasht++==10){
		flasht=0;
		LedSetting();
		LedRunning();
	}
	clockt++;
	workt++;
	dact++;
}

百度网盘链接

链接:https://pan.baidu.com/s/1NdY0VDKzNG-1l1_6eWsmJQ 
提取码:yzh1

posted @   昊月光华  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示