18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
% r5 E! |8 K D. w3 z5 R5 _
18B20的引脚定义如图2所示: 5 B$ y& |! o, [5 e+ ^
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: : C9 }# q0 ~4 G% s$ Q
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节2 a; u: B$ L: G- M P* d x
- {
5 m3 r3 m& B( Y7 q; J# X- A - u8 i;2 q6 r$ I% C6 N1 Y
- u8 data=0;
2 x- V" U4 r U2 e$ f - for(i=0;i<8;i++)! N* \2 x9 h7 d- N3 W- n, N8 G
- {
, n( |( ~" _( p1 r' v* y& ^6 B - data >>=1;0 B/ k4 C c: [
- GPIO_ConfigurationOUT();3 x8 G O6 F; m& h( K0 R* G* }" w
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
3 x% n* v' D5 X# o2 S - Delay_nms(15);
7 A6 c* o* V2 m4 G. s - GPIO_ConfigurationIN();
7 [; o$ w! D6 f- @8 x - Delay_nms(50);
2 O- I1 {1 R! ]. E) x# L# u - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
[, l+ p0 `: |! t9 H- Y/ F7 ` - data=data|0x80;
2 a# Q& A' T: w8 _* J% ~! E - else
) q3 U X& Y- X6 T6 F - data&=0x7f;
J. C! h6 \& S2 E - Delay_nms(600);' k' Z7 C4 F5 s2 X0 ?7 v
- " C, e& Y+ N# K' B( ^
- }
3 {6 S9 c# A6 M, J8 |- m0 F - return data;( _" L o& w0 h( m
- % @8 X$ @0 F% R7 l, ^/ B# y
- }* d0 N0 X- M/ ^3 @( _9 `" r- \
-
: t1 Y* H8 P( K5 V4 b9 @! l/ ` - void DS18b20_write_byte(u8 dat) //写字节
# f1 X& Q5 m; @, ^& d% m. k - {
& f, J9 x# D8 e7 Q - u8 i;
1 i7 l( F7 x5 h" a$ G - u8 one_bit;
! N4 z4 w8 ] r( c - for(i=0;i<8;i++)2 M/ N8 D0 ]/ a3 O* c/ D: L
- {
& T: G% X6 L# C; z/ W5 a; { - one_bit = dat&0x01;
- K' i0 |- q2 ?9 o& { - dat = dat>>1;4 h- C! B9 E7 M+ J
- GPIO_ConfigurationOUT();; w4 N5 _" `$ W! k0 ~) [1 W: j3 B
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);; b& c2 L9 F; d
- Delay_nms(125);9 _" V3 J: [! j5 X" @' ]3 o
- if(one_bit)- I0 E: G- i% X+ ^; t
- {
% u- w1 {0 K N2 P0 E" E+ ? - GPIO_SetBits(GPIOB,GPIO_Pin_14);2 H9 v. z# L2 C! ^' M
- Delay_nms(300);7 M; a9 Z. r( B& N" w! \: y
- }3 L7 v8 Q: e2 F4 l" `
- else
, v5 q t! s8 o# Q7 q - {
; Z' z, U% b4 {2 F/ D, e: G( t - Delay_nms(300);! W3 }& P3 `& v/ }
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
5 y/ m s" I9 p) M; w2 L - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
1 ]) ~! v% ?4 X/ i - }
( W& l; K( c J$ z - Delay_nms(80);
( D. G" q8 Q9 R- b - }3 m3 N1 m- J& }# Z9 m1 Z# _
- }
5 }2 J- C; Y( {% l - 7 H+ f4 f; j" V9 G9 Z
- u16 get_temperature(void) //得到温度数据, s: Z F8 ~. S% W* d2 y
- {
1 o0 _$ u+ l) [8 m6 n* x! u - u8 a,b;
* B( d. E4 [. O7 B( `4 a$ R3 W - u16 temp;
3 v# x# \; i) T1 S" S - 3 N( }: {0 M" o2 G
- DS18b20_reset();8 {& W: C8 t Q
- DS18b20_write_byte(0xCC);
! y, |* V) W4 x4 u! l$ { - DS18b20_write_byte(0xBE);
$ g& O4 k* B7 B7 k$ F. `3 f -
' `1 r6 g( F! @/ y$ K4 w - a = DS18b20_read_byte();8 \. J9 q" K% i0 n& G+ J
- b = DS18b20_read_byte();
( S; Z5 v! y+ V3 n. K* X( Y - temp = (u16)b<<8 |a;4 z$ \! B/ |' ?, J
- return temp;
% } q- |! O L -
, r" U" ?6 e: x% n& D% d$ S O - }
0 m6 r* s, [% @. {8 C0 M4 v - void temperature_convert(void)
" y% N2 C0 j: J: k& Z# C2 E - {
2 L9 @, U& s W& z$ S - DS18b20_reset();
. M# ]& F1 \7 _ - DS18b20_write_byte(0xCC);
! h1 Y- P: G Z - DS18b20_write_byte(0x44);9 X9 R5 h& e4 E5 C
- }
# u& N* y6 l8 V0 {1 h$ E: W - void init_18b20(void) //初始化
0 X6 Q/ s" ^2 b$ {) `8 H; [ - {2 q, b/ t+ S2 }2 d8 H! z% y
- u16 temp;8 ?: l* H" t. i( C/ D1 g$ n
- do
/ ^9 v$ ^5 r! R. t - {% |6 J* N8 k+ R) N6 z! q
- temperature_convert();) H9 r( t" y2 o# H! p
- Delay_ms(20000);
. c4 x6 ]$ ~9 l1 P& O! P {3 i# P6 x - temp = get_temperature();
7 Y F8 o' N# f( G( e r - } while(temp==85);
2 f- K7 y1 t$ I$ G& p' {% d - temperature_convert();" R& o" f( c0 Y$ r0 S' W
- }
: n6 n k* |+ e( K, W) l, [/ V - ! U+ E$ C8 q- e. b+ M5 f7 {
- //u16 showdataT;( B3 d' d9 t+ _- O# f( O* z
- void tem_process(void) //计算温度( z/ a) h" ?7 K+ Q6 I
- {& p8 w! y1 ?, e) q
- u16 showdata;
" p% j9 N& `" o- l" | - // u8 Tbuf[2];- Z# E; S( j' ~3 B
- temperature_convert();8 M) G0 ^) n8 K
- Delay_nnms(0xAFFFF);
6 |& S# r4 D0 g8 T" y" o - Delay_nnms(0xAFFFF);) e! n6 w7 {8 a& O( y3 n
- showdata = get_temperature();# C" Z4 n$ h; E, d6 j5 r
- showdataT = showdata*0.0625*10+0.5-10; //计算温度4 q7 z/ C }% S3 B- F2 `/ M
- }
复制代码 8 l- r- ^1 l6 O! B8 q" v2 D! S
本程序通过定时器定时200mS读一次温度,数据显示如图5所示: 9 Q/ G) o) @5 P$ m: i
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
6 J+ v1 v8 `. [5 t) \) _6 }8 T+ J |