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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ds18b20温度报警器单片机源代码6 m/ }5 i) J6 D8 f

- o: Q7 Y# ~. V; U+ X

( R  {: V0 R; P: Z
+ x, l$ j) k6 m1 x" W0 R
, K7 Y+ f8 l0 n9 K% I# Z* v' W6 n
单片机源代码:
% L5 C5 O; k* b//------------------------------------------------------
, _7 q3 s6 V8 N( }5 m//用数码管与DS18B20设计温度报警器, g/ S5 N2 D9 E0 K5 ?* W. e7 O
//------------------------------------------------------+ x6 w6 Q% ]. n- k" s
//本例将报警温度设为高:40度 低:-3度,当DS18B20感知到温度达到此临界值时
: z* Q& q1 x; C//系统发出报警声7 l- A: M6 m3 j; B; P$ [1 a
#include <REG52.H>* U4 n, q( \8 a. m* p: |" D- p
#include <intrins.h>4 N# O8 s9 `; a5 `' Z# O) S
#include "delay.h"3 j( I: K- D4 h) s; {7 z3 }% X- Q
#include "DS18B20.h"
! z2 b3 P% Q8 l
; r$ s/ p6 F) f8 t1 a& o
! c/ I2 Q. K9 I. ]7 E: w
uchar display_digit[4]={0,0,0,0};                  //待显示的各温度数位
6 a5 L1 t" P' z0 Iuchar LCD_display[16]="                ";                  //LCD显示的温度值! [' p$ x* n" a) O* B5 U! S
uchar LCD_alARM_display[16]="H:      L:      ";          //显示报警温度
/ d" r8 R8 I  g, x. sbit HI_Alarm=0,LO_Alarm=0;                 //高低温报警标志7 Y# m, R5 F  }( M5 g: G
bit DS18B20_IS_OK;                        //传感器正常标志
& p8 W1 Z  M; q" y1 y4 s1 T  Q* Z4 @# B# S# _, K! [

) u" ?9 R; t% x! M& q9 z: A1 _//温度小数位对照表  m# A  B9 N% ^# ~
uchar code df_table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};' O; t% }; o+ x. R; b6 h
//报警温度上下限,为进行正负数比较,此处注意设为char类型/ ~7 k4 W+ `* I- N0 f3 j6 j5 Q* \
//取值范围为-128~+127,DS18B20支持范围为-50~+125# G, _( L4 s' r# N3 A: W! i! G
char Alarm_temp_HL[4]={30,-3,0,0};//报警温度预设及存储# T3 u7 Q9 j7 e- k2 o

% x) p, }3 t2 s# W

7 Z& t- V' w. P# }9 B) a7 |* luchar currentT=0;                                                  //当前读取的温度整数部分
8 h/ J2 I. H3 S+ ouchar temp_value[]={0x00,0x00};                          //从DS18B20读取的温度值
$ q0 A8 M; z$ N/ O' |9 \1 I0 [//初始化DS18B20
, F1 g2 ^$ f0 f* fuchar init_DS18B20()) ]& }1 E$ L2 I/ e8 }5 e
{
: f# x8 }' U& [        uchar status;) G+ {3 @, y; `1 n5 \( y: l4 v
        DQ=1; delay(8);
7 g. F" A" R$ L7 Q1 i0 d+ M6 E% n2 J        DQ=0; delay(90);# d9 e' w. H7 v
        DQ=1; delay(8);. b4 c  s7 R/ X- f* J/ u
        status=DQ;! T: k+ I& N' s$ M; z: c+ g+ I9 L
        delay(100);' k$ M- |' r3 i, |( |
        DQ=1;
+ G' U3 G  P/ u" M. n        return status;          //初始化成功时返回0; G. Q) ~: h3 x5 \
}* e- p9 a3 U( h* m

7 @. |+ M# p+ t% L3 ?" F+ R
* Q; t2 P# i" ]' m' J$ n( v. c3 ~. I
//读一字节" R! U  z: w( S  \% _
uchar readonebyte()
7 p0 Y$ P: Z3 S{
7 p. @2 B6 J0 |' S1 F" V0 w; S9 W        uchar i,dat=0;
7 k' V5 v% |. M9 Y+ G        DQ=1; _nop_();
6 D5 m& N( @  m# a/ x        for(i=0;i<8;i++)/ G9 p0 q4 d0 S% h
        {' j2 K7 T0 q- o! i
           DQ=0;dat>>=1;# i3 S' Z+ r+ M4 N$ L. j
           DQ=1;_nop_();_nop_();//拉高,延时进行采样 单总线是进行与的
+ `3 ^, J+ c) Y, J9 U8 `" I' B           if(DQ) dat|=0x80;  //如果DQ是1,把1存到dat里
0 ?  ]. O* V4 v           delay(30);DQ=1;/ r4 U; g" Y( U/ \1 }
        }! v. T' `  S& ~2 n+ J
        return dat;( R1 S% W9 r/ t, \% V5 e" m- ?
}+ W. H: L: v3 K' C9 n! G: h/ ]& k

9 m. `1 V. Q( e  [5 ]
" n! D+ G/ {0 B( s3 ~% |
//写一字节
8 l; S# y, A& o/ D2 J* h+ f1 Mvoid writeonebyte(uchar dat): |! t, Z- s. [; R4 |7 k8 s4 K
{
' q+ n& K2 p6 E- D3 \* d/ F' F        uchar i;8 E& {8 |8 y; X7 H% `4 @
        for(i=0;i<8;i++)' T- z' _$ m3 k9 L4 v9 b
        {
" P; z. S) B2 @$ y# b                DQ=0;DQ=dat&0x01; //先取最低位,先读的也是最低位
' Y  Z# i; ?& q% \                delay(5);DQ=1;dat>>=1;
( t1 I- X7 _+ L& x2 W' F        }
4 R+ @; r* {% A( i* p; G! x}+ ~# d9 ^. n' K' `. A8 |2 X
, y6 k' P) I$ t
3 ?& ^& U) x8 M
//读取温度值
" X" E+ c; F! n7 @4 h" hvoid read_temp()
& D; p1 x4 Q$ Y6 q{% d, t) O& j" D" A& V
        if(init_DS18B20()==1)        //DS18B20故障
8 b1 ^+ P& X1 B; e                DS18B20_IS_OK=0;2 N& m- `9 @% \+ Y- b6 W
        else# u0 r/ g+ \  _8 Z2 M7 J; q  o- F
        {# q7 B% c; i6 U2 \) Q2 W/ T
                writeonebyte(0xcc);          //跳过序列号' ^; G& A$ G" T* O" l
                writeonebyte(0x44);          //启动温度转换
2 u1 g2 ]1 s9 e5 k5 I+ a                init_DS18B20();
$ [8 s3 F9 }2 E                writeonebyte(0xcc);          //跳过序列号3 F  H) ]2 _- a
                writeonebyte(0xbe);          //读取温度寄存器
7 S& c8 {, {% n3 t6 J2 l5 @- q! g                temp_value[0]=readonebyte(); //        温度低8位
! ^- N* \; `% R( b: K! I                temp_value[1]=readonebyte(); //        温度高8位
/ V' o* \' m3 P# e' \                Alarm_temp_HL[2]=readonebyte(); //报警温度TH" A" A; r- E. h6 T6 ?
                Alarm_temp_HL[3]=readonebyte(); //报警温度TL
8 ?& @. N7 L! P                DS18B20_IS_OK=1;% ^  `& s5 k; q% h
        }        9 p) K* M' B; A0 k( W4 m% p; p
}
& O& I2 y* P0 m& _) L7 r6 J
9 w2 K( q7 j- ?2 |0 A  X, ~

2 L0 R+ p6 `$ n- R8 V//设置DS18B20温度报警值; I4 z$ q6 a- G* v/ o
void set_Alarm_temp()
; {! h$ T/ M- m. d& S0 O{
& d4 o: A% N1 {% v" d9 \        init_DS18B20();% r9 y% g& y! @* ^: L, r) H
        writeonebyte(0xcc);          //跳过序列号
- g0 ]6 H( _5 ~1 p        writeonebyte(0x4e);          //将设定的温度报警值写入DS18B20
, S- ^7 c9 U( x, j- J& H7 V5 u1 ^        writeonebyte(Alarm_temp_HL[0]);  //写TH: U  t0 A; a: b6 V/ X
    writeonebyte(Alarm_temp_HL[1]);  //写TL
# C8 k; v3 X0 w5 ^( \  T    writeonebyte(0x7f);                                //12位精度
! a) V' C, T# `) \        init_DS18B20();6 E' l9 L5 c! _. w9 G! u) r0 K/ }
        writeonebyte(0xcc);          //跳过序列号
/ Y* t, Z/ E6 ?9 v        writeonebyte(0x48);          //温度报警值存入DS18B20& E! n  V# w) O8 [- q0 v1 ?
}+ w5 h$ E+ I9 Q( U5 f6 c2 [3 B
0 i" U+ n. h+ ]; s& @. y0 I
  L3 M! V3 K' D% |+ |7 {
//在液晶上显示温度处理
( g9 q' g! v; e- j1 ~void chuli_temp(). |) T8 L$ ]4 y+ B  w0 c  A
{
& @- q/ l+ a3 F' H2 X% Z$ B/ M//------------------显示温度处理-------------------------
& u& |- z3 L1 s( [% B  k5 y        uchar ng=0;           //负数标识" Z0 t- o, Z4 G7 z, d% f' h& H* Z
        uchar t=150;                 //延时值
2 w8 |6 b; P0 y  v! J        char signed_current_temp;                //注意类型为char
  k9 K" z# N6 I5 O5 e        //如果为负数则取反加1,并设置负号标识及负号显示位置
2 K0 I- x2 U# |        if((temp_value[1]&0xf8)==0xf8)
8 Y5 c, R6 ^+ k8 G: @2 E        {
# S+ \4 E, s  w8 U$ _, ~  Y                temp_value[1]=~temp_value[1];
7 z! C9 Y0 c" l                temp_value[0]=~temp_value[0]+1;  a# g* r8 L& o0 G( Y
                if(temp_value[0]==0x00) temp_value[1]++;
# @( }! Z! n  F                ng=1;* d% K  A' C9 N/ ~. s
        
* r- ^! b6 |. b5 c) b5 e/ b" d        }
, }% F8 z6 t9 j' \: y3 K3 @+ I( h  //查表得到温度小数部分0 K0 f# P! {0 s: O. [9 E' A5 V
  display_digit[0]=df_table[temp_value[0]&0x0f];2 E" S) P* D. ?2 _* n1 o8 \, N2 j
  //获取温度整数部分(无符号)4 T% F/ y# h# a
  currentT=((temp_value[0]&0xf0)>>4)|((temp_value[1]&0x07)<<4);* d+ [. W! n; S+ P# ]1 k- d1 Q- a. b
  //有符号的当前温度值,注意定义为char,其值可为-128~+1272 |# _4 U4 m( a$ X( m$ Q; Y# h) I
  signed_current_temp=ng?-currentT:currentT;
' W5 i, i/ K$ ^" ?; T  //高低温报警标志设置(与定义为char类型的Alarm_temp_HL比较,这样可区分正负比较)
! d8 T/ F: n! D0 [2 n' ~  HI_Alarm=signed_current_temp>=Alarm_temp_HL[2]? 1 : 0;+ G9 E; T) s4 q0 x: W
  LO_Alarm=signed_current_temp<=Alarm_temp_HL[3]? 1 : 0;
! b. X$ o2 K& f" Q1 B1 j- Z  //将整数部分分解为三位待显示数字2 B7 `3 N& R/ j* p0 Z! c$ D
  display_digit[3]=currentT/100;
4 P+ w9 l$ {6 b. t' P  T! N  display_digit[2]=currentT%100/10;
- [; Q& J6 O' `  display_digit[1]=currentT%10;' }$ W  f6 n- I" ]& X# g; ]. E
  //LCD显示数据2 n3 l7 G0 _+ S/ m
  LCD_display[2]=display_digit[3]+'0';          //bai+ ?" K0 f/ i! F( B' }, Q4 N
  LCD_display[3]=display_digit[2]+'0';          //shi
4 U4 l5 y* q2 k) l$ v  LCD_display[4]=display_digit[1]+'0';          //ge7 y" X! g7 n% k4 L, H+ m' z
  LCD_display[5]='.';* x8 O& A/ T/ X! h1 @
  LCD_display[6]=display_digit[0]+'0';          //xiaoshu
2 _7 j3 `& Z7 q1 b) n  LCD_display[7]=0xdf;                                 //。5 H! h: r9 x" R7 h
  LCD_display[8]=0x43;                                 // C
% g( L8 Q& k$ p- N& g& x) s4 U. X& t. C
4 D6 f+ ]! I/ }- @
  if(display_digit[3]==0)                           
9 T* ~' y/ Z1 h3 X5 P, z/ X          {
- L! b; K2 V0 a; T; }& E: ^                    LCD_display[2]=' ';                        //高位为0则不显示               
/ H* \9 d( k6 y1 {                  if(display_digit[2]==0)/ @6 j1 y/ l! @% F9 ]6 D& L
                  {
# u" `# b( ^& {( ?5 V) H/ h                          LCD_display[3]=' ';
1 G( r4 Y* W" \- B0 v% N  f1 ]                  }
/ {. Y7 S. Q8 @6 }          }( d0 n; [3 ~/ ~' O- x5 g1 ~( u# J
        //负号显示在恰当位置
! l# C4 K0 }, N4 V' j) E        if(ng)3 x. V+ J! _  y3 ^8 V
                  {0 w+ _9 j: C$ m' z8 G2 P
                          if(LCD_display[3]==' ')
0 D' l1 U* o' l6 N( }$ O9 a                                LCD_display[3]='-';
% t( o8 }3 t# d& z8 ?. w, a% q                        else if(LCD_display[2]==' ')
( E4 Y# X) ?; u7 }' {& w                                LCD_display[2]='-';
3 V8 b. k2 _. b* ?                        else LCD_display[1]='-';
0 T# ^1 s+ A; v                  }4 |1 A- S4 J3 [7 n  A
//------------------------------------------------------0 @2 I( x) d2 h- R

0 {6 K- u* D) i

4 \8 P7 N: e$ ^- J) w}
# _0 W6 k* }# y4 k
/ S( O# A4 y( Y1 ?/ g8 `
& D, K0 ^; v, [! T0 ~# Q/ _) {
void chuli_alarm_temp()9 y5 W/ O! c+ o  Y2 q$ K- `# G
{
( S( ?+ y1 n& U( j+ h//---------------------报警温度处理---------------------. v/ ^6 {  P7 S  W
   uchar ng;
; ^0 Q: x: c9 |& K   //由于Alarm_temp_HL类型为char 故可以直接进行正负比较
) p1 a& v" }3 K   //高温报警值
8 r* [+ U: @: Z9 G5 ~4 l   ng=0;
/ k7 a# @% s( L+ F$ ~* L   if(Alarm_temp_HL[2]<0): @( C! I$ u  q4 u- n" }
   {4 P3 b: f; J  ]% i9 @7 b
              Alarm_temp_HL[2]=~Alarm_temp_HL[2]+1;" I2 \7 o. ]- O" G# [
           ng=1;
, X( v* W  `; d- c6 n   }0 D3 P9 [7 y  |# t6 X( C& ?% f, |+ P# ]
   //分解高温各数位到待显示数组中3 \% D& b5 a. n& u3 A, `* }- M
   LCD_alarm_display[3]=Alarm_temp_HL[2]/100+'0';
9 z$ V! i6 N! f7 U" `5 X1 k   LCD_alarm_display[4]=Alarm_temp_HL[2]%100/10+'0';/ W& D$ s1 I3 w0 g9 H* e3 y
   LCD_alarm_display[5]=Alarm_temp_HL[2]%10+'0';
' e; ]6 b) {* b# d5 Z8 o   //屏蔽高位不为0的
, V9 r: {$ B' {" E   if(LCD_alarm_display[3]=='0') LCD_alarm_display[3]=' ';% v& x0 y/ |. |/ w) d" e
   if(LCD_alarm_display[3]==' ' && LCD_alarm_display[4]=='0')
6 s  s* H! \6 m4 L/ b0 T       LCD_alarm_display[4]=' ';
& H/ l9 R5 J) m1 T        //'-' 显示
; n, F9 q" o0 a/ y   if(ng)) @" m  F1 i% Z5 y, Z
   {, h# i; d" v9 m8 l
                   if(LCD_alarm_display[4]==' ') LCD_alarm_display[4]='-';
' O- V9 X% b5 L- U, A                else
0 U9 h4 Y; x/ f                if(LCD_alarm_display[3]==' ') LCD_alarm_display[3]='-';
% Q/ U3 @/ ?7 |8 c; _% U                else LCD_alarm_display[2]='-';
/ T$ l! N# p: E3 v$ O   }7 G7 Z5 ~7 x) K6 A% F8 x1 f: {
   //低温报警值
( y9 Z: n8 {) Q$ _+ [2 j   
$ W; w" ?. W9 u0 D" \. w   
: d8 u5 b  {7 V* [8 Q2 k3 ~2 v% k9 }0 J/ E& l

2 s& u' ]. E# x: p…………限于本文篇幅 余下代码请下载附件…………
7 _! o: k) _& a: n5 a- c1 B  W, A+ g9 Z( f. C0 p- B
完整代码下载:
& c% j) p& o- z' J9 n
游客,如果您要查看本帖隐藏内容请回复

( e7 A# }; W/ v0 F7 K
/ E3 y5 G8 }$ n# c5 P2 ?0 o4 h4 e

该用户从未签到

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

该用户从未签到

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

“来自电巢APP”

该用户从未签到

5#
发表于 2020-11-20 17:43 | 只看该作者
感谢分享,写得真棒,很详细!% G% n; K8 o) t
6 O" l$ m+ {/ J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 04:51 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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