18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: 2 ]) V$ Z" B5 Y" C. S
18B20的引脚定义如图2所示:
' J" K# X E& t- i# Y) V! w
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: ; d/ z9 J2 N8 D3 E
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
; A5 X5 F& [7 k* s* L+ ?4 _# e/ r - {7 g0 R# R& x0 x/ z& d
- u8 i;
' m4 v( @$ z t% i - u8 data=0;: m% r4 l2 m G7 L0 A' ?( `
- for(i=0;i<8;i++); ^1 c8 h! B, F- {3 C" K
- {
! Z0 u$ e! Y. j' \9 S9 k - data >>=1;: X) ^" A2 H( c( I# _" r" \5 L
- GPIO_ConfigurationOUT();/ t: |0 v# ?. d) d. I2 G
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);: t: ^# X* C! T4 b! |
- Delay_nms(15);
- A/ q- T7 b) g' P+ T6 s/ k% t - GPIO_ConfigurationIN();9 z. I0 r; S& D% P# R! k# R7 W
- Delay_nms(50);& p8 ^* Y' l0 E' E
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))7 Y; B t/ V- |4 r' l& Y9 ~. X
- data=data|0x80;: U; a. g, B" `2 t3 M+ ~
- else
0 S% L9 h. p* g; B& s% f - data&=0x7f;9 z2 B% D- g6 G/ O
- Delay_nms(600);
I9 z" S3 g7 Y4 p# S: f0 L3 x, C - 0 z2 x; y9 T: [7 \9 j1 L J+ p
- }/ f t* R! k9 N# `8 `
- return data;: N" x; c/ o+ F7 b. `2 h3 h6 b) t4 A3 q
- 9 y: ^# k# `. f0 F1 d* S( j
- }7 o0 d. Z. ?; l$ A: o
-
1 w2 Z% {7 U0 k# Q0 ]# O! a' | - void DS18b20_write_byte(u8 dat) //写字节
& j) t! G) F2 {+ }1 W( g. I - {# s; l: a2 L+ J/ ? ^9 C
- u8 i;
) r2 Z% j& v$ T$ h5 t9 d - u8 one_bit;
4 l, i$ I: V( d" T) R0 ~ - for(i=0;i<8;i++)" a3 p. T( ~- T: o
- {5 s6 l: f# b* W. V/ K* r1 K! A8 ~0 ]
- one_bit = dat&0x01;
$ t" M' {6 h. J$ J, p3 A; g - dat = dat>>1;5 U7 n* |1 e$ Y, i. @
- GPIO_ConfigurationOUT();( W; Z& b1 ]5 u+ |7 y
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);' G/ K, C, t: n) s5 ?
- Delay_nms(125);
% _6 F& ^# P' ? - if(one_bit)
4 ~8 s$ F4 N; S( s1 r0 J - {" q0 P! V$ X' z
- GPIO_SetBits(GPIOB,GPIO_Pin_14);% X. @( ~1 O1 j3 z" p. V9 Y
- Delay_nms(300);+ l" m# H+ }/ e% [( x- l! A$ O
- }% c- a! B% v. y+ x# M
- else
7 M9 C, M! a. s3 ~' _! a% k+ N- r - {
+ ^" h2 Z K; U% b7 q+ ` - Delay_nms(300);
* ?0 m. Z3 ^4 _" O0 @- Q - GPIO_SetBits(GPIOB,GPIO_Pin_14);
% T) X2 g4 |1 r! @4 { - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);0 ~/ V- j ]% W3 m# Q" I6 l
- }" A1 a, h6 K1 g4 b+ a* ~8 Q$ d# M
- Delay_nms(80);5 j- |( G! Z. _. D, A' |/ J
- }
! |' t- z3 G5 b" ?7 W( f& n - }
J& H6 t$ T* [ t# X, R -
4 S: f: C: K, i- z! `8 _ - u16 get_temperature(void) //得到温度数据1 N2 K8 n% z2 ~+ u) v8 Y0 n
- {
8 Z" u! r6 O k1 L - u8 a,b;6 l- d3 Q) j! z, ?6 o' I$ {
- u16 temp;2 ^1 P; R2 K5 g1 u2 n( d
- 3 v- b3 G' o, y4 S, N* X% M. }5 c
- DS18b20_reset();
9 g9 S$ V% j) T) i# c, I - DS18b20_write_byte(0xCC);3 N2 u9 |4 M: u. L. r
- DS18b20_write_byte(0xBE);2 A8 `; F" X! M2 C3 _- y
- ) A# d, [: M/ i4 o4 S. e
- a = DS18b20_read_byte();
- A! o$ D" y' F h Q - b = DS18b20_read_byte();$ f n+ v1 t% d1 h# j' m
- temp = (u16)b<<8 |a;
; I$ n* z# a; S0 v - return temp;
% v K5 d( ~) B. C% U- Q -
: `0 p. j# e% n8 ?1 X - }7 E, e8 }$ {$ I% g( @
- void temperature_convert(void) 4 k/ L% T2 h3 u' U1 k4 D5 z
- {
8 m0 M' t: I: E$ m7 K7 ] - DS18b20_reset();) I* n( G, A- t( o
- DS18b20_write_byte(0xCC);
) @! |$ a5 K& U3 q$ J, W* U# Y - DS18b20_write_byte(0x44);
4 c% b% U9 {; h0 [3 H; x# E - }
7 J$ V4 `3 j7 z$ i - void init_18b20(void) //初始化
; F( e; X! r4 e% L* r+ S7 g6 F/ y - { z7 T5 s, b0 g0 S1 S# _) q3 X
- u16 temp;* n; P3 o/ ]( j% D. o9 O0 P
- do# R, t U0 q$ v5 J( E
- {
7 k7 v+ D+ r7 ^: j+ q4 h - temperature_convert();
0 h0 S2 z( }4 D - Delay_ms(20000);; c4 y/ x9 `0 b2 z# v9 R) [! o) v
- temp = get_temperature();
3 S$ |1 ]- t, O8 j - } while(temp==85); 0 K1 i( a& N" G# _" m
- temperature_convert();
7 \9 |0 _ | n; t8 M - }9 f5 `& n( A6 `* L8 p# N2 @3 k
- 8 t E! x3 X! \
- //u16 showdataT;
, D0 Q/ t& m" q! ?. P+ u - void tem_process(void) //计算温度
, t" A8 _7 t- h' { s) i Z, @1 p - {
" |* u, R2 c7 L4 u, k! W - u16 showdata;
. Q! [) L5 G1 L) X3 j: j1 } - // u8 Tbuf[2];
* F. n5 D$ f9 N* W: S! Q2 t - temperature_convert();- M7 R$ o; Y+ H& h1 g0 }& |
- Delay_nnms(0xAFFFF);
( ? `* X7 a( m) K0 h \9 \- S - Delay_nnms(0xAFFFF);6 Q( m O8 w- A% y$ n+ L) q
- showdata = get_temperature();
+ I5 F; H# ~" p: G7 F9 }* j - showdataT = showdata*0.0625*10+0.5-10; //计算温度
6 m8 m+ O, f0 U, g - }
复制代码
. i1 N3 o9 m% S本程序通过定时器定时200mS读一次温度,数据显示如图5所示: ; v) N$ n/ s3 I( E* g
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。 $ w* H- z) X8 q& e
|