18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示: 2 x6 a8 ]+ ?' i1 T
18B20的引脚定义如图2所示:
: i7 {* y/ q! g/ J' d6 n( c; R
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: % Z5 Q8 Z! b p1 L. ^: @
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
u- }" r! P. m' H: F - {7 P. L9 Y% i5 F Q2 [/ q0 V$ x5 g# o
- u8 i;" k' L" c; a, `7 ~. y
- u8 data=0;
. y2 k2 Y" h- {6 c. a - for(i=0;i<8;i++)
3 f8 B& e6 s3 x. ]& A0 r2 W - {! E1 b f5 M' x
- data >>=1;6 T! z# i5 e% ~( a" L% u
- GPIO_ConfigurationOUT();: R% C7 }6 B, |" U, V
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
9 W: W! W/ q, }. Y - Delay_nms(15);
" N( U* W/ V# l$ t- y9 e - GPIO_ConfigurationIN();
7 Z9 H. B: M& F4 y% K - Delay_nms(50);/ o& i8 C" {! k* H1 C- Q( X
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))- Z6 ? z6 L+ Z0 F
- data=data|0x80;
! x* K5 A: K. ~ - else/ Q; {1 v: |0 G1 [! K0 l' {
- data&=0x7f;) W% Y# p8 u" `& p& {5 ?% f( Z
- Delay_nms(600);
- A# L" O% I3 U -
7 g4 b$ E3 B9 t. P/ v9 ?3 N/ _ - }! {0 O6 U8 c5 _3 s9 g
- return data;- j/ w' p8 o0 d# P4 [1 }
- 3 v& K! ?: o/ k0 ~9 M
- }2 {( w1 D& v ?, x
- $ J L% o9 l/ U2 N9 _: M
- void DS18b20_write_byte(u8 dat) //写字节
5 R9 y# X/ J: j( _( ?: K3 r, d - {( T6 ~# N d% [# T- B: r
- u8 i; q* Q0 ?/ P: ~( q5 Y$ ?
- u8 one_bit;$ a3 l3 k1 q2 g! u8 m+ f( M
- for(i=0;i<8;i++)$ ~0 R. x" ]" R [
- {
# a2 [; e" d. {9 |$ I - one_bit = dat&0x01;
" w* j+ G9 M; S' W9 E5 t' T - dat = dat>>1;
* R- r% d& }2 Y1 \ P- Y" p - GPIO_ConfigurationOUT();
. i. n3 a/ v% {. J& a% e, v% Q - GPIO_ResetBits(GPIOB,GPIO_Pin_14);' D' N; i+ G9 |5 [+ M% w
- Delay_nms(125);! k+ j7 R, ^2 V' m6 j, r* r
- if(one_bit)8 ^. G9 f& M! _
- {
$ q# n a0 `: g( ]& _- ^9 g - GPIO_SetBits(GPIOB,GPIO_Pin_14);) a2 N; \( u m/ B8 ]& I
- Delay_nms(300);% ?* u$ F2 D# L$ s1 W* Y
- }
2 d: T% U0 {" ^& k - else$ T9 R3 S+ r6 }1 U2 D9 y
- {! D6 Z% G: Q- C1 c
- Delay_nms(300);: j6 S! Z+ @% T- u( K+ H+ i. y
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
* B7 V s0 J% ]; i; {% q - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
0 L3 s1 |" x3 O( _) o1 G - }
- n9 D: S2 B# j! p6 P1 r8 M0 z: s - Delay_nms(80);2 K0 d# |- ]* j& X
- }
, @$ x3 `% J/ }& I+ @( }6 q2 W, f - }8 h) ]% V; K4 e8 ]) O2 d
- ! P9 ]' {" ?- j+ Z
- u16 get_temperature(void) //得到温度数据
" O e! p* m: h, r8 a - {
% H3 I @1 y u1 y* M9 b - u8 a,b;
8 C4 Z0 ?$ M" k7 L - u16 temp;
. i n8 i8 L- z# i3 X
O) F9 o$ T6 d' i- DS18b20_reset();
0 w8 g+ t0 b! m: N - DS18b20_write_byte(0xCC);
2 j* U7 b2 ^8 J! o. g4 ^ - DS18b20_write_byte(0xBE);
/ e7 p1 l; s$ M4 X+ ]$ h - / G5 e' N3 d$ N5 @/ B
- a = DS18b20_read_byte();6 q* x3 ]% D; i7 q5 {2 s
- b = DS18b20_read_byte();2 l# U( B3 h7 @! u5 f$ N! ~
- temp = (u16)b<<8 |a;0 S$ N, |; e' \
- return temp;9 F8 e3 S6 B7 i1 L9 Y
- 6 x! C: R& e% Z/ o" Y& b
- }
0 K/ L9 y; P/ F' e. N$ E - void temperature_convert(void) . L1 v2 L: J2 R# b# U
- {
/ i! d. i! o* i5 k& p! L# }# k - DS18b20_reset();
# L. i" q* M! u" g9 B( p8 S - DS18b20_write_byte(0xCC);
. Q0 E2 T& [* I s - DS18b20_write_byte(0x44); P6 `. B; \7 N$ {8 m7 X6 A% Z' m2 x9 |
- }
/ r) K( \ y b1 V9 p w/ A - void init_18b20(void) //初始化7 ]! k% v& p+ Q8 C \( m
- {! b+ L' z9 p! S3 S
- u16 temp;
9 g0 z+ f1 h5 y# A$ Q# e$ T - do% O" b, ^( z4 a3 P
- {
1 B' {( M5 v8 V% c0 g3 c1 F - temperature_convert();
6 R; k2 _$ E9 U7 r1 s% W9 t - Delay_ms(20000);8 D* t$ P/ j- `1 `8 g
- temp = get_temperature();2 y3 q/ C- A; W g$ T O& J F& e
- } while(temp==85); , ~5 u, j0 p( F' Q
- temperature_convert();
# @6 v, Z% I2 X: N6 x3 v - }
/ Z/ |* G% }& I+ N" ] -
) ]9 P6 m0 P, r6 X# R" J' Q - //u16 showdataT;
6 ^+ ^. r8 @( f' b - void tem_process(void) //计算温度
. I* n2 h" H7 J! r* y- q% s3 b - {9 i6 E+ c4 h, o6 ?# M
- u16 showdata;
- J' W2 P! V+ i& Y! N+ ]4 s - // u8 Tbuf[2];' _3 O+ }4 Q/ U" H3 ?9 y
- temperature_convert();5 m; J+ }" M# {5 f& d. M& t: p
- Delay_nnms(0xAFFFF);
" t# x7 h: V$ l) b6 \4 y - Delay_nnms(0xAFFFF);7 ]! @- t8 I' `1 Y
- showdata = get_temperature();9 L& Z1 `, l* V* @+ q+ l
- showdataT = showdata*0.0625*10+0.5-10; //计算温度 _& y' u: _8 Z. _" w6 c
- }
复制代码 ! c" Q# K3 _: L# ~* z6 U
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
' ^/ q3 M' S) ?" e0 T
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。 i. t1 V1 q3 Z
|