第十二届蓝桥杯赛后总结(2)

蓝桥杯第十二届单片机设计与开发省赛第一场题目+答案

(本文仅作学习交流,不作商业用途,如需转载,请注明出处。
客观题题目+答案转载于小蜜蜂老师,小蜜蜂老师的客观题在我看来是十分值得信赖的。程序设计题为本人所写,大家有任何问题可提出,大家一起学习交流。)

第一部分:客观题解析答案

第二部分:程序设计题

1、硬件框图

在这里插入图片描述

2、功能描述

2.1功能概述

通过获取DS18B20温度传感器的温度数据,完成温度测量功能。
通过PCF8591AD/DA芯片完成DAC输出功能。
通过数码管完成题目要求的数据显示功能。
通过按键完成题目要求的显示界面切换和设置功能。
通过LED指示灯完成题目要求的指示功能。

2.2性能要求

温度数据刷新时间:≤1秒。
DAC输出电压刷新时间:≤0.5秒。
按键动作响应时间:≤0.2秒。

2.3显示功能

1)温度显示界面
温度数据界面如图2所示,显示内容包括标识符C和温度数据,温度数据保留小数点后2位有效数字,单位为摄氏度。
在这里插入图片描述

2)参数设置界面
参数设置界面如图3所示,显示内容包括标识符P和温度参数,温度参数为整数,单位为摄氏度。
在这里插入图片描述
3)DAC输出界面
DAC输出界面如图4所示,显示内容包括标识符A和当前DAC输出的电压值,电压数据保留小数点后2位有效数字。
在这里插入图片描述

2.4按键功能

1)功能说明
S4:定义为“界面”按键,按下S4按键,切换温度显示界面、参数设置界面和DAC输出界面,按键S4切换模式如图5所示:
在这里插入图片描述
S8:定义为“减”按键
在参数界面下按下S8按键,温度参数减1。
S9:定义为“加”按键
在参数界面下按下S9按键,温度参数加1。
S5:定义为“模式”切换按键。
在这里插入图片描述
模式1:DAC输出电压与温度相关。
通过DS18B20采集到的实时温度小于温度参数时,DAC输出0V,否则,DAC输出5V。
模式2:DAC按照图7给出的关系输出电压。
在这里插入图片描述
2)其它要求
按键应做好消抖处理,避免出现一次按键动作导致功能多次触发等问题。
按键动作不影响数码管显示和数据采集过程。
S8、S9按键仅在参数设置界面有效。
设定的温度参数在退出参数设置界面时生效。

2.5LED指示灯功能

当前处于模式1状态,指示灯L1点亮,否则熄灭。
当前处于温度显示界面,指示灯L2点亮,否则熄灭。
当前处于参数设置界面,指示灯L3点亮,否则熄灭。
当前处于DAC输出界面,指示灯L4点亮,否则熄灭。

2.6初始状态说明

请严格按照以下要求设计作品的上电初始状态。
处于温度显示界面。
处于模式1。
温度参数为25°C。

部分功能代码

数码管显示

void SMG()
{
  switch(mode)
  {
	  case 0:
		     ds18b20_read();
		     smg_xs(0,0xc6);
	         smg_xs(4,smg_duan[temp/1000]);
             smg_xs(5,smg_duan[temp/100%10]-0x80);
             smg_xs(6,smg_duan[temp/10%10]);
             smg_xs(7,smg_duan[temp%10]);
	         break;    //温度
	 case 1:
		     ds18b20_read();
		     smg_xs(0,0x8c);
             smg_xs(6,smg_duan[dat_temp/10]);
             smg_xs(7,smg_duan[dat_temp%10]);
	         break;   //温度参数
	 case 2:
		     ds18b20_read();
	       //  dat_dac=15*temp/100;
		     smg_xs(0,0x88);
             smg_xs(5,smg_duan[dat_dac/100%10]-0x80);
             smg_xs(6,smg_duan[dat_dac/10%10]);
             smg_xs(7,smg_duan[dat_dac%10]);
	         break;  //DAC
  }
}

按键功能

void key()
{
 L1=0; 
 L2=1;
 s1=s2=1;
	if(s1==0)           //s5
	{  
	  delay(200);
		if(s1==0)
		{
		 mos++;
			if(mos>1) mos=0;
		}
		while(!s1)
		{
		 SMG();
		 led();
		}
	}
	 if(s2==0)           //s4
		{  
		  delay(200);
			if(s2==0)
			{
			 mode++;
				if(mode>2) mode=0;
			}
			while(!s2)
			{
			 SMG();
			 led();
			}
		}
 L2=0; 
 L1=1;
 s1=s2=1;
		if(s1==0)         //s9
		{
		 delay(200);
			if(s1==0&&mode==1)
			{
			  dat_temp++;
			}
			while(!s1)
			{
			 SMG();
			 led();
			}
		}
		if(s2==0)         //s8
		{
		 delay(200);
			if(s2==0&&mode==1)
			{
			  dat_temp--;
			}
			while(!s2)
			{
			 SMG();
			 led();
			}
		}
}

LED指示灯功能

void led()
{
 if(mos==0)
 {
  HC138(4);
  P0=P0 & 0xfe;
 }
 else
 {
  HC138(4);
  P0=P0 & 0xff;
 }
 if(mode==0)
 {
  HC138(4);
  P0=P0 & 0xfd;
 }
 else																						 
 {
  HC138(4);
  P0=P0 & 0xff;
 }
 if(mode==1)
 {
  HC138(4);
  P0=P0 & 0xfb;
 }
 else
 {
  HC138(4);
  P0=P0 & 0xff;
 }
 if(mode==2)
 {
  HC138(4);
  P0=P0 & 0xf7;
 }
 else
 {
  HC138(4);
  P0=P0 & 0xff;
 }
}

DAC输出

void out()
{
  if(mos==0)
  {
    if(temp<dat_temp*100)
	{
	 out_dac(0);
	 dat_dac=0;
	}
	else
	{
	  out_dac(255);
	  dat_dac=500;
	}
  }
  else
  {
    if(temp<2000)
	{
	 out_dac(51);
	 dat_dac=100;
	}
	else
	 if(temp>4000)
	{
	 out_dac(204);
	 dat_dac=400;
	}
	else
	 if(temp>=2000&&temp<4000)
	{
     dat_dac=(15*temp-20000)/100;
	 out_dac(dat_dac*51);
	}
  }
}

完整程序设计题代码

完整代码

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值