18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: 2 u2 ]" c' E1 W) s7 X
18B20的引脚定义如图2所示: ) \$ G1 f+ U- ?, K" M1 c' o
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
X$ W# j$ Q6 w9 r9 g+ M9 B数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
0 z2 i8 \, F7 |6 k - {$ r3 j/ b8 @! W3 Y5 f) _
- u8 i;
% R: C' F1 T2 h7 |- Q, R. |! L2 X - u8 data=0;
$ S7 h8 w3 z- _! K7 ~ Q M6 |+ R% `4 ^ - for(i=0;i<8;i++)
0 S4 V4 E% U/ l% P+ P+ p7 }! n( K$ B - {) C4 u8 m l! o; B f
- data >>=1;# m. c" W* P- N/ J
- GPIO_ConfigurationOUT();
: L5 p2 o" H; W& s9 B) @4 H - GPIO_ResetBits(GPIOB,GPIO_Pin_14);7 D" \. L3 \9 Q0 E! j5 Q* ?
- Delay_nms(15);
9 p, e; h7 Q6 V - GPIO_ConfigurationIN();
$ `6 p9 N! N" |$ k5 h7 p* X3 S+ p% @ - Delay_nms(50);
2 g7 e z( D( H) ], I - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)), M1 \! @ t: o. s! k% |
- data=data|0x80;
* e9 L0 O' V/ X; K6 v - else
{! x) m( r+ f ]( t0 Y4 w - data&=0x7f;8 D7 c% k2 I3 Y. j2 @
- Delay_nms(600);2 j! Z" r* F' A5 U, r* x# p
- % e4 {( { L; ?0 U
- }# Z2 c6 q( U( G3 k% G& b! b k
- return data;! a- Q3 u7 L; E; _
- ; I$ { L2 I5 @2 E4 m
- }* k# q. H2 Y0 i2 x6 d7 }
- 2 ~- s2 R5 d4 j. r* w+ X# @$ l, @
- void DS18b20_write_byte(u8 dat) //写字节" \9 f! a& S" r4 ?5 A9 R! }7 _
- {
! }0 ]/ w- t* R" }6 ^. D' g - u8 i;
3 F/ K* e3 v4 t/ v+ K - u8 one_bit;3 o5 b; T& k# ^! v+ ?1 f7 E/ ~7 Y( q i
- for(i=0;i<8;i++)8 y; m% U6 r$ u
- {
6 K* U2 P0 \3 L n+ E - one_bit = dat&0x01;# [) _& x# _5 S5 E# r" t
- dat = dat>>1;5 ~2 S& l. M# w! N) Y5 a: m
- GPIO_ConfigurationOUT();1 l$ }3 ^0 D: j6 J
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
* Y2 J5 e. C) T7 P+ o$ n0 p8 O8 R: f - Delay_nms(125);( b) o0 \2 U3 Q1 Q. z+ z
- if(one_bit)( i0 V, v5 Q( n6 V3 V- K4 T
- {) M, {0 {2 N/ M9 c+ S& r0 {' Y8 ]
- GPIO_SetBits(GPIOB,GPIO_Pin_14);# Y$ e0 y* ]! \+ r
- Delay_nms(300);
) V l" v6 Q8 r; v, C: T2 Z - }
r+ F7 i- @. @6 A# j - else6 Z/ T0 C |. \& J
- {) }3 Z! N1 w2 `; s
- Delay_nms(300);! F5 X1 e3 r8 C& @) @$ K' e# [
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
4 p5 T5 I! \- } - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
2 I% T/ {3 ]2 { - }% R6 R7 u3 s# ^. ~7 v" \
- Delay_nms(80);( D. I7 N6 T" a1 l: Y" y0 b+ a9 k/ Z
- }
# \4 p6 r9 y* H% f6 I1 r8 ` - }
* ~% e1 c' A- P5 D -
% l+ u H. d+ { - u16 get_temperature(void) //得到温度数据
/ D# ]1 O- o6 `6 k3 T6 z% ^5 A1 p }2 k - {
4 F: [7 o! H; c+ J! @+ i: O - u8 a,b;
# S7 h: `+ b. F) s1 M$ y H - u16 temp;
+ k7 o- M& @& s! Z5 U
( o# r, a( Y9 S7 L' {/ a- _1 [- DS18b20_reset();
5 N$ s0 T ]/ C0 [" }. }/ o - DS18b20_write_byte(0xCC);
; E6 z6 \' [: d9 B3 Q - DS18b20_write_byte(0xBE);
$ p4 y% m4 a; |' P, Y - ) q! v! a- y6 w8 s
- a = DS18b20_read_byte();
4 [; L+ _ Q2 ^+ O# t - b = DS18b20_read_byte();
6 |+ a% M3 x H4 z - temp = (u16)b<<8 |a;
3 k) K& ^6 e; e I1 v/ E& z; b - return temp;, `1 B! \ u3 T& E' i ~
-
% U6 p9 ~8 g1 o* l/ q% ~" e - }. H/ Z+ D# b4 A
- void temperature_convert(void)
: _% E6 Z1 H9 u - {6 X! e. D# k. Y o5 X
- DS18b20_reset();
# O: ^/ l Y; h( g3 _" ] S! X - DS18b20_write_byte(0xCC);- y" q5 K8 U) z, W, b" p) q, e
- DS18b20_write_byte(0x44);6 D- P) W* V9 _% a" _" r
- }
' v8 a1 Z+ ~+ S2 W- o) i - void init_18b20(void) //初始化
% o' f' s' ?! d - {
% w- { L! Q2 `! L9 n8 {( G - u16 temp;
' Q% Y# Q9 w7 x% D8 m# I - do
5 F% g6 u* Q j- c: Q - {
; n3 f. L4 G+ {. _ - temperature_convert();6 l6 P3 [4 U l5 b6 b/ I B$ S
- Delay_ms(20000);0 t" G2 f/ c9 J& G. Z
- temp = get_temperature();
" N9 l* e% s/ N; g0 Y3 i - } while(temp==85); ' E5 G9 S4 y7 q
- temperature_convert();
6 \0 `( @8 U6 w8 ? - }# u2 c0 `8 E4 ]4 r' n' x
-
. e2 u5 B1 s( D; b+ H# K. s - //u16 showdataT;
- M- n/ y& |/ o% Y# }# T - void tem_process(void) //计算温度
, W/ }. [- r; Q: v6 F6 k$ ~ - {# M) t: n& A0 p* Y! E# I
- u16 showdata;
; P d0 N" e% c5 w9 N$ P - // u8 Tbuf[2];7 G+ {) {; {6 Z! t/ n3 _: r
- temperature_convert();
( g5 X+ G9 h7 M1 T& B3 F - Delay_nnms(0xAFFFF);3 w! K6 e( M h( N
- Delay_nnms(0xAFFFF);
$ D; n( f8 {$ Q% u8 k2 J - showdata = get_temperature();' Y6 m# N, H. T g
- showdataT = showdata*0.0625*10+0.5-10; //计算温度
8 T# G: m- v- b* ] - }
复制代码
( A4 N( @, `9 j7 x# }+ w; u) j本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
2 V) H! B) l, ]$ a- E2 E5 _6 v3 A! G
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。 ' i: l# N! Z& l7 ~; Y
|