STM32 DS18B20实验

STM32 DS18B20实验

项目介绍

使用STM32余DS18B20进行连接,并通过串口函数将数据传送到PC机进行显示。

知识点

  • 1、DS18B20是一种单总线的温度传感器。现场温度直接通过单总线以数字方式进行传输。
  • 2、每一个DS18B20均具有一个唯一的64位的ROM序列号,这个唯一的序列号可以保证在单总线上挂载多个DS18B20设备。
  • 3、DS18B20具有9字节的RAM,其中0,1字节用于暂存温度信息,后三位为EERAM用于存储配置信息。
  • 4、DS18B20经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
  • 5、DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位–>SKIP ROM命令( 0XCC)–>发开始转换命令( 0X44) –>延时–>复位–>发送 SKIP ROM 命令( 0XCC)–>发读存储器命令( 0XBE) –>连续读出两个字节数据(即温度)–>结束
  • 6、单总线是DALLAS公司推出的外围串行扩展总线。单总线只用一根数据输出/输入线DQ,既传输数据位,又传输时间同步信号,而且数据是双向的。

部分代码

  • 1、这部分代码为对DS18B20的主要操作。包括了初始化,读写数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "ds18b20.h"

/*******************************************************************************
* 函 数 名 : ds18b20_init
* 函数功能 : IO端口时钟初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_init()
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);

GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名 : DQININT
* 函数功能 : 输入配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DQININT() //输入配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名 : DQOUTINT
* 函数功能 : 输出配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DQOUTINT() //输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名 : ds18b20init
* 函数功能 : DS18B20初始化时序
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20init()
{
DQOUTINT();//输出
ds18b20_dq_L;
delay_us(480);//延时480微妙
ds18b20_dq_H;
delay_us(480);//延时480微妙
}

/*******************************************************************************
* 函 数 名 : ds18b20wr
* 函数功能 : DS18B20写数据时序
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void ds18b20wr(u8 dat)
{
u8 i=0;
DQOUTINT();//输出

for(i=0;i<8;i++)
{
ds18b20_dq_L; //拉低
delay_us(15);//延时15微妙

if((dat&0x01)==1)
{
ds18b20_dq_H;
}
else
{
ds18b20_dq_L;
}
delay_us(60);//延时60微妙
ds18b20_dq_H;

dat>>=1;//准备下一位数据的发送
}
}

/*******************************************************************************
* 函 数 名 : DS18b20rd
* 函数功能 : DS18B20读数据时序
* 输 入 : 无
* 输 出 : value
*******************************************************************************/
u8 DS18b20rd()
{
u8 i=0,value=0;

for(i=0;i<8;i++)
{
value>>=1;
DQOUTINT();//输出
ds18b20_dq_L; //拉低
delay_us(4);//延时4微妙
ds18b20_dq_H;
delay_us(10);//延时10微妙
DQININT(); //输入配置

if(GPIO_ReadInputDataBit(GPIO_ds18b20,dq)==1)
{
value|=0x80;//读数据 从低位开始
}

delay_us(45);//延时45微妙
}

return value;
}

/*******************************************************************************
* 函 数 名 : readtemp
* 函数功能 : DS18B2温度寄存器配置,温度读取
* 输 入 : 无
* 输 出 : value
*******************************************************************************/
double readtemp() //读取温度内需要复位的
{
u16 temp;
u8 a,b;
double value;
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0x44); //发送温度转换指令
delay_ms(800);
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0xbe); //发读暂存器指令
a=DS18b20rd(); //温度的低八位
b=DS18b20rd(); //温度的高八位
temp=b;
temp=(temp<<8)+a;
if((temp&0xf800)==0xf800)
{
temp=(~temp)+1;
value=temp*(-0.0625);
}
else
{
value=temp*0.0625;
}
return value;
}