|
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
% {3 M V* z+ ?* A' e' S) u
18B20的引脚定义如图2所示:
- {1 g' F6 q# Q+ O+ `* A, M
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: : V# ~1 d+ O* s+ I0 H
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节3 _/ ~% s+ @# U2 f' {
- {' D, o7 J. r; C( i) @3 t/ b
- u8 i;
( m" u( g* j- `( w - u8 data=0;
9 t: t. I6 [3 \6 e0 A1 F - for(i=0;i<8;i++)& E v1 {3 Z8 a, u# X; I# t
- {
# ^$ h" I/ m* ? d1 Y - data >>=1;% l5 @6 L0 h2 E: W$ h/ I, Z
- GPIO_ConfigurationOUT();
- P# e$ V0 F! { - GPIO_ResetBits(GPIOB,GPIO_Pin_14);/ D% F- t% m& n9 B/ l, Y$ [
- Delay_nms(15);) ?4 {6 ~ p1 ~: A2 q
- GPIO_ConfigurationIN();% n$ i5 r5 A/ ~& E0 f
- Delay_nms(50);$ L& P; j2 X* P& U# {7 [3 B+ O1 w
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
0 W' ?+ f. [" I1 W3 U9 [ - data=data|0x80;
8 m; I6 x( n U; H - else
* W1 G* u0 C# O# c" n2 ~ - data&=0x7f;
& j7 E1 q! l* [3 F9 I - Delay_nms(600);! L' E W+ m0 w: x
- & }/ K: K4 t$ d
- }
" v. Y- ~! s3 p% @+ ?/ b2 v - return data;
n6 m( \0 _% ^* e5 f# I' n( k! ] - " T: m7 @: u0 a: m! {$ ], K
- }; P; d# }1 z! g: q+ K
- 0 R ~- @" r. r3 W/ y
- void DS18b20_write_byte(u8 dat) //写字节
8 Q% ^9 e, j9 U - {3 I5 l1 S! F: {5 a, m# }
- u8 i;
, q; q+ ~) J2 o) C6 { - u8 one_bit;" o1 b) B" e' S( V
- for(i=0;i<8;i++)
5 Q- E) k$ }6 i - {
4 i' X. s/ _3 Z1 A& Q$ L - one_bit = dat&0x01;
5 k( |/ w4 f- w - dat = dat>>1;
# Q4 v6 g( Q4 i/ @! X - GPIO_ConfigurationOUT();6 _1 k7 j+ G% m3 z5 v
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
$ P2 f y1 [4 s6 w6 B, c - Delay_nms(125);& G" ^& u% K9 X- W' L: z1 J3 t' }; n
- if(one_bit)
7 J# i: p4 G+ S* x5 V2 Y9 u: H( { - {
+ X! L8 V ]* W2 P/ f6 p) |, X4 r - GPIO_SetBits(GPIOB,GPIO_Pin_14);
Z+ ^) W) ?3 e2 N h% C0 U ~3 Q - Delay_nms(300);4 i- P! ?2 f( ~' P* }6 I, |1 b9 |
- }3 D6 b+ W& D" k3 q! t
- else3 E; Y, K K% k/ ^0 f7 B
- {
# o1 Q9 p4 z7 z - Delay_nms(300);: j* g. E5 f! z |
- GPIO_SetBits(GPIOB,GPIO_Pin_14);* Q' H: g5 ?2 G
- // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
2 n8 D* K6 O0 V7 d5 d - }
) a0 D, t. f& k - Delay_nms(80);) J' E' c% w1 a, S
- }
( J8 _- u% ?9 P) | - }5 r7 J" Q s1 _1 J
- ' d w$ F% c* J! U4 _/ [) W$ |
- u16 get_temperature(void) //得到温度数据
: ]- R3 y/ N% ^5 a. r X! e, k - {3 z3 n ?2 q, o
- u8 a,b;9 u8 _: v# ~2 h. f, o) M* Y/ w/ L
- u16 temp;5 q+ X/ k6 {( C4 h# [9 r
- % ]: \9 k' M: k+ d" f
- DS18b20_reset();7 o8 ]1 V3 T3 L3 L. m
- DS18b20_write_byte(0xCC);# |/ T9 I6 D2 z2 _0 ~6 j) z; ^3 A7 m
- DS18b20_write_byte(0xBE);7 ?) z( e+ {, `4 B+ u; Y- x
-
3 L' y: a* E6 \6 S: C - a = DS18b20_read_byte();0 e8 E. u% s$ @7 v
- b = DS18b20_read_byte();4 G2 @3 k$ U0 w- Q
- temp = (u16)b<<8 |a;
R2 O! Q p3 l- R7 S1 w* \ - return temp;
- u; L- b7 k' W; ~) [9 I& A - 8 A1 c& A' y1 V( }3 d' s
- }7 n! M1 u- u- T' q: n' [
- void temperature_convert(void)
. w# K& U3 [: Q: l. M& ` - {1 v( S7 C4 P* B& E) v, f; L
- DS18b20_reset();* V# O9 L* g! F/ l0 k5 P
- DS18b20_write_byte(0xCC);2 |# U; b9 V" Z: n4 @& X4 }
- DS18b20_write_byte(0x44);0 Z, _. I8 X( r; K, [9 T, R% E
- }
% M) S) R* t0 {+ e7 w - void init_18b20(void) //初始化
( q8 k: G( V- @8 a - {
/ i' e# m0 E( i9 b9 y0 Z - u16 temp;7 R7 {8 ?/ S: C
- do! Y8 R+ _! V8 C! F2 U2 K) a8 N8 N& X
- {& j* t, ]8 `1 s$ j; a! U
- temperature_convert();
: K; D. [+ l4 f4 ] - Delay_ms(20000);& B6 ^& Y; n* H) `# z! Z
- temp = get_temperature();
0 s7 U" _% h! Z8 y0 U9 ^3 o - } while(temp==85);
/ N9 d* K8 k0 _" G# v - temperature_convert();
( N4 K* D) V! m9 T' A# L" @: [ - }& N/ }9 F) P5 F" Z
-
+ `% ^$ ?0 u3 z* n) E. H - //u16 showdataT;6 h% ]- _/ g X w$ i& f$ G3 C% D
- void tem_process(void) //计算温度" E& m# d! F+ \3 k! ]2 X* K6 n
- {
4 m/ V6 C( k9 q+ ~- r6 I* o - u16 showdata;
+ ^2 f9 l. s# l; V) ?* B0 T6 Z2 ~ - // u8 Tbuf[2];+ s& c O8 F+ ~$ _( d! ]
- temperature_convert();$ w6 f% L4 _1 b+ n
- Delay_nnms(0xAFFFF);
6 O0 }4 ]" V w* u8 L. Z* N - Delay_nnms(0xAFFFF);, U y; o8 y6 D
- showdata = get_temperature();6 @" q4 c8 _ X
- showdataT = showdata*0.0625*10+0.5-10; //计算温度/ [1 S. y0 y) i3 {) l. d
- }
复制代码 ; c# [6 M) z' Y. X; t. m
本程序通过定时器定时200mS读一次温度,数据显示如图5所示: 3 J5 p4 ^! X4 A" k
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
5 r& v9 {) l/ W |