找回密码
 注册
关于网站域名变更的通知
查看: 741|回复: 4
打印 上一主题 下一主题

ds18b20温度报警器单片机源代码

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-10 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ds18b20温度报警器单片机源代码  B% M- h8 I% t6 L
# ?# H9 d" |" i7 N

$ e, s* h+ G, w9 }4 T5 K' \
/ i9 R# X: F- c
1 Z1 a) g+ }# S8 A& z$ ^& r' ]/ p
单片机源代码:6 [3 g' c$ L3 y' k" R$ }6 p: W
//------------------------------------------------------
" l4 j: S5 a* k/ i9 N% S- j0 G% X1 h//用数码管与DS18B20设计温度报警器
: f6 W- Z( {8 O' g7 m6 e, i  _2 ?//------------------------------------------------------
* U3 K. Z; X- w# I- l, w* u//本例将报警温度设为高:40度 低:-3度,当DS18B20感知到温度达到此临界值时
! P5 L9 K0 w* G/ H$ k//系统发出报警声
% _4 C/ d! u' X#include <REG52.H>5 K) \8 c5 i  T* i" g
#include <intrins.h>7 `5 T4 q3 g! c; ?% p
#include "delay.h"! Z0 P3 i% M) v& T; K
#include "DS18B20.h"' J( p" u  k7 ~* T3 I, [2 ]8 \

# }7 A* e* P; ~$ b( I8 k3 ~6 F
1 v% U/ o9 }3 l" {' Z8 \% F
uchar display_digit[4]={0,0,0,0};                  //待显示的各温度数位6 T4 k7 U, d* E
uchar LCD_display[16]="                ";                  //LCD显示的温度值
' W6 ?) Y. \5 V+ e1 t& K4 Iuchar LCD_alARM_display[16]="H:      L:      ";          //显示报警温度) t; d# ~4 }, f& {2 p' l3 ~" t. a
bit HI_Alarm=0,LO_Alarm=0;                 //高低温报警标志" {, b4 M+ p* Q  y0 X
bit DS18B20_IS_OK;                        //传感器正常标志# P+ [" G+ U2 _
) n3 y% D# o& h/ d1 O4 H
3 b4 h* o' m" H' }! J+ g
//温度小数位对照表  K2 ?" t; i' z2 ~: E+ B
uchar code df_table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
7 }/ l& u7 l( V7 S//报警温度上下限,为进行正负数比较,此处注意设为char类型
1 e) M" V! f2 B//取值范围为-128~+127,DS18B20支持范围为-50~+125
  [* z0 T' E% u* X% S' {2 z. Gchar Alarm_temp_HL[4]={30,-3,0,0};//报警温度预设及存储
; e) e: j* u5 {. j# R1 F8 x( Z8 @8 j# N: a) }) i
% A/ \' y' J" x" j9 l
uchar currentT=0;                                                  //当前读取的温度整数部分! q" |% I/ `( p( o+ c8 E$ @
uchar temp_value[]={0x00,0x00};                          //从DS18B20读取的温度值
$ R% z5 H# M1 q$ U* @/ b//初始化DS18B20
3 U( m& v% g3 L) V8 l' l( o# D6 [7 yuchar init_DS18B20()
5 h2 ]- o2 |, I. [6 {$ q{) k3 ?* {, b$ v  h9 X6 s* M6 b
        uchar status;
: I0 r) s/ e* Q9 f        DQ=1; delay(8);
$ b7 p+ [/ b* Z& m/ {- t( S# w5 K        DQ=0; delay(90);
7 L: S, w7 o, ?6 v7 M% ~$ Y        DQ=1; delay(8);0 U" [& Q& j0 ^" N, Y+ N& o
        status=DQ;
8 g# B7 b- q/ ?7 `        delay(100);7 k+ X$ f4 s( x( `3 X+ J: B2 v
        DQ=1;/ ^) H' V( U* D9 z
        return status;          //初始化成功时返回0
% L  b; k# y  W}
3 d' v. j' W8 j+ L3 U* W7 u$ h- D  s& A5 c& M' Q) Q1 }" k) I

" |* Y. I; `4 B* Z//读一字节' u" U/ m; B7 k. u3 Y: }
uchar readonebyte()5 s3 t6 x, k4 b: _" w* `# U7 O- x
{
9 F" C! m& K; Z1 Z: a        uchar i,dat=0;+ J, J+ }: c* q9 w% L
        DQ=1; _nop_();
  K# ~. V- Q% j$ ?# e) |        for(i=0;i<8;i++), O2 W. ^9 v; c: {. T
        {; r+ P% s) W( N
           DQ=0;dat>>=1;' c2 O% I2 `5 h5 N
           DQ=1;_nop_();_nop_();//拉高,延时进行采样 单总线是进行与的5 F2 ?9 U: b* W# l- F
           if(DQ) dat|=0x80;  //如果DQ是1,把1存到dat里
# Y' f+ X6 O7 _, _$ t6 Y           delay(30);DQ=1;' E" l' F0 T4 k" x7 c1 W& ~7 s
        }; b* s1 m: [2 G. a8 j& N4 q- K
        return dat;7 b, V+ k0 L: E0 ~/ x
}
1 t. b/ v$ q! \* m8 a+ v( C* v! E$ S* i  v3 J* J

9 f5 e* i) k  t3 D//写一字节
7 ~1 }: J+ B1 W% J% @- ]void writeonebyte(uchar dat)  a- b$ U1 F% E, J+ t% a
{( g( z/ n+ n+ z4 c: b4 `
        uchar i;
% z! n5 g0 L5 g- I- C        for(i=0;i<8;i++); W2 S! N( n: _, `
        {/ q. z" m& B: R: Q7 }
                DQ=0;DQ=dat&0x01; //先取最低位,先读的也是最低位
+ \- R: G( l$ u: f+ e3 v4 a                delay(5);DQ=1;dat>>=1;: T( n6 W* q) h) j
        }
) w# i+ T* i' Y' u}7 f! ~+ ]) H8 b" j
  X; q& [' K2 u
4 [4 o/ e5 u# d, Q3 D8 l9 X; w
//读取温度值
/ D8 c1 |& B/ ~void read_temp(), Y% c! ]+ v. b$ a) a* H+ [" F, L% q
{
5 o& V: F6 R* {7 Y9 G        if(init_DS18B20()==1)        //DS18B20故障
/ `, x" d& ]& W( |                DS18B20_IS_OK=0;
4 Y2 F/ L) U& j0 l/ i* W        else
  }8 U8 h1 M7 X3 N, _  H# P! E        {
1 f. W- c& U; |- q' y2 |% y2 J                writeonebyte(0xcc);          //跳过序列号
- q3 q) G; i" [: l7 A. x" G7 s9 [                writeonebyte(0x44);          //启动温度转换% c  {4 z. D$ C9 W- }) ?: Z5 }
                init_DS18B20();# Z/ r$ A) Z- G4 [+ Q8 u
                writeonebyte(0xcc);          //跳过序列号
2 q( T1 @. n/ M# }' a. Q: Q                writeonebyte(0xbe);          //读取温度寄存器0 u2 M( M$ s, u0 T# {! ]& j- w! [3 U2 j
                temp_value[0]=readonebyte(); //        温度低8位
8 ]. |1 y7 ?/ _( v5 @* I9 R8 D                temp_value[1]=readonebyte(); //        温度高8位
+ A  _! L2 H& V9 g- d! d                Alarm_temp_HL[2]=readonebyte(); //报警温度TH, O+ E4 V* n5 C
                Alarm_temp_HL[3]=readonebyte(); //报警温度TL: u( Q# F( s( D' O# r6 w& k& n
                DS18B20_IS_OK=1;1 z4 |% ~  B3 }* \6 K
        }        : m5 ~! F/ P+ R9 ?5 D& H
}0 a3 v  @4 S; A  {  F7 I* _! S, P8 l
3 L5 f- a, Y1 z& a* O7 u  s* y* M
) C! M* L9 O& e2 A! c2 f7 W
//设置DS18B20温度报警值
$ c9 i' I: s7 b% ]; ~! |void set_Alarm_temp()' P  _- `8 s0 O! i9 \' I2 \
{& Y9 j( c: Y6 S9 q: i
        init_DS18B20();& z6 w9 s) k7 m2 r& P. T0 g
        writeonebyte(0xcc);          //跳过序列号
; A- u$ R$ t# A0 r7 y0 a% z        writeonebyte(0x4e);          //将设定的温度报警值写入DS18B20: s/ p9 }  Z! w% }
        writeonebyte(Alarm_temp_HL[0]);  //写TH
) q5 J4 u! w1 r2 d$ m    writeonebyte(Alarm_temp_HL[1]);  //写TL
" I5 q8 E! F3 G' N- `& Q    writeonebyte(0x7f);                                //12位精度
, s0 R  v  Y6 u# a, R1 K# E        init_DS18B20();
& w9 r! ^; |) T/ i. J7 |& @2 h7 F% U        writeonebyte(0xcc);          //跳过序列号
) K9 ]0 p/ I; ]6 N3 K" i( I; G        writeonebyte(0x48);          //温度报警值存入DS18B20
& e1 X" D; t! B5 X- f9 y9 y$ }}* k1 F( e# I& q. f6 e- ?6 A$ J

7 f% q: D6 V1 Q# z4 H1 k: m( x5 x
5 m5 `+ q$ m% M3 x/ M
//在液晶上显示温度处理* J# x% _( n: b# s& F. l
void chuli_temp()
$ d5 J0 l  \% M5 O8 N{# N. h9 P$ j) o' d! E) x. ]3 j6 w
//------------------显示温度处理-------------------------
/ \3 }6 S+ f6 v8 t: r0 {        uchar ng=0;           //负数标识
  N3 Q- K5 i# _' }        uchar t=150;                 //延时值( }: d$ l2 w2 y. Z/ ]* k' P
        char signed_current_temp;                //注意类型为char
% P  E/ ^) J" d        //如果为负数则取反加1,并设置负号标识及负号显示位置
8 G2 A: u8 P5 I        if((temp_value[1]&0xf8)==0xf8)
9 M/ e: n; P: H8 b, n        {: @7 z$ m" e! u2 S9 F
                temp_value[1]=~temp_value[1];
3 O6 {) ~% Q. L+ x5 G                temp_value[0]=~temp_value[0]+1;0 x$ t5 f; F: ^$ m( T/ f
                if(temp_value[0]==0x00) temp_value[1]++;
/ e% T2 B# C) n' _: E+ H  P                ng=1;3 l- y3 F# O- [3 Z% Q  R% U+ B( L
        
2 r' D' V6 e. t# |5 {6 C" `" ]        }
) ]) d, n# \# p) w6 p  //查表得到温度小数部分
' m" E/ g# B% i  display_digit[0]=df_table[temp_value[0]&0x0f];+ Z% _) s2 s" s% D
  //获取温度整数部分(无符号)1 s2 ]9 a( T7 p; t  i/ [. G- U
  currentT=((temp_value[0]&0xf0)>>4)|((temp_value[1]&0x07)<<4);7 o4 F3 X4 U, F8 z0 |- d  @
  //有符号的当前温度值,注意定义为char,其值可为-128~+127
, d) ?' Q  c5 N. n  signed_current_temp=ng?-currentT:currentT;
" b# w  J) K( Y4 N' s) c' ]  //高低温报警标志设置(与定义为char类型的Alarm_temp_HL比较,这样可区分正负比较)3 d* y, l5 H  G
  HI_Alarm=signed_current_temp>=Alarm_temp_HL[2]? 1 : 0;
6 |2 q$ C4 F$ q5 X! i  h! W' W4 U9 R9 Y  LO_Alarm=signed_current_temp<=Alarm_temp_HL[3]? 1 : 0;7 `( Y* G: H3 Z* `! M# e# c' T$ v
  //将整数部分分解为三位待显示数字1 ~/ p0 `' V3 Y' ?4 Y+ B
  display_digit[3]=currentT/100;7 x! ]. J, C2 w; j9 T; J" U3 x+ ]
  display_digit[2]=currentT%100/10;
4 P5 {6 B) g; \$ Y  display_digit[1]=currentT%10;
8 q' \( c# U- D" L) |  //LCD显示数据2 y  s7 Z+ }8 d5 m; t% K7 [2 W
  LCD_display[2]=display_digit[3]+'0';          //bai
: Q, T1 L$ e" @  LCD_display[3]=display_digit[2]+'0';          //shi
  o& O. y" g- t5 C7 T  LCD_display[4]=display_digit[1]+'0';          //ge
: c4 D- b' [, C3 }  ]  LCD_display[5]='.';  o. S5 X. \7 d! m" }
  LCD_display[6]=display_digit[0]+'0';          //xiaoshu
0 `" [# y% v# X/ [8 l  LCD_display[7]=0xdf;                                 //。1 E. M! Q% U8 S4 ?4 B: I
  LCD_display[8]=0x43;                                 // C
1 |( E% y+ M# E& l8 \  n4 V! E
6 M. ~7 W' p/ {% B
5 T, g$ O  D) d1 g! @7 ^7 U
  if(display_digit[3]==0)                           
! Q8 D- j  Z* p5 z5 K4 U# x+ Q( p          {% [) [  K: B/ a
                    LCD_display[2]=' ';                        //高位为0则不显示               
3 y2 \2 `. o# w& V& ?                  if(display_digit[2]==0)
; z; P2 b# H. t( q0 f/ U                  {" B1 g- H7 c; b( J
                          LCD_display[3]=' ';
! O" b; n5 @! i: G; R8 ~/ {                  }" s6 h& ~2 N4 V
          }
2 F* A' J7 D9 A9 o* @  ?        //负号显示在恰当位置
$ k% ]5 P' Y' M2 I3 v        if(ng)" `# r8 E3 b" U+ p
                  {% Z; S0 i" q2 h+ k) V
                          if(LCD_display[3]==' ')
( g/ C9 ~8 q$ _$ g+ K                                LCD_display[3]='-';
% C4 x4 p; C+ h( c1 s4 p! ^% N                        else if(LCD_display[2]==' ')( a5 {4 h) [% z/ ~2 a3 L
                                LCD_display[2]='-';1 j- A8 N! G: R6 ^! a# p$ d7 M
                        else LCD_display[1]='-';
4 |1 H: n  d0 Z& c! _# i+ r2 a                  }
2 ~% j2 G# ?0 c) T0 R* f//------------------------------------------------------
5 W# L: C% \3 v. _" a; q1 c) S2 s2 Q- N2 q3 v
2 E  `' Y+ c$ Z9 s7 [/ s
}% B% g% S7 T: h/ b
4 s- _# l8 N; L- h2 o9 _
0 o4 ?6 k9 z' f; g
void chuli_alarm_temp()
: a- D+ m' _7 y# f0 A4 i# L5 D{
2 h) X/ b4 ]: V6 [4 T- U//---------------------报警温度处理---------------------
  |3 j7 z* o( M$ a' K   uchar ng;2 O( p* f1 l* x* w+ r- v7 U, R
   //由于Alarm_temp_HL类型为char 故可以直接进行正负比较9 I1 g' g  P7 c+ o! K
   //高温报警值
+ B' I0 {( W) ?3 u2 t   ng=0;( z9 l5 [: V, o5 D8 \+ N
   if(Alarm_temp_HL[2]<0)5 i- e2 N6 }' ^: ?- x
   {9 u  t& R" I+ q2 U. o
              Alarm_temp_HL[2]=~Alarm_temp_HL[2]+1;, ?0 C' m9 N6 m0 m6 b
           ng=1;0 f: U$ a  ~" @' A
   }
9 O( C2 V; d( l9 T* y0 M' h' h   //分解高温各数位到待显示数组中4 q. X3 I5 r: y  W/ H! q; a6 Y
   LCD_alarm_display[3]=Alarm_temp_HL[2]/100+'0';( {. t1 u2 s/ U6 V
   LCD_alarm_display[4]=Alarm_temp_HL[2]%100/10+'0';0 ^" e  `  T: G/ ]8 Z
   LCD_alarm_display[5]=Alarm_temp_HL[2]%10+'0';
0 L" v9 \# x3 h0 Z/ R3 |" [   //屏蔽高位不为0的$ e0 I1 O1 Y: I' g4 ~/ i( Z- v
   if(LCD_alarm_display[3]=='0') LCD_alarm_display[3]=' ';$ ]/ c4 Q1 ~: O" \* s. L3 z4 j
   if(LCD_alarm_display[3]==' ' && LCD_alarm_display[4]=='0')
6 ^8 K. Y2 g( X/ y$ r. B       LCD_alarm_display[4]=' ';0 ?% P" }) b! [4 u# V3 C, }
        //'-' 显示; x/ [$ F! I. E+ s7 ^* ?
   if(ng)
' X( n" z) R$ U   {
4 ~/ e, N; Z( ~, z                   if(LCD_alarm_display[4]==' ') LCD_alarm_display[4]='-';# U% a) K! J. L' m. a- Q( p
                else
% e0 d; C- `4 U* Y1 R                if(LCD_alarm_display[3]==' ') LCD_alarm_display[3]='-';  l- n$ P3 b. m% i7 k0 |
                else LCD_alarm_display[2]='-';
/ F  T2 p3 o$ x) ?   }* C5 p  P3 [5 p/ s" Y6 s# P
   //低温报警值
4 x) I; d, E: a2 M* d5 X   
$ b$ _: J7 z, e& ~  f  O   & [% J8 U9 l7 E5 g6 n
/ z2 L5 X5 M: E

7 I' l* d: A5 G! M8 n3 r; A! N…………限于本文篇幅 余下代码请下载附件…………# p" D) h% _' K" P6 I+ {' I
7 W: E! @: l. z
完整代码下载:
! Z( u, W1 g3 N+ i
游客,如果您要查看本帖隐藏内容请回复

* n3 o2 A7 B' _4 Q; F) s4 E- f) M% I/ `" n* C& l$ J

该用户从未签到

2#
发表于 2019-1-10 17:09 | 只看该作者
看看楼主是怎么弄的

该用户从未签到

4#
发表于 2020-3-7 14:23 | 只看该作者
谢谢分享

“来自电巢APP”

该用户从未签到

5#
发表于 2020-11-20 17:43 | 只看该作者
感谢分享,写得真棒,很详细!
5 x9 j) x4 B6 ^7 n5 Q
7 p$ v" A4 R# P" e/ L9 j( U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 15:41 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表