本文参考该博主而写,这位博主大大写的十分详细,大家有兴趣可以去参考
我之所以再 画蛇添足 写这个是因为我想记录一下我作为小白视角如何去使用
很多同学刚开始写的时候,看到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)串口验证
这里的话,就是把读取的数据放到串口上进行打印,方便我们在测试的时候用!