蓝桥杯单片机组省赛十二届第一场(关于矩阵,温度ds18b20,时间ds1302的学习,以及继电器等外设的综合利用)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



提示:以下是本篇文章正文内容,下面案例可供参考

一、该题目如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析题目,具体框架是矩阵键盘伴随着数值的输出,当数值满足条件时,去加加,然后执行对应的函数即可完成题目。具体的一些模块代码如下供参考。

二、使用步骤

1.矩阵键盘实现

矩阵键盘必须要求J5中的端口插在BIN上,且当555分频器在用时矩阵键盘P3^4引脚被占用,本人就上一个实验做得频率检测导致这个bug卡了好几次
代码如下(示例):

void Scaner_key_value()
{
   R1=R2=R3=R4=1;L1=L2=L3=L4=0;
	 if((P3&0x0f)!=0x0f)
	 {
	      if(R1==0) key_value=7;
		  else if(R2==0) key_value=6;
	      else if(R3==0) key_value=5;
		  else if(R4==0) key_value=4;
		    
		  R1=R2=R3=R4=0;L1=L2=L3=L4=1;
	      if(L1==0) {key_value=key_value+0;while(L1==0);}
		  else if(L2==0) {key_value=key_value+4;while(L2==0);}
          else if(L3==0) {key_value=key_value+8;while(L3==0);}
		  else if(L4==0) {key_value=key_value+12;while(L4==0);}
				
	 }
	 if(key_value==12)
     {
		    cnt++;
			  key_value=0;
			  mnt=0;
			   dis_t_c=0;
			  if(cnt==3) cnt=0;
		 }
	  if(key_value==13)
		{
		     mnt++;
			   key_value=0;
			   if(mnt==2) mnt=0;
		
		}			
}

开始保证的左引脚置1,右引脚置0,然后检测行,然后再进行按键判断再给列数赋值。随后给予右引脚置1,左引脚置0,判断列,给予行对应的加数判断即可,此方法代码量少,但是逻辑有点复杂且防抖功能不好添加。
另外一种矩阵键盘如下,一个一个的检测代码如下:

 L1=0;
	 L2=L3=L4=1;
	 R1=R2=R3=R4=1;
	 if(R1==0)
   {
	   while(R1==0)
    {
			 key=7;
			 
	   }
	 }
   if(R2==0)
   {
	   while(R2==0)
    {
			 key=6;
			
	   }
	  }
	  if(R3==0)
   {
	   while(R3==0)
    {
			 key=5;
			 
	   }
	  }
	   if(R4==0)
   {
	   while(R4==0)
    {
			 key=4;
			
	   }
	  }
	 
		L2=0;
	 L1=L3=L4=1;
	 R1=R2=R3=R4=1;
	 if(R1==0)
   {
	   while(R1==0)
    {
			 key=11;
			 
	   }
	 }
   if(R2==0)
   {
	   while(R2==0)
    {
			 key=10;
			
	   }
	  }
	  if(R3==0)
   {
	   while(R3==0)
    {
			 key=9;
			 
	   }
	  }
	   if(R4==0)
   {
	   while(R4==0)
    {
			 key=8;
			
	   }
	  }
	 
		L3=0;
	 L2=L1=L4=1;
	 R1=R2=R3=R4=1;
	 if(R1==0)
   {
	   while(R1==0)
    {
			 key=15;
			 
	   }
	 }
   if(R2==0)
   {
	   while(R2==0)
    {
			 key=14;
			
	   }
	  }
	  if(R3==0)
   {
	   while(R3==0)
    {
			 key=13;
			 
	   }
	  }
	   if(R4==0)
   {
	   while(R4==0)
    {
			 key=12;
			
	   }
	  }
	 
		L4=0;
	 L2=L3=L1=1;
	 R1=R2=R3=R4=1;
	 if(R1==0)
   {
	   while(R1==0)
    {
			 key=19;
			 
	   }
	 }
   if(R2==0)
   {
	   while(R2==0)
    {
			 key=18;
			
	   }
	  }
	  if(R3==0)
   {
	   while(R3==0)
    {
			 key=17;
			 
	   }
	  }
	   if(R4==0)
   {
	   while(R4==0)
    {
			 key=16;
			
	   }
	  }
	 
} 

2.温度传感器ds18b20的实现

一下这些牢记

/*温度传感器要点
1.注意temp赋值前要进行初始化为0x0000。
2.注意给温度传感器Ds18b20给予初始化时,一个0xcc跳过ROM(就是跳过存储设备),一个0x44转化数据
中间给予一个延时,最好把数码管刷新放进去,然后再次初始化Ds18b20继续一个0xcc跳过存储设备,0xbc代表
着读取ds18b20中的数据。
3.最关键的一步ds18b20中的头文件onewire.h必须要将延时扩大10倍。
4.ds18b20芯片得到的数据是两个字节,从地位字节开始再到高字节介绍,且数据和位的关系如下,按下表进行转换即可
*/

分析次表的到后四位是小数部分且为0.0625的整倍数,高四位代表的正负,所以想到得到对应的温度,必须将第四位合理的去除,数字合理的放大,保留一位小数放大十倍即可。

在这里插入图片描述
onewire.c中的代码将delay延长10倍
在这里插入图片描述

代码如下(示例):

void Dis_DS18B20()
{   
	  unsigned char Hse=0,Lse=0;
	  init_ds18b20();
      Write_DS18B20(0xcc);
	  Write_DS18B20(0x44);
	  
	  Tm_delay(80);//这个延时必须加
	
	  init_ds18b20();
      Write_DS18B20(0xcc);
	  Write_DS18B20(0xbe);
	  
	  Lse=Read_DS18B20();
	  Hse=Read_DS18B20();
	 /* temp=0x0000;
	  temp=Hse;
	  temp=(temp<<8)|Lse;
	  temp=temp>>4;
	  temp=10*temp;
	  temp=temp+(Lse&0x0f)*0.625;*/
	
	 temp=0x0000;//一定要初始化不然报错
	 temp=(Lse>>4)*10+Hse*160+(Lse&0x0f)*0.625;
	 /*temp=Hse;
   temp=(temp<<8)|Lse;
	 temp=temp>>4;
	 temp=10*temp;
	 temp=temp+(Lse&0x0f)*0.625;*/
}

拿到温度即可去在数码管上进行显示

3.时间传感器ds1302的实现

该芯片的意思是,初始化是需要将读保护位打开然后将写入地址写入即可,伴随着时间的数据保存其中即可,以下是代码和数据图。
注意时间传感器采用的是bcw码就是用十六进制去表示是进制,比如需要写入数据16时只要写入0x16即可,读到的数据也需要去进行对应的处理,整除16为十位,16的余数为个位,
在这里插入图片描述

void Init_ds1302()
{  
	 Write_Ds1302_Byte(0x8e,0x00); //打开写保护位
     Write_Ds1302_Byte(0x80,0x40); //秒的初始化
	 Write_Ds1302_Byte(0x82,0x59); //分的初始化
	 Write_Ds1302_Byte(0x84,0x23); //时的初始化
	 
	 Write_Ds1302_Byte(0x8e,0x80); //打开读保护位
	
}

void Dis_Ds1302()
{
   buf[0]=Read_Ds1302_Byte(0x81);//读取秒的时间
   buf[1]=Read_Ds1302_Byte(0x83);//读取分的时间
   buf[2]=Read_Ds1302_Byte(0x85);//读取时的时间
}

总结

以上就是本人的总结,直接缩减就是,ds18b20温度流程就是

 1. 初始化函数
 2. 写入跳过ROM地址0xcc,转化数据地址044
 3. 再来初始化,写入跳过ROM地址0xcc,读取数据地址为0xbc,再从读取函数中获取数据第一次是第八位第二次是高八,然后转化数据即可。

ds1302总结

 1.地址分为读取和写入
 2.数据为bcm码十六进制表示十进制 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值