|
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: - k- Z" w A/ T, c8 u* h
18B20的引脚定义如图2所示:
8 V' w" C8 N% I) ~& a, ]9 ]; z m' M- b/ q
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: : d( r$ W0 f: ?3 W0 K5 P& R
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
* u+ @9 z6 @; B, l+ U, W6 K V - {; s% J. H/ G4 }1 s& {1 B
- u8 i;9 r/ C1 O ]4 ?, {
- u8 data=0;
" c! G6 _; B8 l; G - for(i=0;i<8;i++)" T$ K; p1 G1 b, h
- {, A4 b% `$ d8 ? `/ n
- data >>=1;" }, D6 v9 y# i
- GPIO_ConfigurationOUT();, u( O% @% _ x: v& B4 ~
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
2 L9 }0 ^$ p7 D! c# F# }2 v - Delay_nms(15);
4 U" \& [9 Z1 l/ T# y9 m - GPIO_ConfigurationIN();
- t# C2 H; `0 P: I( a+ h - Delay_nms(50);
! @ @5 W1 l8 p2 K B2 O# d% Y - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
2 J# O8 Q" g1 U4 p# @ - data=data|0x80;) A @, W$ u9 V* q Z- j
- else% j8 |/ ~' b: D( f
- data&=0x7f;/ W9 I* W3 c6 u& G0 B( f- y. u
- Delay_nms(600);, n0 }! O2 X% o$ S8 r" W
- # ?& K L0 J8 v" j3 `$ g
- }
) U2 N2 o2 T0 [5 Y+ e - return data;8 a2 J8 _" _$ X5 L
- + J4 ?+ z7 i6 b, A+ Y
- }# \- y4 c- J( k* B
-
2 p" X$ @5 {0 m; C; `7 F# t - void DS18b20_write_byte(u8 dat) //写字节- h7 M. [' j" k" ~
- {# i( e3 \$ C& b h$ |3 F9 e
- u8 i; i- U8 {; {) Y) \+ @
- u8 one_bit;
0 U# U. B) p7 `; j5 I- B8 k - for(i=0;i<8;i++): n6 d) L- r9 w0 T0 G
- {
$ x1 E( d# b8 q/ T - one_bit = dat&0x01;
9 @6 M$ A6 ?1 v7 J9 G - dat = dat>>1;
' ?& i; w: U7 @: k5 N3 N! o - GPIO_ConfigurationOUT();1 w/ u- y- C g% q6 [
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
/ \, M# M, d* O1 Y+ d - Delay_nms(125);
) Y- O( @ N: p1 u" n - if(one_bit)
2 Y3 {9 ` e5 ~6 }+ e4 |4 x - {/ v5 V6 X9 g$ i# g$ H- b+ }+ J
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
8 w9 v; Z# o3 H# h6 n" C - Delay_nms(300);
: r( D- }% o' b5 g/ K' E - }9 H" U' I- ]4 E+ i' U& j; v6 [3 f
- else! l6 T6 i+ b5 o" T9 K d
- {, o2 w# k! L/ v+ O8 d2 j3 g
- Delay_nms(300);2 J& t0 \3 { @) l) n m
- GPIO_SetBits(GPIOB,GPIO_Pin_14);8 w r1 l v- \8 O$ i! R6 X
- // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
9 |3 B1 b2 I9 B0 W3 d4 } - }3 ]( y1 [+ x2 U* c4 D" N
- Delay_nms(80);# j* ~8 K, `0 F
- }: o9 @5 u$ x* D. q2 ]* o
- }
2 N- \$ ]' e& O) V' y* [# X* r -
* H9 L3 N3 ?% m, ]3 T0 M+ O2 B0 k - u16 get_temperature(void) //得到温度数据
0 G; Q3 F$ m, {& O) Z - {
& k5 j* o. ?7 ]2 R Z1 ~ - u8 a,b;4 e+ u/ [7 s, W: `
- u16 temp;7 m& N1 e( E4 x$ v/ J( ^+ U
" _; [; E* v% C( c- [. G( W- DS18b20_reset();
! V. v k) X7 q6 o% | - DS18b20_write_byte(0xCC);
5 h7 `, L5 g2 x+ G( f, ^ - DS18b20_write_byte(0xBE);
h4 a' [. h; h - ; q, z: O% @' r
- a = DS18b20_read_byte();( ]& \: m" [9 a1 A) l: |
- b = DS18b20_read_byte();
* G* \$ |# B4 m/ \( r% t - temp = (u16)b<<8 |a;
8 t1 ~2 x1 v6 ]4 ] - return temp;
- x0 G' K% D- Y& P8 t - ' r+ b+ [0 [# E. @1 T8 b2 Z
- }
* m3 c7 R: E4 G0 N2 z2 e - void temperature_convert(void) $ h( j$ h- q1 H' w- i( K( W
- {0 U& ]6 Q% F# e9 q8 V+ Q
- DS18b20_reset();& J( |3 C) q' f4 t4 e& B
- DS18b20_write_byte(0xCC);( W* Z% Z8 e4 j+ g0 F- j
- DS18b20_write_byte(0x44);3 L. b ]( h) D$ w
- }
F6 Z. I: X7 N6 A8 \, t! s3 E - void init_18b20(void) //初始化
1 ^4 ?# ~( t7 n' ^. s" X W - {
* m, b+ U) |" t! t$ q, L) M - u16 temp;: Z4 m* c3 U) m, T. k2 f: ~
- do
: }+ i/ C# ^3 s2 F4 } - {+ i% J6 F6 b" Q* r$ x- {0 k, Y
- temperature_convert();
1 l6 U: h0 z/ M# a- u+ `4 b: I$ ~+ ] - Delay_ms(20000);2 w7 t, u; E( k4 W6 g' l8 j) e- h
- temp = get_temperature();: N0 ]' p: i+ z5 G$ ~8 v
- } while(temp==85);
5 P( v7 b% U8 h8 b* [- | - temperature_convert();2 n1 L& I4 K9 ]2 c6 A$ _
- }* a; N' J: j( y' X3 \' m! t
-
) D+ x a$ J0 \- ~9 S' ]# i: o3 ~ - //u16 showdataT;
- @) B8 C8 Z1 Z - void tem_process(void) //计算温度
# D6 \; ~. s( t _/ _ - {" W7 s/ M, x) j% J( B7 V
- u16 showdata;; H- N! s4 ?9 a' h" ?$ U
- // u8 Tbuf[2];2 \! v$ q3 t! c/ O
- temperature_convert();" r R% Z" d) ?4 t( z9 M5 e
- Delay_nnms(0xAFFFF);
; k" g. P0 x2 {: T- q( j+ F9 X7 b - Delay_nnms(0xAFFFF);0 ^0 f5 u; U5 T9 V& Z
- showdata = get_temperature();
7 \9 X8 b/ _2 v4 g" w" L: z) o6 T4 ?# s - showdataT = showdata*0.0625*10+0.5-10; //计算温度
! x0 [8 @0 E9 f. t - }
复制代码
* p9 U @7 p, X0 p本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
2 B: K" p, \* Y; q( w7 u
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。 - N% c7 \. s0 j) X8 J0 C& a5 V+ \
|