一、DS18B20的温度转换与读取流程
- DS18B20复位
- 写入字节0XCC,跳过ROM指令
- 写入字节0X44,开始温度转换
- 延时700-900ms
- DS18B20复位
- 写入字节0XCC,跳过ROM指令
- 写入字节0XBE,读取高速暂存器
- 读取暂存器的第0字节,即温度数据的LSB
- 读取暂存器的第1字节,即温度数据的MSB
- DS18B20复位,表示读取数据结束
- 将LSB和MSB整合成为一个16位数据
- 判断读取结果的符号进行正负温度的数据读取
二、DS18B20的数据处理
- DS18B20以16位带符号位扩展的二进制补码形式读出
- 低4位为小数部分,中间7位为整数部分,高5位为符号位

- DS18B20的分辨率为0.0625。读出数据为正温度时,将LSB和MSB整合成的16位整数,直接乘以0.0625即可。读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625
- 注意:在上电复位的时候,温度寄存器中的值为0X0550,即**+85**摄氏度
三、代码展示
main.c
#include "reg52.h"
#include "onewire.h"
typedef unsigned int uint;
typedef unsigned char uchar;
uint temp = 0;
uchar SMG_duanma[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
uchar SMGDot_AC[10] =
{0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
void SelectHC138(uchar channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0X1F) | 0X80;
break;
case 5:
P2 = (P2 & 0X1F) | 0Xa0;
break;
case 6:
P2 = (P2 & 0X1F) | 0Xc0;
break;
case 7:
P2 = (P2 & 0X1F) | 0Xe0;
break;
case 0:
P2 = (P2 & 0X1F) | 0X00;
break;
}
}
void Delay_SMG(uint t)
{
while(t--);
}
void DisplaySMG_Bit(uchar pos, uchar value)
{
SelectHC138(6);
P0 = 0X01 << pos;
SelectHC138(7);
P0 = value;
}
void Initsys()
{
SelectHC138(5);
P0 = 0X00;
SelectHC138(4);
P0 = 0XFF;
}
void Display_All(uchar dat)
{
SelectHC138(6);
P0 = 0XFF;
SelectHC138(7);
P0 = dat;
}
void DisplaySMG_Temp()
{
DisplaySMG_Bit(7,SMG_duanma[temp % 10]);
Delay_SMG(100);
DisplaySMG_Bit(6,SMGDot_AC[(temp % 100) / 10]);
Delay_SMG(100);
DisplaySMG_Bit(5,SMG_duanma[temp / 100]);
Delay_SMG(100);
DisplaySMG_Bit(4,0XFF);
Delay_SMG(100);
DisplaySMG_Bit(3,0XFF);
Delay_SMG(100);
DisplaySMG_Bit(2,0XFF);
Delay_SMG(100);
DisplaySMG_Bit(1,0XFF);
Delay_SMG(100);
DisplaySMG_Bit(0,0XFF);
Delay_SMG(100);
Display_All(0XFF);
}
void Delay_temp(uint t)
{
while(t--)
{
DisplaySMG_Temp();
}
}
void read_DS18B20_temp()
{
uchar LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = MSB;
temp <<= 8;
temp = temp | LSB;
if((temp & 0xf800) == 0x0000)
{
temp >>= 4;
temp = temp * 10;
temp = temp + (LSB & 0x0f) * 0.625;
}
}
void main()
{
Initsys();
while(1)
{
read_DS18B20_temp();
DisplaySMG_Temp();
}
}
onewire.c
#include "reg52.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t)
{
while(t--);
}
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(50);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned char rd_temperature(void);
Delay_OneWire(uint);
bit init_ds18b20(void);
unsigned char Read_DS18B20(void);
void Write_DS18B20(unsigned char dat);
#endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)