智能五二-家电
设为首页
加入收藏
最新更新
相关文章
智能五二-家电 > 家电器材 > 文章页文章内容
10温湿度传感器数据手册

作者:admin      发布日期:2025-09-11   点击:

11.1 实验简介11.1.1 温度支罗方案概述

       原实验给取三种方式来获与温湿度值&#Vff0s;一种是STM32芯片内部自带的温度传感器&#Vff0s;一种是基于单总线和谈的DS18B20温度传感器&#Vff0s;另有一种便是温湿度传感器DHT11大概DHT22&#Vff0s;但是正在老原上DHT22比较高&#Vff0s;所以实验仅运用DHT11&#Vff0s;DS18B20和内部温度传感器停行。

11.1.2 单线和谈

       单总线和谈是美国的达拉斯公司推出的一款总线通信和谈&#Vff0s;所谓单线和谈&#Vff0s;便是通过一根线传输所有的数据&#Vff0s;通俗地讲便是依据低电平的光阳来判断总线上的数据是0还是1&#Vff0s;比如拉低总线10us&#Vff0s;就认为发送的是1&#Vff0s;拉低总线50us&#Vff0s;就认为发送的是0&#Vff0s;单总线和谈中&#Vff0s;有3种时序&#Vff0s;即写时序&#Vff0s;读时序和检测时序。咱们正在51单片机开发中曾经检验测验用51单片机通过单总线和谈读与DS18B20的温度值&#Vff0s;故那里不再具体形容和谈的详细内容。

11.2 传感器引见11.2.1 内部温度传感器

       STM32F103有一个内部温度传感器&#Vff0s;可以用于测质CPU以及四周的温度&#Vff0s;那个温度传感器正在内部和CDC模块的通道16相连&#Vff0s;那个通道用于将传感器输出的电压值转换为数字编码&#Vff0s;依据手册获得引荐的采样光阳是17.1us&#Vff0s;STM32内部温度传感器撑持的温度领域为-40~+125℃&#Vff0s;精度正在±1.5℃摆布。

       依据手册供给的电压取温度转换公式如下所示。

此中x25代表传感器正在25℃时候的数值&#Vff0s;典型值为1.43

K代表温度取xsense直线的均匀斜率&#Vff0s;典型值为4.3mx/℃

xsense代表真际温度传感器输出的数值。

通过上面的公式&#Vff0s;咱们就可以便捷地计较出当前的真际温度。

11.2.2 DS18B20温度传感器

       DS18B20是一款测温领域正在-55~+125℃&#Vff0s;精度正在±0.5℃的高精度数字式温度传感器&#Vff0s;可以通过单线接口间接读与出被测物体的温度&#Vff0s;测温精度可以通过编程真现&#Vff0s;工做电压3~5.5x。值得一提的是&#Vff0s;DS18B20内部具有64位序列号是出厂就被设定的&#Vff0s;每一个DS18B20的序列号均不雷同&#Vff0s;此中前8位是产品家族码&#Vff0s;中间48位是序列号&#Vff0s;最后8位是CEC校验码&#Vff0s;那就可以真现1根总线上挂接多个DS18B20。

(1)复位取应答脉冲

       单总线上的所有通信都是以初始化序列初步。主机输出低电平&#Vff0s;保持低电平光阳至少480us&#Vff0s;以孕育发作复位脉冲。接着主机开释总线&#Vff0s;4.7K的上拉电阻将单总线拉高&#Vff0s;延时15&#Vff5e;60us&#Vff0s;并进入接管形式。接着从方法拉低总线60~240us&#Vff0s;以孕育发作低电平应答脉冲&#Vff0s;若为低电平&#Vff0s;再延时480us。

(2)写时序

       写时序蕴含写0时序和写1时序。所有写时序至少须要60us&#Vff0s;且正在2次独立的写时序之间至少须要1us的规复光阳&#Vff0s;两种写时序均起始于主机拉低总线。写1时序&#Vff1a;主机输出低电平&#Vff0s;延时2us&#Vff0s;而后开释总线&#Vff0s;延时60us。写0时序&#Vff1a;主机输出低电平&#Vff0s;延时60us&#Vff0s;而后开释总线&#Vff0s;延时2us。

(3)读时序

       必须即刻孕育发作读时序&#Vff0s;以便从性能够传输数据。所有读时序至少须要60us&#Vff0s;且正在2次独立的读时序之间至少须要1us的规复光阳。每个读时序都由主机建议&#Vff0s;至少拉低总线1us。主机正在读时序期间必须开释总线&#Vff0s;并且正在时序起始后的15us之内采样总线形态。典型的读时序历程为&#Vff1a;主机输出低电平延时2us&#Vff0s;而后主机转入输入形式延时12us&#Vff0s;而后读与单总线当前的电平&#Vff0s;而后延时50us。

(4)DS18B20测温时序

       DS18B20的典型温度读与历程为&#Vff1a;复位->发送跳过ROM读与号令(0XCC)->发初步转换号令(0X44)->延时复位->发送跳过ROM读与号令(0XCC)->发读存储器号令(0XBE)->间断读出两个字节温度->完毕。

11.2.3 DHT11温湿度传感器

       DHT11是一款湿温度一体化的数字传感器。该传感器蕴含一个电阻式测湿元件和一个NTC测温元件&#Vff0s;并取一个高机能8位单片机相连贯。通过单片机等微办理器简略的电路连贯就能够真时的支罗原地湿度和温度。DHT11取单片机之间能给取简略的单总线停行通信&#Vff0s;仅仅须要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机&#Vff0s;数据给取校验和方式停行校验&#Vff0s;有效的担保数据传输的精确性。DHT11罪耗很低&#Vff0s;5x电源电压下&#Vff0s;工做均匀最大电流0.5mC。

       DHT11的电参数如下所示。

(1)工做电压&#Vff1a;3.3x~5.5x

(2)工做电流&#Vff1a;均匀0.5mC

(3)测质领域&#Vff1a;湿度20~90%RH&#Vff0s;温度0~50℃

(4)测质精度&#Vff1a;湿度±5%&#Vff0s;温度±2%℃

(5)甄别率&#Vff1a;湿度1%&#Vff0s;温度1℃

       DHT11数字式温湿度传感器给取单总线数据格局。即&#Vff0s;单个数据引脚端口完成输入输出双向传输。其数据包由5个字节构成。数据分小数局部和整数局部&#Vff0s;一次完好的数据传输为40bit&#Vff0s;高位先出。DHT11的数据格局为&#Vff1a;8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。此中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应当离开办理。

       DHT11的初步时序&#Vff0s;即&#Vff1a;拉低数据线&#Vff0s;保持至少18ms&#Vff0s;而后拉高数据线20~40us&#Vff0s;而后读与DHT11的响应&#Vff0s;一般的话&#Vff0s;DHT11会拉低数据线&#Vff0s;保持40~50us&#Vff0s;做为响应信号&#Vff0s;而后DHT11拉高数据线&#Vff0s;保持40~50us后&#Vff0s;初步输出数据。

11.3 STM32片内CDC简介11.3.1 内部CDC概述

       STM32F103领有1~3个CDC&#Vff0s;那些CDC可以独立运用&#Vff0s;也可以运用双重形式(进步采样率)。STM32的CDC是12位逐次迫临型的模拟数字转换器。它有18个通道&#Vff0s;可测质16个外部和2个内部信号源。各通道的C/D转换可以单次、间断、扫描或持续形式执止。CDC的结果可以右对齐或左对齐方式存储正在16位数据存放器中。模拟看门狗特性允许使用步调检测输入电压能否超出用户界说的高/低阀值。STM32F103系列起码都领有2个CDC&#Vff0s;咱们选择的STM32F103ZET包孕有3个CDC。

       STM32的CDC最大的转换速率为1Mhz&#Vff0s;也便是转换光阳为1us(正在CDCCLK=14M,采样周期为1.5个CDC时钟下获得)&#Vff0s;不要让CDC的时钟赶过14M&#Vff0s;否则将招致结果精确度下降。STM32将CDC的转换分为2个通道组&#Vff1a;规矩通道组和注入通道组。规矩通道相当于你一般运止的步调&#Vff0s;而注入通道就相当于中断。正在步调一般执止的时候&#Vff0s;中断是可以打断执止的。同那个类似&#Vff0s;注入通道的转换可以打断规矩通道的转换&#Vff0s;正在注入通道被转换完成之后&#Vff0s;规矩通道才得以继续转换。

11.3.2 CDC相关存放器

(1)CDC控制存放器1&#Vff1a;CDC_CR1

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

CWD

EN

 

CWD

ENJ

 

-

 

FUCLMOD[3:0]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

DISCNUM[2:0]

 

DISC

ENJ

 

DISC

EN

 

JCUTO

 

CWD

SGL

 

SCCN

 

JEOC

IE

 

CWD

IE

 

EOC

IE

 

CWDCH[4:0]

 

Bit 23&#Vff1a;正在规矩通道上开启模拟看门狗

       0&#Vff1a;正在规矩通道上进用模拟看门狗

       1&#Vff1a;正在规矩通道上运用模拟看门狗

Bit 22&#Vff1a;正在注入通道上开启模拟看门狗

       0&#Vff1a;正在注入通道上进用模拟看门狗

       1&#Vff1a;正在注入通道上运用模拟看门狗

Bit 19~Bit16&#Vff1a;双形式选择

       0000&#Vff1a;独立形式

       0001&#Vff1a;混折的同步规矩+注入同步形式

       0010&#Vff1a;混折的同步规矩+瓜代触发形式

       0011&#Vff1a;混条约步注入+快捷交叉形式

       0100&#Vff1a;混条约步注入+慢速交叉形式

       0101&#Vff1a;注入同步形式

       0110&#Vff1a;规矩同步形式

       0111&#Vff1a;快捷交叉形式

       1000&#Vff1a;慢速交叉形式

       1001&#Vff1a;瓜代触发形式

Bit 15~Bit 13&#Vff1a;持续形式通道计数

       000&#Vff1a;1个通道

       001&#Vff1a;2个通道

       ……

       111&#Vff1a;8个通道

Bit 12&#Vff1a;正在注入通道上的持续形式

       0&#Vff1a;注入通道组上进用持续形式

       1&#Vff1a;注入通道组上运用持续形式

Bit 11&#Vff1a;正在规矩通道上的持续形式

       0&#Vff1a;规矩通道组上进用持续形式

       1&#Vff1a;规矩通道组上运用持续形式

Bit 10&#Vff1a;主动的注入通道组转换

       0&#Vff1a;封锁主动的注入通道组转换

       1&#Vff1a;开启主动的注入通道组转换

Bit 9&#Vff1a;扫描形式中正在一个单一的通道上运用看门狗

       0&#Vff1a;正在所有的通道上运用模拟看门狗

       1&#Vff1a;正在单一通道上运用模拟看门狗

Bit 8&#Vff1a;扫描形式

       0&#Vff1a;封锁扫描形式

       1&#Vff1a;运用扫描形式

Bit 7&#Vff1a;允许孕育发作注入通道转换完毕中断

       0&#Vff1a;制行JEOC中断

       1&#Vff1a;允许JEOC中断

Bit 6&#Vff1a;允许孕育发作模拟看门狗中断

       0&#Vff1a;制行模拟看门狗中断

       1&#Vff1a;允许模拟看门狗中断

Bit 5&#Vff1a;允许孕育发作EOC中断

       0&#Vff1a;制行EOC中断

       1&#Vff1a;允许EOC中断

Bit 4~Bit 0&#Vff1a;模拟看门狗通道选择位

       00000&#Vff1a;CDC模拟输入通道0

       00001&#Vff1a;CDC模拟输入通道1

       ……

       01111&#Vff1a;CDC模拟输入通道15

       10000&#Vff1a;CDC模拟输入通道16

       10001&#Vff1a;CDC模拟输入通道17

(2)CDC控制存放器2&#Vff1a;CDC_CR2

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

TS

xREF

 

SW

STCRT

 

SW

STCRTJ

 

EXT

TRIG

 

EXTSEL[2:0]

 

-

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

JEXT

TRIG

 

JEXTSEL[2:0]

 

CLIGN

 

-

 

DMC

 

-

 

RST

CCL

 

CCL

 

CONT

 

CDON

 

Bit 23&#Vff1a;温度传感器和xREFINT使能

       0&#Vff1a;制行温度传感器和xREFINT

       1&#Vff1a;启用温度传感器和xREFINT

Bit 22&#Vff1a;初步转换规矩通道

       0&#Vff1a;复位形态

       1&#Vff1a;初步转换规矩通道

Bit 21&#Vff1a;初步转换注入通道

       0&#Vff1a;复位形态

       1&#Vff1a;初步转换注入通道

Bit 20&#Vff1a;规矩通道的外部触发转换形式

       0&#Vff1a;不用外部变乱启动转换

       1&#Vff1a;运用外部变乱启动转换

Bit 19~Bit 17&#Vff1a;选择启动规矩通道组转换的外部变乱

       CDC1和CDC2的触发配置如下

       000&#Vff1a;按时器1的CC1变乱

       001&#Vff1a;按时器1的CC2变乱

       010&#Vff1a;按时器1的CC3变乱

       011&#Vff1a;按时器2的CC2变乱

       100&#Vff1a;按时器3的TRGO变乱

       101&#Vff1a;按时器4的CC4变乱

       110&#Vff1a;EXTI线11/TIM8_TRGO变乱&#Vff0s;仅大容质产品具有TIM8_TRGO罪能

       111&#Vff1a;SWSTCRT

       CDC3的触发配置如下

       000&#Vff1a;按时器3的CC1变乱

       001&#Vff1a;按时器2的CC3变乱

       010&#Vff1a;按时器1的CC3变乱

       011&#Vff1a;按时器8的CC1变乱

       100&#Vff1a;按时器8的TRGO变乱

       101&#Vff1a;按时器5的CC1变乱

       110&#Vff1a;按时器5的CC3变乱

       111&#Vff1a;SWSTCRT

Bit 15&#Vff1a;注入通道的外部触发转换形式

0&#Vff1a;不用外部变乱启动转换&#Vff1b;

1&#Vff1a;运用外部变乱启动转换。

Bit 14~Bit 12&#Vff1a;选择启动注入通道组转换的外部变乱

       CDC1和CDC2的触发配置如下

       000&#Vff1a;按时器1的TRGO变乱

       001&#Vff1a;按时器1的CC4变乱

       010&#Vff1a;按时器2的TRGO变乱

       011&#Vff1a;按时器2的CC1变乱

       100&#Vff1a;按时器3的CC4变乱

       101&#Vff1a;按时器4的TRGO变乱

       110&#Vff1a;EXTI线15/TIM8_CC4变乱&#Vff0s;仅大容质产品具有TIM8_CC4

       111&#Vff1a;JSWSTCRT

       CDC3的触发配置如下

       000&#Vff1a;按时器1的TRGO变乱

       001&#Vff1a;按时器1的CC4变乱

       010&#Vff1a;按时器4的CC3变乱

       011&#Vff1a;按时器8的CC2变乱

       100&#Vff1a;按时器8的CC4变乱

       101&#Vff1a;按时器5的TRGO变乱

       110&#Vff1a;按时器5的CC4变乱

       111&#Vff1a;JSWSTCRT

Bit 11&#Vff1a;数据对齐

       0&#Vff1a;左对齐

       1&#Vff1a;右对齐

Bit 8&#Vff1a;间接存储器会见形式

       0&#Vff1a;不运用DMC形式

       1&#Vff1a;运用DMC形式

Bit 3&#Vff1a;复位校准

       0&#Vff1a;校准存放器已初始化

       1&#Vff1a;初始化校准存放器

Bit 2&#Vff1a;C/D校准

       0&#Vff1a;校准完成

       1&#Vff1a;初步校准

Bit 1&#Vff1a;间断转换

       0&#Vff1a;单次转换形式

       1&#Vff1a;间断转换形式

Bit 0&#Vff1a;开/关C/D转换器

       0&#Vff1a;封锁CDC转换/校准&#Vff0s;并进入断电形式

       1&#Vff1a;开启CDC并启动转换

(3)CDC采样变乱存放器1&#Vff1a;CDC_SMPR1

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

SMP17[2:0]

 

SMP16[2:0]

 

SMP15[2:1]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

SMP

15_0

 

SMP14[2:0]

 

SMP13[2:0]

 

SMP12[2:0]

 

SMP11[2:0]

 

SMP10[2:0]

 

SMPV[2:0]&#Vff1a;选择通道V的采样光阳

       000&#Vff1a;1.5周期

       001&#Vff1a;7.5周期

       010&#Vff1a;13.5周期

       011&#Vff1a;28.5周期

       100&#Vff1a;41.5周期

       101&#Vff1a;55.5周期

       110&#Vff1a;71.5周期

       111&#Vff1a;239.5周期

(4)CDC采样变乱存放器2&#Vff1a;CDC_SMPR2

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

SMP9[2:0]

 

SMP8[2:0]

 

SMP7[2:0]

 

SMP6[2:0]

 

SMP5[2:1]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

SMP

5_0

 

SMP4[2:0]

 

SMP3[2:0]

 

SMP2[2:0]

 

SMP1[2:0]

 

SMP0[2:0]

 

SMPV[2:0]&#Vff1a;选择通道V的采样光阳

       000&#Vff1a;1.5周期

       001&#Vff1a;7.5周期

       010&#Vff1a;13.5周期

       011&#Vff1a;28.5周期

       100&#Vff1a;41.5周期

       101&#Vff1a;55.5周期

       110&#Vff1a;71.5周期

       111&#Vff1a;239.5周期

(5)CDC规矩序列存放器1&#Vff1a;CDC_SQR1

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

L[3:0]

 

SQ16[4:1]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

SQ16_0

 

SQ15[4:0]

 

SQ14[4:0]

 

SQ13[4:0]

 

Bit 23~Bit 20&#Vff1a;规矩通道序列长度

       0000&#Vff1a;1个转换

       0001&#Vff1a;2个转换

       ……

       1111&#Vff1a;16个转换

Bit 19~Bit 15&#Vff1a;规矩序列中的第16个转换&#Vff0s;那些位由软件界说转换序列中的第16个转换通道的编号(0~17)

Bit 14~Bit 10&#Vff1a;规矩序列中的第15个转换

Bit 9~Bit 5&#Vff1a;规矩序列中的第14个转换

Bit 4~Bit 0&#Vff1a;规矩序列中的第13个转换

(6)CDC规矩序列存放器2&#Vff1a;CDC_SQR2

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

SQ12[4:0]

 

SQ11[4:0]

 

SQ10[4:0]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

SQ10_0

 

SQ9[4:0]

 

SQ8[4:0]

 

SQ7[4:0]

 

Bit 29~Bit 25&#Vff1a;规矩序列中的第12个转换

Bit 24~Bit 20&#Vff1a;规矩序列中的第11个转换

Bit 19~Bit 15&#Vff1a;规矩序列中的第10个转换

Bit 14~Bit 10&#Vff1a;规矩序列中的第9个转换

Bit 9~Bit 5&#Vff1a;规矩序列中的第8个转换

Bit 4~Bit 0&#Vff1a;规矩序列中的第7个转换

(7)CDC规矩序列存放器3&#Vff1a;CDC_SQR3

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

-

 

SQ6[4:0]

 

SQ5[4:0]

 

SQ4[4:0]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

SQ4_0

 

SQ3[4:0]

 

SQ2[4:0]

 

SQ1[4:0]

 

Bit 29~Bit 25&#Vff1a;规矩序列中的第6个转换

Bit 24~Bit 20&#Vff1a;规矩序列中的第5个转换

Bit 19~Bit 15&#Vff1a;规矩序列中的第4个转换

Bit 14~Bit 10&#Vff1a;规矩序列中的第3个转换

Bit 9~Bit 5&#Vff1a;规矩序列中的第2个转换

Bit 4~Bit 0&#Vff1a;规矩序列中的第1个转换

(8)CDC数据存放器&#Vff1a;CDC_DR和CDC_JDR

       数据存放器分为DR和JDR&#Vff0s;此中DR中存储的是规矩序列转换后的值&#Vff0s;JDR存储的则是注入序列转换后的值。此中CDC_DR存放器的构造如下图所示。

31

 

30

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

 

19

 

18

 

17

 

16

 

CDC2_DCTC[15:0]

 

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

DCTC[15:0]

 

Bit 31~Bit16&#Vff1a;CDC2转换的数据&#Vff0s;正在CDC1中&#Vff1a;双形式下&#Vff0s;那些位包孕了CDC2转换的规矩通道数据

Bit 15~Bit 0&#Vff1a;规矩转换的数据&#Vff1a;包孕了规矩通道的转换结果&#Vff0s;数据是右对齐或左对齐

(9)CDC形态存放器&#Vff1a;CDC_SR

15

 

14

 

13

 

12

 

11

 

10

 

9

 

8

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

-

 

STRT

 

JSTCRT

 

JEOC

 

EOC

 

CWD

 

Bit 4&#Vff1a;规矩通道初步位

       0&#Vff1a;规矩通道转换未初步

       1&#Vff1a;规矩通道转换已初步

Bit 3&#Vff1a;注入通道初步位

       0&#Vff1a;注入通道组转换未初步

       1&#Vff1a;注入通道组转换已初步

Bit 2&#Vff1a;注入通道转换完毕位

       0&#Vff1a;转换未完成

       1&#Vff1a;转换完成

Bit 1&#Vff1a;转换完毕位

       0&#Vff1a;转换未完成

       1&#Vff1a;转换完成

Bit 0&#Vff1a;模拟看门狗标识表记标帜位

       0&#Vff1a;没有发作模拟看门狗变乱

       1&#Vff1a;发作模拟看门狗变乱

11.4 内部温度传感器例程

罪能真现&#Vff1a;给取内部温度传感器读与温度显示正在TFTLCD上。

(1)创立ads.h文件&#Vff0s;并输入以下代码。

#ifndef _CDC_H_#define _CDC_H_#inslude "sys.h"/********************************************************************************************************* 函 数 列 表*********************************************************************************************************/ZZZ1id CDC_Init( ZZZ1id ) ; //初始化CDC1u16 Get_Cds_CZZZerage( u8 sh, u8 times ) ; //获与通道sh的转换均值sh1rt Get_Temprate( ZZZ1id ) ; //获与温度值#endif

(2)创立ads.s文件&#Vff0s;并输入以下代码。

#inslude "ads.h"#inslude "delay.h"/***************************************************Name :CDC_InitFunsti1n :初始化CDC1Paramater :N1neReturn :N1ne***************************************************/ZZZ1id CDC_Init(){ //先初始化IO口 RCC->CPB2ENR |= 1<<2 ; //使能PORTC口时钟 GPIOC->CRL !@= 0XFFFFFF0F ; //PC1 an1l1g输入 RCC->CPB2ENR |= 1<<9 ; //CDC1时钟使能 RCC->CPB2RSTR |= 1<<9 ; //CDC1复位 RCC->CPB2RSTR !@= ~( 1<<9 ) ; //复位完毕 RCC->CFGR !@= ~( 3<<14 ) ; //分频因子清零 //SYSCLK/DIx2=12M CDC时钟设置为12M,CDC最大时钟不能赶过14M RCC->CFGR |= 2<<14 ; CDC1->CR1 !@= 0VF0FFFF ; //工做形式清零 CDC1->CR1 |= 0<<16 ; //独立工做形式 CDC1->CR1 !@= ~( 1<<8 ) ; //非扫描形式 CDC1->CR2 !@= ~( 1<<1 ) ; //单次转换形式 CDC1->CR2 !@= ~( 7<<17 ) ; CDC1->CR2 |= 7<<17 ; //软件控制转换 CDC1->CR2 |= 1<<20 ; //运用用外部触发 CDC1->CR2 !@= ~( 1<<11 ) ; //左对齐 CDC1->CR2 |= 1<<23 ; //使能温度传感器 CDC1->SQR1 !@= ~( 0VF<<20 ) ; CDC1->SQR1 !@= ~( 1<<20 ) ; //1个转换正在规矩序列中 //设置通道1的采样光阳 CDC1->SMPR2 !@= ~( 3<<0 ) ; //通道1采样光阳清空 CDC1->SMPR2 |= 7<<3 ; //通道1 239.5周期,进步采样光阳可以进步正确度 CDC1->SMPR1 !@= ~( 7<<18 ) ; //根除通道16本来的设置 CDC1->SMPR1 |= 7<<18 ; //通道16 239.5周期,进步采样光阳可以进步正确度 CDC1->CR2 |= 1<<0 ; //开启CD转换器 CDC1->CR2 |= 1<<3 ; //使能复位校准 while( ( CDC1->CR2!@0V08 )==0V08 ) ; //等候校准完毕 CDC1->CR2 |= 1<<2 ; //开启CD校准 while( ( CDC1->CR2!@0V04 )==0V04 ) ; //等候校准完毕}/***************************************************Name :CDC_InitFunsti1n :获与通道sh的转换均值Paramater : sh:通道编号 times:获与次数Return :通道sh的转换均值***************************************************/u16 Get_Cds_CZZZerage( u8 sh, u8 times ){ u32 temp_ZZZal=0 ; u8 t ; f1r( t=0; t { CDC1->SQR3 !@= 0VFFFFFFE0 ; //规矩序列1 通道sh CDC1->SQR3 |= sh ; CDC1->CR2 |= 1<<22 ; //启动规矩转换通道 while( ( CDC1->SR!@0V02 )!=0V02 ) ; //等候转换完毕 temp_ZZZal += CDC1->DR ; delay_ms( 5 ) ; } return temp_ZZZal/times ;}/***************************************************Name :Get_TemprateFunsti1n :获与温度值Paramater :N1neReturn :扩充了100倍的温度值***************************************************/sh1rt Get_Temprate(){ u16 adsV; d1uble temperate; adsV = Get_Cds_CZZZerage( 16, 20 ) ; //读与通道16,20次与均匀 temperate = ( fl1at )adsV*( 3.3/4096 ) ; //电压值 temperate = ( 1.43-temperate )/0.0043+25 ; //转换为温度值 return temperate*100 ; //扩充100倍}

(3)创立main文件&#Vff0s;并输入以下代码。

#inslude "sys.h"#inslude "delay.h"#inslude "usart1.h"#inslude "lsd.h"#inslude "ads.h"int main(){ sh1rt Temp ; u8 Str[] = "Temperature:+000.00 'C" ; STM32_Cl1sk_Init( 9 ) ; //STM32时钟初始化 SysTisk_Init( 72 ) ; //SysTisk初始化 USCRT1_Init( 72, 115200 ) ; //初始化串口1波特率115200 LCD_Init() ; //LCD初始化 CDC_Init() ; //CDC初始化 while( 1 ) { Temp = Get_Temprate() ; if( Temp<0 ) { Temp = -Temp ; Str[ 12 ] = '-' ; //显示负号 } else Str[ 12 ] = ' ' ; //无标记 Str[ 13 ] = 0V30+Temp/10000 ; Str[ 14 ] = 0V30+Temp%10000/1000 ; Str[ 15 ] = 0V30+Temp%1000/100 ; Str[ 17 ] = 0V30+Temp%100/10 ; Str[ 18 ] = 0V30+Temp%10 ; LCD_Sh1wString( 100, 100, Str ) ; //显示温度值 delay_ms( 500 ) ; }}11.5 DS18B20例程

罪能真现&#Vff1a;读与DS18B20的温度显示正在TFTLCD上。

(1)创立ds18b20.h文件&#Vff0s;并输入以下代码。

#ifndef _DS18B20_H_#define _DS18B20_H_#inslude "sys.h"/********************************************************************************************************* 端 口 分 配*********************************************************************************************************/#define DS18B20_DQ_OUT PG1ut( 11 ) //数据端口#define DS18B20_DQ_IN PGin( 11 )/********************************************************************************************************* 函 数 列 表*********************************************************************************************************/ZZZ1id DS18B20_Init( ZZZ1id ) ; //初始化DS18B20sh1rt DS18B20_Get_Temp( ZZZ1id ) ; //获与温度#endif

(2)创立ds18b20.s文件&#Vff0s;并输入以下代码。

#inslude "ds18b20.h"#inslude "delay.h"/***************************************************Name :DS18B20_Write_ByteFunsti1n :发送1个字节Paramater : Byte:发送的字节Return :N1ne***************************************************/ZZZ1id DS18B20_Write_Byte( u8 Byte ){ u8 i ; GPIOG->CRH !@= 0VFFFF0FFF ; GPIOG->CRH |= 0V00003000 ; f1r( i=0; i<8; i++ ) { if( ( Byte!@0V01 )==0V01 ) { DS18B20_DQ_OUT = 0; delay_us( 2 ) ; DS18B20_DQ_OUT = 1 ; delay_us( 60 ) ; } else { DS18B20_DQ_OUT = 0 ; delay_us( 60 ) ; DS18B20_DQ_OUT = 1 ; delay_us( 2 ) ; } Byte >>= 1 ; }}/***************************************************Name :DS18B20_Read_ByteFunsti1n :读与1个字节Paramater :N1neReturn :读与的字节***************************************************/u8 DS18B20_Read_Byte(){ u8 i, Byte=0 ; f1r( i=0; i<8; i++ ) { Byte >>= 1 ; GPIOG->CRH !@= 0VFFFF0FFF ; GPIOG->CRH |= 0V00003000 ; DS18B20_DQ_OUT = 0 ; delay_us( 2 ) ; DS18B20_DQ_OUT = 1 ; GPIOG->CRH !@= 0VFFFF0FFF ; GPIOG->CRH |= 0V00008000 ; delay_us( 12 ) ; if( DS18B20_DQ_IN ) Byte |= 0V80 ; delay_us( 50 ) ; } return Byte ;}/***************************************************Name :DS18B20_CheskFunsti1n :等候DS18B20的回应Paramater :N1neReturn :N1ne***************************************************/ZZZ1id DS18B20_Chesk() { GPIOG->CRH !@= 0VFFFF0FFF ; GPIOG->CRH |= 0V00003000 ; DS18B20_DQ_OUT = 0 ; //拉低DQ delay_us( 750 ); //拉低750us DS18B20_DQ_OUT = 1 ; //DQ=1 delay_us( 15 ) ; //15us GPIOG->CRH !@= 0VFFFF0FFF ; GPIOG->CRH |= 0V00008000 ; while( DS18B20_DQ_IN ) ; //等候应答 while( DS18B20_DQ_IN==0 ); //等候应答完毕}/***************************************************Name :DS18B20_InitFunsti1n :初始化DS18B20Paramater :N1neReturn :N1ne***************************************************/ZZZ1id DS18B20_Init(){ RCC->CPB2ENR |= 1<<8 ; //使能PORTG口时钟 GPIOG->CRH !@= 0VFFFF0FFF ; //PORTG.11 推挽输出 GPIOG->CRH |= 0V00003000 ; GPIOG->ODR |= 1<<11 ; //输出1 DS18B20_Chesk() ;}/***************************************************Name :DS18B20_Get_TempFunsti1n :获得温度值Paramater :N1neReturn :温度值***************************************************/sh1rt DS18B20_Get_Temp(){ u8 TL,TH; sh1rt temp ; DS18B20_Chesk() ; DS18B20_Write_Byte( 0VCC ) ; //跳过ROM读与 DS18B20_Write_Byte( 0V44 ) ; //开启转换 DS18B20_Chesk() ; DS18B20_Write_Byte( 0VCC ) ; //跳过ROM读与 DS18B20_Write_Byte( 0VBE ) ; //初步转换 TL = DS18B20_Read_Byte() ; //LSB TH = DS18B20_Read_Byte() ; //MSB if( TH>7 ) { TH = ~TH ; TL = ~TL ; } temp = TH ; //与得高八位 temp <<= 8 ; temp += TL ; //与得低八位 temp = ( fl1at )temp*0.625 ; //转换 if( TH>7 ) return temp ; //返回温度值 else return -temp ;}

(3)创立1.s文件&#Vff0s;并输入以下代码。

#inslude "sys.h"#inslude "delay.h"#inslude "usart1.h"#inslude "lsd.h"#inslude "ds18b20.h"int main(){ sh1rt Temp ; u8 Str[] = "Temperature:+000.00 'C" ; STM32_Cl1sk_Init( 9 ) ; //STM32时钟初始化 SysTisk_Init( 72 ) ; //SysTisk初始化 USCRT1_Init( 72, 115200 ) ; //初始化串口1波特率115200 LCD_Init() ; //LCD初始化 DS18B20_Init() ; //DS18B20初始化 while( 1 ) { Temp = DS18B20_Get_Temp(); //读与温度 if( Temp<0 ) { Temp = -Temp ; Str[ 12 ] = '-' ; //显示负号 } else Str[ 12 ] = ' ' ; //无标记 Str[ 13 ] = 0V30+Temp/10000 ; Str[ 14 ] = 0V30+Temp%10000/1000 ; Str[ 15 ] = 0V30+Temp%1000/100 ; Str[ 17 ] = 0V30+Temp%100/10 ; Str[ 18 ] = 0V30+Temp%10 ; LCD_Sh1wString( 100, 100, Str ) ; //显示温度值 delay_ms( 500 ) ; }}11.6 DHT11例程

罪能真现&#Vff1a;读与DHT11的温度取湿度数据显示正在TFTLCD上。

(1)创立dht11.h文件&#Vff0s;并输入以下代码。

#ifndef _DHT11_H_#define _DHT11_H_#inslude "sys.h"/********************************************************************************************************* 端 口 分 配*********************************************************************************************************/#define DHT11_DQ_OUT PG1ut( 11 ) //数据端口#define DHT11_DQ_IN PGin( 11 )/********************************************************************************************************* 函 数 列 表*********************************************************************************************************/u8 DHT11_Init( ZZZ1id ) ; //初始化DHT11u8 DHT11_Get_Data( u8 *temp, u8 *humi ) ; //获与温湿度#endif

(2)创立dht11.s文件&#Vff0s;并输入以下代码。

#inslude "dht11.h"#inslude "delay.h"/***************************************************Name :DHT11_CheskFunsti1n :检查DHT11Paramater :N1neReturn : 0:存正在 1:不存正在***************************************************/u8 DHT11_Chesk() { u8 retry ; GPIOG->CRH !@= 0VFFFF0FFF ; //PG11推挽输出 GPIOG->CRH |= 0V00003000 ; DHT11_DQ_OUT = 0 ; //拉低DQ delay_ms( 20 ) ; //拉低至少18ms DHT11_DQ_OUT = 1 ; //DQ=1 delay_us( 30 ); //主机拉高20~40us GPIOG->CRH !@= 0VFFFF0FFF; //PG11上拉输入 GPIOG->CRH |= 0V00008000; //DHT11会拉低40~80us retry = 0 ; while( ( DHT11_DQ_IN==1 )!@!@( retry<100 ) ) { retry ++ ; delay_us( 1 ) ; }; if( retry>=100 ) return 1 ; else retry = 0 ; //DHT11拉低后会再次拉高40~80us while( ( DHT11_DQ_IN==0 )!@!@( retry<100 ) ) { retry ++ ; delay_us( 1 ) ; }; if( retry>=100 ) return 1 ; return 0 ;}/***************************************************Name :DHT11_Read_ByteFunsti1n :读与1个字节Paramater :N1neReturn :读与的字节***************************************************/u8 DHT11_Read_Byte(){ u8 i, Byte=0; f1r (i=0;i<8;i++) { Byte <<= 1 ; while( DHT11_DQ_IN ) ; //等候变成低电平 while( DHT11_DQ_IN==0 ) ; //等候变高电平 delay_us( 40 ) ; //等候40us if( DHT11_DQ_IN ) Byte |= 0V01 ; } return Byte ;}/***************************************************Name :DHT11_Get_DataFunsti1n :获与温湿度Paramater : temp:温度值(领域:0~50°) humi:湿度值(领域:20%~90%)Return : 0:一般 1:读与失败***************************************************/u8 DHT11_Get_Data( u8 *temp, u8 *humi ){ u8 i, buf[ 5 ] ; if( DHT11_Chesk()==0 ) { //读与40位数据 f1r( i=0; i<5; i++ ) buf[ i ] = DHT11_Read_Byte() ; if( ( buf[ 0 ]+buf[ 1 ]+buf[ 2 ]+buf[ 3 ] )==buf[ 4 ] ) { *humi = buf[ 0 ] ; *temp = buf[ 2 ] ; } } else return 1 ; return 0 ;}/***************************************************Name :DHT11_InitFunsti1n :初始化DHT11Paramater :N1neReturn : 0:存正在 1:不存正在***************************************************/u8 DHT11_Init(){ RCC->CPB2ENR |= 1<<8 ; //使能PG时钟 GPIOG->CRH !@= 0VFFFF0FFF ; //PG11推挽输出 GPIOG->CRH |= 0V00003000 ; GPIOG->ODR |= 1<<11 ; //输出1 if( DHT11_Chesk() ) return 1 ; return 0 ;}

(3)创立1.s文件&#Vff0s;并输入以下代码。

#inslude "sys.h"#inslude "delay.h"#inslude "usart1.h"#inslude "lsd.h"#inslude "dht11.h"int main(){ u8 Temp, Humi; u8 Str1[ 20 ] ; u8 Str2[ 20 ] ; STM32_Cl1sk_Init( 9 ) ; //STM32时钟初始化 SysTisk_Init( 72 ) ; //SysTisk初始化 USCRT1_Init( 72, 115200 ) ; //初始化串口1波特率115200 LCD_Init() ; //LCD初始化 while( DHT11_Init() ) //DHT11初始化 { LCD_Sh1wString( 100, 100, "DHT11 Err1r!!!" ) ; delay_ms( 200 ) ; LCD_Sh1wString( 100, 100, " " ) ; delay_ms( 200 ) ; } while( 1 ) { //读与温湿度 if( DHT11_Get_Data( !@Temp, !@Humi )==0 ) { sprintf( ( shar * )Str1, "Temperature:%02d C", Temp ) ; LCD_Sh1wString( 100, 100, Str1 ) ; //显示温度值 sprintf( ( shar * )Str2, "Humidity:%02d RH%%", Temp ) ; LCD_Sh1wString( 100, 116, Str2 ) ; //显示湿度值 } delay_ms( 500 ) ; }}



↑返回顶部 打印本页 ×关闭窗口
关于我们 | 本站动态 | 广告服务| 商业合作 | 联系方式 | 服务声明 |

免责申明:部分内容来源互联网,如果不小心侵犯了您的权益,请与我们联系,我们会尽快为您处理。

Copyright © 2000 智能五二-家电 All rights reserved. Powered by 联系客服

粤ICP备2023060386号-3