|
18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
% q; W# ^( g, Q2 E) M
18B20的引脚定义如图2所示: , ~: W5 P/ F( G+ K2 d) N
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示: ) s; T ?8 Z T1 M+ E+ ~, W
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
4 o2 D' u& g" Y, p+ W - {
3 L* q X1 c4 F3 f( Q$ g2 ^/ V - u8 i;
" V5 w3 d9 ~+ y6 n8 u1 J - u8 data=0;$ ]" t: Y- y) u3 k0 t
- for(i=0;i<8;i++)7 _2 n7 W8 |6 T& Y, E& P3 k! X
- {
4 H: [0 C1 C! r) K/ v+ Y, k l. j6 N6 r - data >>=1;% M/ |6 d8 f( Q' l& m- l: ?3 |
- GPIO_ConfigurationOUT();
?+ v7 b) t3 g. y8 S - GPIO_ResetBits(GPIOB,GPIO_Pin_14);% b0 U& T: N8 [3 D
- Delay_nms(15);, k% V$ [+ X5 W6 h8 g- n' l+ R
- GPIO_ConfigurationIN();+ I1 o8 X3 }! R
- Delay_nms(50);
2 u' U' y" w, D5 a. ~ - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
# x1 k9 D0 J }: a# w! R; q - data=data|0x80;9 n( d! Z" ~1 B% Z W
- else
9 `8 _) {: N7 M8 {! z - data&=0x7f;
: f- c/ B2 k3 B, d! V& ^% E - Delay_nms(600);
- }$ b. F+ e) V0 Q, y' p( l2 v - & n `& ^8 T+ W& G6 ]1 W. l
- }9 d" P- `( O# `2 P4 L
- return data;
4 O2 m. B1 {3 Q u" J5 n, `( g E -
/ e5 q9 Q: p6 i4 N - }& g0 d" v0 }6 N% I$ Q
-
+ [; ~# y; B$ @, o6 ~ - void DS18b20_write_byte(u8 dat) //写字节( Q6 M) I, t7 P) U5 ^
- {
1 b$ m. d' b7 O3 [" l2 i - u8 i;8 L, |" P# c( B% I# u" d
- u8 one_bit;5 P6 p/ \# q# M- V7 f. T
- for(i=0;i<8;i++)/ z+ z! Q: Y; j/ d9 g( A' p Q, A
- {
( v/ \ A- y5 t7 F0 B - one_bit = dat&0x01;
7 V# i% q8 A! r- y4 C. ^ - dat = dat>>1;
; ?5 M: J) G# u& m - GPIO_ConfigurationOUT();2 D3 w, x: G+ A$ _
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);7 h: L, K; B6 `7 [. P! [+ B
- Delay_nms(125);
$ A3 w0 t8 v* ?3 U& {' y' b2 d - if(one_bit)
3 ~) x0 Q/ i$ s0 d$ Z* m+ p1 w - {
2 W3 z3 O1 o' u2 I - GPIO_SetBits(GPIOB,GPIO_Pin_14);
& C/ p; a9 I% {& S1 ? - Delay_nms(300);
: e& B" W7 z* R2 \ - }
4 M1 c3 z& D8 w: S - else
( p5 L0 C) ~# R% h6 D) H - {; j$ i, B0 {+ b7 G q( K
- Delay_nms(300);% v! C9 N& l1 z! T
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
% I( U: C" ]9 |6 w" {( [! z' e - // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
. L! M, l% S1 x6 h, B - }+ T/ ]2 C3 B) o9 o4 Z2 m/ O1 S' `
- Delay_nms(80);( A" [ S9 Y' D/ a
- }
: j: I% a" K" ?# f - }2 W. B! _7 [/ v/ I
- 6 T, B# L4 g; W
- u16 get_temperature(void) //得到温度数据/ O( H2 J G/ M( ]0 @( D
- {
4 W3 S! K7 f- j - u8 a,b;! D( a0 l! b4 D( n
- u16 temp;
& U1 t- t1 K; l5 p3 k* w% m, k - 9 s+ n" \, G* j n# \7 j
- DS18b20_reset();1 I9 B, M& P2 i1 Z& n1 Y: f5 r; Z6 A
- DS18b20_write_byte(0xCC);8 c7 ]2 L, w5 @! N$ Z* H5 h
- DS18b20_write_byte(0xBE);9 [8 v4 H7 P3 x! q" `0 a
-
3 X" q5 _) c3 D9 f1 M& E - a = DS18b20_read_byte();0 U l( i1 y/ H1 ]
- b = DS18b20_read_byte();
0 X9 \1 f. Z% M) n: u; J! O - temp = (u16)b<<8 |a;
! A Z9 k" V, z" n& @ L8 r0 _7 Y5 { - return temp;" `: S! e* e4 y0 `" S0 k3 j
- 2 r5 ~' t9 E) e( k
- }
5 f7 W3 A1 {3 f) _0 o8 w - void temperature_convert(void)
6 W& u7 }7 Q& U. q- ^5 D: L - {
7 i+ G7 N/ C6 x0 l8 r" A7 M - DS18b20_reset();0 q a- m5 x& `* R: I1 f! ~
- DS18b20_write_byte(0xCC);
; {& S- Q- ]/ d' I/ Z4 t+ p, P - DS18b20_write_byte(0x44);; N' y% K& d1 b, s {8 \4 L$ ^5 f. n
- }
' o; M" n2 J) W - void init_18b20(void) //初始化& P+ h9 E. `$ M% N9 n
- {
1 B5 E1 ~7 e+ D - u16 temp;
/ }. C, n. p7 C. b$ `* R - do
* O0 Q+ r! u2 ~ h2 ~ E - {9 K8 J. e( V' l; ~, }/ Z
- temperature_convert();) U; Q9 ?$ X! y
- Delay_ms(20000);
, b/ O, r- P" r/ M4 x) v - temp = get_temperature();
' I3 A1 o! s2 x- _8 E! I - } while(temp==85);
( i- e, u' {) }$ Q - temperature_convert();
; c$ v8 R* a6 R4 a - }! {% `& U, o2 R
-
p/ D! Z' O% g. ~ - //u16 showdataT;+ C0 k/ h, H7 W& N0 I% T: W
- void tem_process(void) //计算温度
; a0 [/ @8 U8 L - {
. d0 i$ n; \% J) T# v - u16 showdata;
, x9 r. w8 V7 t$ ~; U) }9 D: k D - // u8 Tbuf[2];5 B- |- K- | o5 f- K
- temperature_convert();% _9 }$ o) T0 f
- Delay_nnms(0xAFFFF);" o9 e' p- {, D
- Delay_nnms(0xAFFFF);
, }6 d- \8 U/ w+ _% x$ o/ P. X - showdata = get_temperature();
; {. J1 l, j& O! y3 b7 g+ J- G - showdataT = showdata*0.0625*10+0.5-10; //计算温度
( ?/ H* w9 {/ P: ]5 Y - }
复制代码 # V& i( T1 n* J/ s9 R
本程序通过定时器定时200mS读一次温度,数据显示如图5所示: , p8 x4 y6 x" y) b
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。 `' f6 A7 Z: d. i( d- h$ L1 z6 \
|