18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: $ {- z. b' k3 { v/ I K9 f' O
18B20的引脚定义如图2所示: $ S+ A1 S) X) d! l: `. M
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
* F0 }5 C: r' I9 h数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
' l: j h4 g- c8 t - {- X3 u" w2 h9 f: W
- u8 i;
9 ]2 \( [, G& V: Y/ v7 E7 R% m - u8 data=0;
+ v s7 p+ Z; j3 ]- y - for(i=0;i<8;i++)* x2 C& ]9 F( Q
- {( J' F) G8 h' \
- data >>=1;# Y. o2 W; R! A/ n
- GPIO_ConfigurationOUT();
1 |- ?; ]. p2 R Q1 x: l- r0 k - GPIO_ResetBits(GPIOB,GPIO_Pin_14);
* v* L3 p3 l% x/ k. M6 Z, o - Delay_nms(15);
0 e) f6 p' I3 D1 r - GPIO_ConfigurationIN();& Z4 i3 E/ Q }, h* ]+ ~- X
- Delay_nms(50);
: ?0 z& _% h- o2 y, v - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))# ?! P' p, p* H& v
- data=data|0x80;
! H1 `5 G% @; A: Q6 m - else) a7 S! m; j# ]! ^
- data&=0x7f;
5 }% r8 B$ C+ n - Delay_nms(600);* C5 t7 } M+ T
-
+ [1 j# B8 J0 Y7 }; J5 x - }
. ?2 U" s1 {. |6 U2 M - return data;; S4 m" I+ x& S7 K
- : L) X" W# M( y' o% d
- }
) ]4 Z! h8 L+ ? - 6 K* W4 N* K& R% {1 c* u) |+ ~
- void DS18b20_write_byte(u8 dat) //写字节
$ |1 X5 E+ K$ n7 ]8 P# X% N# E$ @ - {, T" u" O# R/ O2 _5 V1 N
- u8 i;# q" z& d# G! S( s" \/ O
- u8 one_bit;
( o6 @: ]; p# {; O - for(i=0;i<8;i++)$ S6 e( r' G' S0 {; k! C
- {: H5 A5 @; Y5 e3 I
- one_bit = dat&0x01;* f0 T) A$ V9 Q: b2 e' O {
- dat = dat>>1;
/ f2 c4 A/ }* _4 R: K - GPIO_ConfigurationOUT();1 o9 x: D+ W' O* h7 [3 a7 h
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
8 p$ `1 N1 e; ~+ X* G - Delay_nms(125);
* T% \# F* r) {& T( ` ~" Y - if(one_bit)
- \5 ?& ~. o( c% E/ [) A) S - {
" R0 Y. B+ T7 ^; O9 I: u - GPIO_SetBits(GPIOB,GPIO_Pin_14);
1 H7 m) W0 t/ _8 m4 g( r' c5 s4 p - Delay_nms(300);9 I8 ^ M1 b2 c& G. R
- }( N3 ^/ Z( J; F& r
- else" W! M# \2 Z* U- n/ u9 l
- {2 d4 g6 z+ v$ n. I% q1 X8 D% G4 c4 t
- Delay_nms(300);
: `6 q/ G3 c& c# F5 z X' R4 ] - GPIO_SetBits(GPIOB,GPIO_Pin_14);. s# J; e% b: B" L3 K I5 m
- // GPIO_ResetBits(GPIOC,GPIO_Pin_13);; q t! d8 q% M+ V. C/ U
- }7 E0 X' Q/ X# X" L5 `
- Delay_nms(80);% D* U: P8 w5 x2 g- o, y: R
- }( M- d8 a% }( g9 z! M
- }
* J' O6 M: U( K4 h - 1 T: ?- I) Q! T8 v
- u16 get_temperature(void) //得到温度数据 a1 N( X J y3 ?; V
- {' f' ]9 o I9 ~- ^, L3 A
- u8 a,b;: s0 k) |- X# W l
- u16 temp;
# }" v3 C {& u+ i
1 H) Y: [- M& b2 Q0 I- DS18b20_reset();
6 t, v) g# {/ ]1 E- Q - DS18b20_write_byte(0xCC);
' o! r* c2 K) u! h - DS18b20_write_byte(0xBE);0 i$ v% |7 S- O: |0 l# o
- # x \0 ~: I- p6 _+ X0 R& v1 C+ b
- a = DS18b20_read_byte();
9 Z! N$ } V' @' c1 k7 g - b = DS18b20_read_byte();% h9 @8 W3 }! {
- temp = (u16)b<<8 |a;
1 E# M* d6 t U$ [$ |' ~ - return temp;
' q* C* v! K! }9 H - ! r0 T, Y, i3 Z0 A0 t6 I: G) B% }! ]
- }$ w, F7 _& h2 R/ e
- void temperature_convert(void) ' c9 `( \- P6 `
- {3 \: R3 p; y* x4 o6 t8 m% i
- DS18b20_reset();
& D3 ^4 k; M, P( ?1 U - DS18b20_write_byte(0xCC);) l: F' e* Q7 ?+ f
- DS18b20_write_byte(0x44); |; n- M& z; h$ w
- }
6 ~6 W1 o- r( i+ R" Z0 g - void init_18b20(void) //初始化
5 H& ?$ t8 D! c: k+ E( X' t - {
/ _7 ?$ x. V/ w+ ~ - u16 temp;
7 ]' R, K, W+ G! f+ L& J+ R2 W$ z8 ^ - do
) ^9 g6 s9 C# N% ]1 A, Q9 p D" r7 q4 O - {
. ]; [2 L/ K7 R j - temperature_convert();5 f5 [. R1 n0 i5 D( h9 H
- Delay_ms(20000);2 s s) M$ }& M; K9 G1 N0 K v0 H9 i
- temp = get_temperature();6 J! j* q2 y8 c4 H# b
- } while(temp==85);
5 _1 y% s/ t \/ \# p% M9 ^! O - temperature_convert();
# Z8 W8 K |7 r- ]3 P% U - }
6 P' q! s1 t9 h! q - 5 m k* ^2 \- }2 N5 _
- //u16 showdataT;1 ^& J! ~! m i/ x0 c* V- i
- void tem_process(void) //计算温度
. p) L) }% I1 _; s( X7 U - {9 d* h1 p% ~. t
- u16 showdata;
" V& b1 S; C p - // u8 Tbuf[2];
8 {) ^1 |: r9 s0 g" m - temperature_convert();
+ z' o* V5 `3 _/ [- a: ~ - Delay_nnms(0xAFFFF);$ v# J* D! b7 v/ U7 h
- Delay_nnms(0xAFFFF);
) M5 l9 C' d8 [1 F, X - showdata = get_temperature();
4 _9 ?- w X N( e9 ] - showdataT = showdata*0.0625*10+0.5-10; //计算温度8 i' N: O! v* s1 X# H
- }
复制代码 , J8 _7 ~* t1 m+ r# V: [/ m+ I
本程序通过定时器定时200mS读一次温度,数据显示如图5所示: 9 p$ \% V+ z! `
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
- B4 O5 ~( _2 K |