蓝桥杯第十二届决赛源码
特点:繁琐 细节更多
完整工程在文章底部,仅供参考
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
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器