18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: 4 D' P2 d- p: m4 f
18B20的引脚定义如图2所示: 2 T) m, {2 _# L) y$ Q; J7 ]
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: ( } ^) i! o( v" f# h
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节9 O$ F& k+ n( w# M) B
- {0 E5 f' ?8 R1 O7 D5 |3 v5 F2 m
- u8 i;. K$ s) @3 B3 P' t9 z
- u8 data=0;
, `3 m+ m' T8 `6 R; H* r T - for(i=0;i<8;i++); q; Z& B) Q7 O, n/ w# ~
- {
; m G2 A+ W" S3 \' Z9 r$ {6 U+ L - data >>=1;$ G( l- V' E/ K& U' h( Y
- GPIO_ConfigurationOUT();
+ A2 h: F' D0 _: g - GPIO_ResetBits(GPIOB,GPIO_Pin_14);
+ }8 _: y1 w9 n1 r, v3 n' x - Delay_nms(15);
6 x. ~6 |6 c$ l/ b - GPIO_ConfigurationIN();- e5 T' d; I% }& w/ O" p% Q
- Delay_nms(50);. f1 k& L! C' U0 W1 L
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))+ _% Q7 r" D2 c1 J+ K7 I4 _5 k; M
- data=data|0x80;
& I4 w1 x) m! e5 b - else
; V% m6 h5 b1 S1 N - data&=0x7f;3 p9 E4 E+ i0 u6 Q* h
- Delay_nms(600);
- p$ `+ j* t* Y# I3 G6 ^" ~3 J - 2 Y6 o7 n1 m$ k7 Y! s' u
- }! c; M: v f. ]# r; v, _5 d
- return data;
' v2 z6 Q6 \# j9 C8 `3 u -
4 D$ K& }) @+ F- T% I( B, S9 U1 R: ~ - }! e- z8 ]6 K) u1 p
- 6 \$ e# U* g5 c, f4 q+ {
- void DS18b20_write_byte(u8 dat) //写字节: h9 [4 A! `9 s0 n1 X: L0 h2 B
- {7 R* O4 G! Q' {& f
- u8 i;- J1 J8 s3 {7 Y. {! Q
- u8 one_bit;/ o. W% V/ f$ `7 `
- for(i=0;i<8;i++)8 |! `) h; v; a, u) v
- {
# Z# I) d: y$ E$ [9 c5 a9 V" ` - one_bit = dat&0x01;
7 J- [* x* s6 U" Z* i( n' X - dat = dat>>1;
" v8 Q0 Q5 ~7 ^& t8 ?$ T \ - GPIO_ConfigurationOUT();) S; P5 C/ v7 @$ d) x
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);- R* ^4 Y$ Y9 y: O
- Delay_nms(125);
: w- S: U8 F- N( n; C - if(one_bit)
% s. T! c: O2 N) j. k - {
$ o# q" W8 C9 {# P - GPIO_SetBits(GPIOB,GPIO_Pin_14);# y5 _' N' j/ D1 x7 V0 b
- Delay_nms(300);
8 E% `( O7 P" G. e3 t0 Y I; m - }7 a- V- D8 W9 l' U2 ]
- else3 s. \5 p4 f6 E; G8 P
- {
' p3 Y0 w7 {( Q. ~" Q+ p - Delay_nms(300);; L8 \* Z6 v2 G8 y/ o; S5 ^9 W
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
% }1 o( {4 m4 Y1 _ - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
% z! [% Z9 a7 n7 S% Y7 i: W- n" p - }- t# s9 K# G- l G" _ Z1 ~6 ?
- Delay_nms(80);9 x0 n9 o( ?( L9 Y9 f
- }9 n p' t* e8 \( P: {4 b U1 K
- }, U4 q8 }. n- b; j' y6 |' V$ B
- + j3 m- m& w& \0 D5 L
- u16 get_temperature(void) //得到温度数据2 J Y+ P& T1 t7 y. d; z7 d( y
- {
9 P% J0 u+ d- }) c/ d4 A4 ~ - u8 a,b;
2 w9 W2 v! M+ E4 L - u16 temp;
; u8 T w* n7 E+ C: P- c2 l. l n - $ r% Y6 x: {, {" [" D2 A! m
- DS18b20_reset();+ Z0 |8 s& P+ _& k
- DS18b20_write_byte(0xCC);
. E- {$ H0 M/ l1 E - DS18b20_write_byte(0xBE);3 o& S" P H$ W" c9 ~6 x9 t" m2 T% n
- # r* q+ ]7 D b( m3 v% ]
- a = DS18b20_read_byte();
! i( {' U3 j8 S% C9 W - b = DS18b20_read_byte();5 d) {/ b8 I; J, n, C
- temp = (u16)b<<8 |a;+ M" H8 y: p. f0 j: C1 K6 [
- return temp;: g9 \* o4 E, i |. A1 R
- 5 V3 W# p. ]: I1 |# ~5 B% Q; \
- }
& g7 f6 y# t! ]/ J9 e* K - void temperature_convert(void)
/ [8 H, e2 X) ]# c9 p - {1 J8 {6 F* F6 w& A4 K
- DS18b20_reset();
5 T2 Z2 c4 z& y* m - DS18b20_write_byte(0xCC);( Z N1 C% V( F' _8 N( l
- DS18b20_write_byte(0x44);" r' W, v4 k) X& Q7 @
- }% ^. F: \& @& d# t5 ~' f$ _! U
- void init_18b20(void) //初始化& M* @% c8 J( K: f1 a5 R% X, J
- {
- z ?: c, h6 k7 ~! K - u16 temp;
b* ?* a( s% z5 E: g - do
" H* f* P# j: ~# ?0 X% R - {
3 w8 r Y/ A- V3 i( J/ ` - temperature_convert();) v: W" u6 t( U
- Delay_ms(20000);
( ^6 }1 N2 j6 x4 v; H X f5 O3 P$ y - temp = get_temperature();
. b' ~1 z& G* \+ ] - } while(temp==85); ' @# h0 Z3 N- c/ J1 z
- temperature_convert();7 H1 `- A0 m8 N% K H# m
- }
2 j6 u( k2 ^1 R0 d' e - 5 {: J" ^7 }( R: L# C0 }
- //u16 showdataT;
6 w6 @2 m. K" @- ~- c! | - void tem_process(void) //计算温度
`9 ?% S6 Z$ |$ b$ F# s" Q) r - {
; N9 H# G3 ~, }0 [) j; `0 ? - u16 showdata;
6 m& g3 ?/ r G7 H0 j5 W5 ?5 L - // u8 Tbuf[2];
8 _0 H Q5 l, W' S: J! w - temperature_convert();- D. s8 ~7 O' m1 w# |
- Delay_nnms(0xAFFFF);
( B D. G% Y4 R: V" w1 o) l& P5 o - Delay_nnms(0xAFFFF);& V9 I; j; Z0 T* Z9 n
- showdata = get_temperature();
. i- p6 Z* W* O9 H: s4 m9 Y$ j6 _ - showdataT = showdata*0.0625*10+0.5-10; //计算温度( e$ S- b/ V! b* p
- }
复制代码 2 i W! K) O8 D0 u# B% }+ t
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
& g& i! Q$ F! ]* y1 q
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
/ \. |0 T1 \+ P1 H1 t& z, D |