目录
1. DS18B20
1.1 DS18B20简介
1.1.1 特点
一线总线(单总线)接口传感器(ADC)
- 工作电压:3.0-5.5V
- 单线接口方式:D0
- 多点主网功能(多个DS18B20可以同时连在单总线上面)
- 使用不需要任何外围电路
- 工作温度:-55-+125℃(其中,当温度在-10~+85℃时,精度为+-0.5℃)
- 分辨率可以进行设置:9、10、11、12位等(9位:精度+-0.5℃,读取温度最小间隔93.75ms;10位:0.25;11位:0.125;12位:0.0625,默认12位,读取温度最小间隔750ms)
1.1.2 内部结构
R1、R0设置精度大小:
当温度为正时,高5位S都为0,实际温度=后11位值*分辨率(如12位:0.0625)
当温度为负时,高5位S都为1,实际温度=(后11位值取反+1)*分辨率(如12位:0.0625)
1.1.3 温度读取
1)初始化时序
2)写时序
3)读时序
DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令(0XCC)→发开始转换命令(0X44)→延时→复位→发送 SKIP ROM 命令(0XCC)→发读存储器命令 (0XBE)→连续读出两个字节数据(即温度)→结束。
2. 软件配置
3. 硬件设计
4. 软件设计
4.1 功能描述
系统开启时首先检测 DS18B20 温度传感器是否存 在,若存在输出相应的提示信息,然后间隔 500ms 读取一次 DS18B20 的温度,并 通过串口打印输出,最后让 DS0 指示灯不断闪烁,提示系统正常运行。
4.2 软件实现
- 初始化 DS18B20
- 编写读取温度函数
- 编写主函数
4.2.1 DS18B20.c
1.#include "DS18B20.h"
2.
3.void DS18B20_Set_IN(void)
4.{
5. // 使能对应GPIO时钟
6. RCC_APB2PeriphClockCmd(DS18B20_RCC, ENABLE);
7. // 初始化GPIO
8. GPIO_InitTypeDef GPIO_InitStructure;
9.
10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
11. GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
14.}
15.
16.
17.void DS18B20_Set_OUT(void)
18.{
19.
20. // 初始化GPIO
21. GPIO_InitTypeDef GPIO_InitStructure;
22.
23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
24. GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
25. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
27.}
28.
29.
30.void DS18B20_Reset(void)
31.{
32. DS18B20_Set_OUT();
33. DS18B20_OUT=0;
34. delay_us(750);
35. DS18B20_OUT=1;
36. delay_us(15);
37.}
38.
39.u8 DS18B20_Check(void)
40.{
41. u8 retry=0;
42. DS18B20_Set_IN();
43. while(DS18B20_IN&&(retry<200))
44. {
45. retry++;
46. delay_us(1);
47. }
48. if(retry>=200)
49. return 1;
50. else retry=0;
51. while((!DS18B20_IN)&&(retry<240))
52. {
53. retry++;
54. delay_us(1);
55. }
56. if(retry>=240)
57. return 1;
58. return 0;
59.}
60.
61.u8 DS18B20_Iint(void)
62.{
63. // 使能对应GPIO时钟
64. RCC_APB2PeriphClockCmd(DS18B20_RCC, ENABLE);
65. // 初始化GPIO
66. GPIO_InitTypeDef GPIO_InitStructure;
67.
68. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
69. GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
70. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
71. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
72.
73. DS18B20_Reset();
74.
75. return DS18B20_Check();
76.}
77.
78.void DS18B20_WriteByte(u8 data)
79.{
80. u8 i=0;
81. u8 testb=0;
82.
83. DS18B20_Set_OUT();
84.
85. for(i=0;i<8;i++)
86. {
87. testb=data&0x01;
88. data=data>>1;
89. if(testb==1)
90. {
91. DS18B20_OUT=0;
92. delay_us(2);
93. DS18B20_OUT=1;
94. delay_us(60);
95. }
96. else
97. {
98. DS18B20_OUT=0;
99. delay_us(60);
100. DS18B20_OUT=1;
101. delay_us(2);
102. }
103. }
104.}
105.
106.u8 DS18B20_ReadBit(void)
107.{
108. u8 data_bit=0;
109. DS18B20_Set_OUT();
110. DS18B20_OUT=0;
111. delay_us(2);
112. DS18B20_OUT=1;
113.
114. DS18B20_Set_IN();
115. delay_us(12);
116. if(DS18B20_IN)
117. {
118. data_bit=1;
119. }
120. else data_bit=0;
121. delay_us(50);
122.
123. return data_bit;
124.}
125.
126.u8 DS18B20_ReaDByte(void)
127.{
128. u8 i=0;
129. u8 data_bit=0;
130. u8 data_byte=0;
131.
132.
133. for(i=0;i<8;i++)
134. {
135. data_bit=DS18B20_ReadBit();
136. data_byte=(data_bit<<7)|(data_byte>>1);
137. }
138. return data_byte;
139.}
140.
141.float DS18B20_GetTemperture(void)
142.{
143. u8 Low_Byte=0;
144. u8 High_Byte=0;
145. u8 value=0;
146. float temperture_value=0;
147.
148. DS18B20_Reset();
149. DS18B20_Check();
150. DS18B20_WriteByte(0XCC);
151. DS18B20_WriteByte(0X44);
152. DS18B20_Reset();
153. DS18B20_Check();
154. DS18B20_WriteByte(0XCC);
155. DS18B20_WriteByte(0XBE);
156. Low_Byte=DS18B20_ReaDByte();
157. High_Byte=DS18B20_ReaDByte();
158.
159. value=High_Byte<<8;
160. value=value+Low_Byte;
161.
162. //value=(High_Byte<<8)+Low_Byte;
163.
164. if((value&0xf800)==0xf800)
165. {
166. value=(~value)+1;
167. temperture_value=value*(-0.0625);
168. }
169. else
170. {
171. temperture_value=value*0.0625;
172. }
173. return temperture_value;
174.}
4.2.2 DS18B20.h
1.#ifndef __DS18B20_H
2.#define __DS18B20_H
3.
4.#include "system.h"
5.#include "SysTick.h"
6.
7.#define DS18B20_PORT GPIOG
8.#define DS18B20_Pin GPIO_Pin_11
9.#define DS18B20_RCC RCC_APB2Periph_GPIOG
10.
11.// GPIO位带操作
12.#define DS18B20_OUT PGout(11)
13.#define DS18B20_IN PGin(11)
14.
15.u8 DS18B20_Iint(void);
16.void DS18B20_WriteByte(u8 data);
17.u8 DS18B20_ReaDByte(void);
18.float DS18B20_GetTemperture(void);
19.
20.#endif
4.2.3 main.c
1./* Includes ------------------------------------------------------------------*/
2.#include "system.h"
3.#include "LED.h"
4.#include "SysTick.h"
5.#include "USART.h"
6.#include "DS18B20.h"
7.
8./* 主函数main() --------------------------------------------------------------*/
9.int main()
10.{
11. // 自定义变量
12. u8 i=0;
13. float temperture=0;
14. // 初始化
15. SysTick_Iint(72);
16. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
17. LED_Init();
18. USART1_Iint(115200);
19. while(DS18B20_Iint())
20. {
21. printf("DS18B20初始化失败!\r\n");
22. delay_ms(500);
23. }
24. printf("DS18B20初始化成功!\r\n");
25.
26. while(1)
27. {
28. i++;
29.
30. if(i%50==0)
31. {
32. temperture=DS18B20_GetTemperture();
33. if(temperture<0)
34. {
35. printf("检测到的温度为:-");
36. }
37. else
38. {
39. printf("检测到的温度为: ");
40. }
41. printf("%.2f℃\r\n", temperture);
42. }
43. delay_ms(10);
44.
45. if(i%20==0)
46. {
47. LED0=!LED0;
48. }
49.
50. delay_ms(10);
51. }
52.}