【蓝桥杯】第六届蓝省赛-温度记录器

目录

    • 1、源代码下载
    • 2、题目要求
    • 3、遇到的一些bug和经验
    • 4、主函数

1、源代码下载

链接:https://pan.baidu.com/s/1ag83nDiERcRi8RB8tgv5ww?pwd=nlcx
提取码:nlcx

2、题目要求

【蓝桥杯】第六届蓝省赛-温度记录器_第1张图片

3、遇到的一些bug和经验

额,怎么说呢,跟着题目要求做就行。没什么新鲜的东西。
就是怎么做题简单讲讲吧
1、创建工程,这里最好创建一个自己的.c.h,用来装自己的一些功能函数。比如什么定时器初始化啊,数码管显示这些。主要是让main.c少一些代码。这样方便写main函数,不然一堆代码很难翻。需要注意的是别着急把底层驱动文件添加进来。用一个填一个。
2、阅读题干,从题目要求来看,我们需要有数码管的显示,
OK那我们直接开始写数码管显示函数,其他的暂时不看
3、写完后检查显示函数是否出错。编译上电检测。
4、检查无误后,继续往下看,发现使用了四个独立按键,
那直接开始编写按键扫描函数,切忌过度思考,按部就班往下做即可
5、检查按键是否有bug,按下某个键,显示相应数字,检查代码的同时,还能留下一个按键处理的框架
6、继续阅读题干,给按键添加功能,,,然后基本就是跟着题目杀
7、最后就检查代码。

4、主函数

#include 
#include
#include
#include
#include
unsigned char buf[10],duanma[8]; //数码管显示数组
unsigned char code time[4]={1,5,30,60};	 //采集流转时间
unsigned char gettime[3]={23,59,50};//获取DS1302时间
unsigned char temp[10]={0},j=0;	//装载温度
//key_flag按键标志,dis_flag数码管数据处理标志,dis闪烁标志,temp_flag是否采集温度,T温度采集标志
bit key_flag=1,dis_flag=1;dis=0,temp_flag=0,T=0;
unsigned char count=0;//S4按键次数,即流转时间选择
unsigned char key,state=0; //key按键值,state系统状态
unsigned char mode=0;//mode=0,参数设置界面(上电默认);mode=1,时钟显示界面;mode=3温度采集显示界面
  
void main()
{
  unsigned char i;
  Timer0Init();
  SetTime(&gettime);
  
  while(1)
  {
    /*按键处理*/
     if(key_flag)
	 {
	   key_flag=0;
	   key=read_key();//读取温度
	   if(key!=0)//有按键按下
	   {
	      switch(state)
		  {
		    //上电默认状态,通过按键S4切换4个温度采集间隔时间,其余按键无效
		    case 0:
			    Read_Temp_d();//先读取一次温度,避免温度显示85
				if(key==4){mode=0;count++;if(count==4){count=0;}}
				//按下S5,确认采集间隔时间,并退出参数设置界面,进入时钟显示界面采集温度
				if(key==5){state=1;mode=1;temp_flag=1;}
				break;
			//按下S5后,采集温度中
			case 1:
			     mode=1;break;//显示时间
		   //温度采集结束
		    case 2:
			     mode=2;//显示温度
				 //按下S6,查看0~9的温度数据
				 if(key==6){i++;if(i==10)i=0;}
				 //按下S7,回到初始状态0
				 if(key==7){state=0;mode=0;}break;	    
		  }	  
	   }
	 }
	 /*温度采集*/
	 if(T)
	 {
	   	temp[j]=Read_Temp_d();
		T=0;
		j++;
	 }
	 if(j==10)//需采集十个
	 {j=0;temp_flag=0;state=2;mode=2;}//温度采集完成,进入温度显示

	 /*数码管显示处理*/
	 if(dis_flag)
	 {
	   dis_flag=0;
	   //参数设置界面
	   if(mode==0){sprintf(buf,"     -%02bu",time[count]);}
	   //时钟显示界面
	   if(mode==1)
	   {
	      ReadTime(&gettime);//读取DS1302时间
	      sprintf(buf,"%02bu-%02bu-%02bu",gettime[0],gettime[1],gettime[2]);
	      if(dis){buf[2]=buf[5]=' ';}//闪烁处理
	   }
	   //温度显示界面
	   if(mode==2){sprintf(buf,"-%02bu  -%02bu",i,temp[i]);}

	   conversion(&buf,&duanma);
	 }
	 	 
  }
}
void Timer0() interrupt 1
{
  static unsigned char i,m,c;
  static unsigned int n,s;
  if(++i==8){i=0;}display(&duanma,i);//数码管显示
  if(++m==10){m=0;key_flag=1;} //每10ms进行一次按键处理
  if(++n==1000){n=0;dis=~dis;dis_flag=1;}//每一秒闪烁、读取时间、显示处理
  if(temp_flag)//如果进入温度读取状态
  {
     if(++s==1000){c++;s=0;}//每一秒计数加一
     //计数值=采集时间,采集并保存
	 if(c==time[count]){T=1;c=0;}
  }
}	  	  

你可能感兴趣的:(备考蓝桥杯,蓝桥杯,单片机,职场和发展)