我们先来看一下 DS18B20 的硬件原理图:
DS18B20 通过编程,可以实现最高 12 位的温度存储值,在寄存器中,以补码的格式存储,如图所示。
下面我们就写一个程序,将读到的温度值显示在 1602 液晶上,并且保留一位小数位。
/**
1、温度从哪里来–》DS18B20传感器,
2、怎么去获取温度,配置好了,何时去取出温度?,需要过多久你才去拿一次温度的值
时间操作 -》 定时器操作 —> 中断 + 标志位
3、取出温度后,要进行怎样的处理? 数据类型的一个转换处理, 整型 -》 字符串型
4、温度的值有可能是负数,也有可能是正数, -》》 做一个判断
5、相关显示操作
**/
/ds18b20.h文件程序源代*/
#ifndef _DS18B20_H_
#define _DS18B20_H_
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//实现位绑定操作
sbit DS18B20_IO = P3^2;
/**初始化DS18B20**/
bit InitDS18B20ACK();
/**us延时函数**/
void delay_10us(uchar count);
/**向DS18B20写入一个字节的数据**/
void writeToDs18b20(uchar dat);
/**向DS18B20读取一个字节的数据**/
uchar readeToDs18b20();
/**启动DS18B20进行温度的采集以及转换,并返回读取成功与否**/
bit startDs18b20();
/**读取DS18B20中的温度转换,并返回读取成功与否,而已还需要吧温度回去**/
bit getTempForDs18b20(int *temp);
#endif
/ds18b20.c文件程序源代*/
#include "ds18b20.h"
//DS18B20_IO = 0;
/**初始化DS18B20**/
bit InitDS18B20ACK(){
bit ACK;//用来判断DS18B20是否初始化成功
EA = 0;
DS18B20_IO = 0;
delay_10us(60);
DS18B20_IO = 1;
delay_10us(5);
ACK = DS18B20_IO;
while(!DS18B20_IO);//等待脉冲结束
EA = 1;
return ACK;
}
/**向DS18B20写入一个字节的数据**/
void writeToDs18b20(uchar dat){
uchar mask;
EA = 0;//关闭总中断开关
for(mask = 0x01; mask != 0; mask <<= 1){
DS18B20_IO = 0;
_nop_();
_nop_();
if