蓝桥杯-ds18b20使用(小白专享)

本文参考该博主而写,这位博主大大写的十分详细,大家有兴趣可以去参考

DS18B20驱动详解(蓝桥杯单片机)_WillPower-CSDN博客_蓝桥杯ds18b20程序https://willpower.blog.csdn.net/article/details/114339725

我之所以再 画蛇添足 写这个是因为我想记录一下我作为小白视角如何去使用


很多同学刚开始写的时候,看到ds18b20参数手册一定都是晕的,不知道怎么写,怎么办!其实我也是,我在写这篇文章的时候,依旧搞不清楚!!!但是,这不影响我参加比赛(除非规则改了),正常来说,我们能写出来就行,不用搞原理!!!如果你也是这种心态,那么就继续看下去叭。如果不是,请看上面的博客!!!

强调!有了这篇文章,你不需要再看 ds18b20介绍!!!你已经可以得到温度值了!!!

关于这个温度传感器,我们分为三部分进行学习!

(1)改官方驱动

(2)写自己驱动

(3)串口验证

(1)改官方驱动

这一步其实很简单,你就把这个背下来写上去就行,是吧,没有操作难度的!

如果你觉得麻烦,我直接把所有  onewire.c 代码我复制在这里了!!!

注意事项:(1) onewire.h里面的函数声明不全,记得补上!!!

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"
#include "onewire.h"



//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t = t * 8;
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		EA = 0;
		DQ = 0;
		Delay_OneWire(1);
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}
		EA = 1;	    
		Delay_OneWire(1);
	}
	return dat;
}

bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(8);// 
    initflag = DQ;     
  	Delay_OneWire(5);  
  	return initflag;
}






(2)写自己驱动

这里的驱动也很简单,因为不长,这边建议直接背下来!!因为真的不多!!!

代码已经放在下面!!,我会稍微解释一下,方便你理解记忆!!!

uint ReadTemp()
{

	uint tmpVal = 0;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	while(!DQ);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	tmpVal = Read_DS18B20();
	tmpVal = ((uint)Read_DS18B20() << 8) | 	tmpVal;
	tmpVal = tmpVal*0.0625;
	return 	tmpVal;
}

1:定义温度值变量 tmpVal

2:ds18b20初始化

3:写入 0xcc 跳过rom指令(直接写,别管,都是死的)

4:写入 0x44 开始温度转换

5:等待温度转换完成

【开始重复】

6:ds18b20初始化

7:写入 0xcc 跳过rom指令(直接写,别管,都是死的)

8:写入 0xbe 读取转换的温度值

9:把读取值赋值给 tmpVal

10:把 tmpVal 进行转化,也就是第二次的高8位 和 第一次的 低八位结合(直接写,别管,都是死的)

11:温度值的精度*0.0625

很多小伙伴看到这个代码肯定也不懂是怎么回事!但是没关系!放心写!对于小白来说完全够了

补充说明:

求温度整数:

tmpVal = tmpVal*0.0625;
float tmpVal = ReadTemp();
printf("%.0f\r\n", tmpVal);

求温度两位小数:

tmpVal = tmpVal*6.25;
float tmpVal = ReadTemp();
tmpVal = tmpVal / 100;
printf("%.2f\r\n", tmpVal);

(3)串口验证

这里的话,就是把读取的数据放到串口上进行打印,方便我们在测试的时候用!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值