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

 基于18B20的温度报警系统(可调节温度上下限,超温报警)..

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑
- `# I+ y! z# r9 b
. J2 s7 _# \0 ] 基于18B20的温度报警系统(可调节温度上下限,超温报警)..- R+ ?5 T# ?$ ?9 B7 P" `
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
, U/ T2 B5 M/ z* ~
: _* q9 V$ V( R/ F* v

8 ?& L8 V/ a6 U单片机源程序如下:5 A  o" Z: \) K6 Y' P

+ a# y' s$ y3 F
5 G5 I9 e# ^9 ?4 E/ ~, W
#include "reg52.h"
4 E- J* S  }( W1 L, w1 m
# n4 ~$ A0 c0 Y! o8 m#define uchar unsigned char
; A0 w" n* \+ H9 o7 r, |#define uint unsigned int
7 L; A+ {+ [7 z+ o: }#define ulong unsigned long
) Y' D2 {$ m- H8 b2 J* x" L4 x1 W' C6 _( P0 ?' a
//sbit Buzz = P3^2;
% z4 P" T: b7 `# ~  @sbit Buzz = P1^5;' f0 b+ X7 _' a; `6 s( S2 P

. J, x, ?: A" j$ U- h, A/*******************************************lcd1602.c函数声明************************************************/
# Q7 V) i5 d& g4 T- mextern void InitLcd1602();                                          //lcd1602初始化函数/ {; H* v" O& E$ b! W
extern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限
6 n; J: K; ]" f, q( m# w4 Gextern void InitMaxMin();                                         //进入温度报警值设置界面
- A4 Y( ]; D; jextern void Display_user(uchar x);                               //显示用户自定义的字符“↑”
0 d# k: @  ^7 p2 j0 yextern void LcdShowStr(uchar x,uchar y,uchar *str);" W7 [% i% h5 V9 V, {0 n
extern void LcdShowDat(uchar x,uchar y,uchar num);, ?/ i  C. c6 U: ~& X" m
extern void Display_laba();/ r3 L! P( h8 Z; r  D
/*******************************************key.c函数声明****************************************************/
" N! U6 W& z  F1 ?6 k* a" }extern void KeyDrive();
% F& g+ n6 j( U% p  Z& T' E$ ?extern void KeyScan();
( j9 I- x, ~& Q! s/****************************************ds18b20.c函数声明***************************************************/1 ^7 e' x0 h/ R
extern bit        RESET_DS18B20(void);
' y, P8 c8 T2 m& cextern uint Read_DS18B20_TEMP(void);
% u& g# d# v0 `/*****************************************main.c子函数声明***************************************************/
1 B, Y# b9 q/ U# w+ a/ L1 Fvoid Timer1Init(uint ms);                                    //定时器1初始化函数
; e0 \3 q: ]0 f! O! Ivoid SetLimit();                                            //设置报警值函数
" P! b8 m2 [0 N: I2 Vvoid ControlBuzz();                                        //蜂鸣器控制函数
3 ]. t8 V8 u; Yvoid delay(uint z);
  B2 U$ i8 U9 B- v# J/ m/**********************************************变量定义******************************************************/& k. e; O" {; w/ V, d, ?, [- a
extern uchar code buff[];
% Q% d0 E- S# D1 e2 j  Ruchar T1RH=1;                                           //定时器初值
7 _% m" @5 F7 c; i; t- puchar T1RL=1;                                              # G2 Q5 L+ F6 w5 Q1 h
bit flagBuzz=0;                                       //蜂鸣器开关标志
$ k, w2 Y5 j; H5 J3 B- Sbit EBuzz=0;                                         //蜂鸣器使能标志' f9 {/ k+ X" w/ f
char High=20;                                       //温度上限  超过限度蜂鸣器开
' t, s0 w& z  k1 @+ E. ]2 a, Achar Low=10;                                       //温度下限( ?- e, e1 I' C+ ]. L7 m) h
uchar mode=0;                                     //模式变量! z' m$ b0 @% _! a7 ^2 z% C
uchar cnt=0;                                     //ESC按键 变量
) J/ n* K# V) F* ~2 Ouchar tflag;                                    //温度正负标志位5 V7 J( N4 w1 m
/*************************************主函数***************************************/! f) m2 |! j' V2 A# Q' F* q1 Q
void main()
2 ]1 r+ x' g1 s' L1 z( `{
6 l! C2 Q9 Q' h$ @1 L        EA=1;                                            //开启总中断' [% k0 r/ y( P6 Q7 h
        Timer1Init(1);                                   //初始化定时器13 M& }" W  D0 L4 O6 _% }
        RESET_DS18B20();                                 //复位18B20
" ^# D+ V7 E* h, j# l        delay(20);
( G9 P! H6 M& Y- B8 ~3 ?  InitLcd1602();                                   //初始化lcd1602 / x. Z, M  D. v* Y/ f4 C) g9 \
        while(1)0 _  J# {+ T& i$ R( _
        {5 g8 `, J; m+ T. `3 C% u
                LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位
1 x1 N2 y$ Q* [# g                LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位# m8 L/ ~$ V  m  k$ L/ W
                LcdShowStr(12,1,".");                                     //显示小数点
; ~8 Z+ }/ h2 |  f                LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位
% z$ A9 S1 o: r5 P! }& g                KeyDrive();                                    //按键驱动
; k7 K9 j/ M! A# b2 a* X                SetLimit();                                    //设置报警值* R2 q$ v$ w- u/ ^* f1 Y0 C
        }* I4 d  k( X- g
}
! e* v  w2 h. u! T' n. {/ r  [3 u/ _' P( ~- s
/**********************************按键动作函数************************************/! j# w& o' P* o$ b; D5 y* |
void KeyDown(uchar keycode)" h) Z) W& y$ E" u' }; g
{. j' C7 E5 f- c2 S5 l* E$ t9 l( ?
        if(keycode==0x0D)                                        //回车键:进入模式设置0 ~7 e# {2 ^! K; j( U
        {
1 b$ _+ R" y  r3 C1 y                mode++;: {+ t4 e1 b! d' {0 r4 x& n" |
                if(mode>2)mode=0;- X: Y3 i& Y1 E+ h7 D) S$ O# ~
        }+ {1 q7 k, m; h$ w; [
        else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+1
1 t  g3 z2 A9 c0 a; A1 R2 h        {" m8 c  h3 z( `* A& v% \! G$ x2 b
                if(mode==1)
! Z- |( f6 j5 ?1 J( c                {) c+ ?1 b( k3 ]8 s' N4 C5 |
                        High++;1 q$ T( @. z5 I8 m
                        if(High>99)High=99;* {& ~& @& E2 q
                }! A& }$ h$ i. w4 v
                else if(mode==2)
2 a9 v7 u& [7 {# t$ }                {
: {( w/ Q- B, U7 b                        Low++;, x; g/ P, c3 \$ H
                        if(Low==High)Low=High-1;3 l$ Q6 X2 \0 Y+ q: @' X
                }- p; l7 f/ a7 ~9 e. R
        }0 S, S9 N/ R+ y5 J* Q$ p
        else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-1
- F8 K0 G+ Y1 h6 r0 e1 |        {+ g% Q( o) G3 [3 H9 Z4 J$ j1 C/ c, Q
                if(mode==1)
, ?( q9 e5 A+ p! S                {
% j* Z2 Z6 f, v9 I" H3 j) q$ O                        High--;  j$ {. U1 d& D7 k
                        if(High==Low)High=Low+1;
0 H( M4 e0 r. U8 _: s4 s                }
. l  u( Z: y/ ~0 F                else if(mode==2)
$ p6 G4 @" t7 b8 S2 Y, @+ @, V' N                {
, k! E) M5 N3 U. p; M, a5 X                        Low--;% d3 H% |- Q3 p4 \6 q
                        if(Low<0)Low=0;- n3 F3 E- C( R7 A( r
                }. |' O% L6 j- D8 B2 ^
        }
- W5 E% S- N% z  v: {        else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警* y7 ?0 d. P# L7 w5 |7 p* [6 p/ p
        {
/ A: y0 d  H; d) X+ v/ W7 }' n8 n                if(mode==0)
$ x7 W; J% X. |; C- Y3 B                {
% g! c( P. [8 _% G% R7 M' r                        cnt++;
9 k/ f/ o( L) y9 s' D* X                  if(cnt>1)cnt=0;+ D, w0 v+ Y/ F- {  P! L5 J+ ]/ n
                  if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像
2 z6 O2 N0 M6 M* |1 z9 v+ Y                  {
' W$ C; L  _* ^* h% s1 y3 y3 F" S                           EBuzz=1;4 X, Y* A0 B" A) P( e. e) g& ^
                                 Display_laba();5 y+ j7 p" p3 ^' D3 Q% w7 }
                  }
, W7 U! [& n" h' Q+ U                  else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭
# l6 k) _% Q" q- M                  {, p9 t9 O; u; O8 m- d* d- A6 b
                           EBuzz=0;
3 v& a( L  M3 q3 S9 h! h- o2 M                                LcdShowStr(7,0,"  ");5 x1 n- @6 l) `
                  }! W1 n# F! e6 @
          }3 N& Y+ x0 b, {9 {5 z  z
  }' P1 G2 I& T# Z2 q0 B3 F5 e, ^$ C
}
* Q) y; x8 S5 x3 |, n
1 n, c) I/ _7 D# b/************************************报警值设置函数*********************************/% m* _& s4 S- K5 e3 C" d" t: L
void SetLimit()
* J1 l. B6 r& u" w  g0 v$ o{6 x: O. Q% B+ P: _5 w' r! L
                if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数8 b: P8 {# ^' l" @: B3 ]& r
                {
/ J2 j0 q; e8 Y) U! B  L  D- C* ?                        ControlBuzz();
; C9 h* p/ m' P. K: W3 j! ]                }0 t% M! [6 O& o( j
+ @% E* ~8 x2 V/ o9 c7 R
                if(mode!=0)                                              //模式1 调整温度上限
) |8 ~) K, o+ o  @& h9 n" g                {                                                        //模式2 调整温度下限( ]; \" g+ X7 E3 r1 O: h
                        EBuzz=0;
* |. b+ B+ `9 P                        InitMaxMin();$ q. O0 p4 e5 O4 x' ~1 j
                        while(mode!=0): q% K8 u# t( b% L$ ^. X, d
                        {
6 ~. _3 ?& E% [3 E2 b* f& ?, a                                KeyDrive();
5 @; y* [, C/ ~! S                                if(mode==1)
0 ?- G' `( J* b9 g                                {
9 a6 \) M' H+ i$ P0 H/ y                                        Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限
! z  C6 F* G$ C, s* |! M/ ~                                        DisplayLimit(2,0,High);                            //显示 温度报警值上下限7 i+ I5 y, f* F# |
                DisplayLimit(12,0,Low);3 h$ u7 r4 i2 O5 b# k4 e
                                }
" C. U2 ]1 D1 |/ L! X; T$ B1 {6 {                                else if(mode==2). `- n: C/ s- l2 s+ t, L+ u- B
                                {
) l* ?; j: @+ U& e. S: A                                        Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限( F1 H$ Z9 @4 X2 M/ t9 G
                                        LcdShowStr(3,1," ");/ m8 ~4 l  |/ y- [+ O  v0 ]( X
                                        DisplayLimit(2,0,High);
8 Y( n/ A' S5 n; a* O/ A( `9 W7 N3 `                DisplayLimit(12,0,Low);) R- }' r* {/ \9 D: ?9 |
                                }
1 z" f# ?0 \0 ^% g+ }2 A! d# b                        }# j# N( u3 r5 l9 F
                        InitLcd1602();; M/ v: G- z6 A& G' J0 f5 c
                }
+ d/ i  @9 }& \6 F; a: u}
* d) e* d6 N' @2 e, E
% ^. A; u2 y4 B9 `$ r/************************************蜂鸣器控制函数************************************/# _2 A) [& M8 m) I6 L. I
void ControlBuzz()
: K3 C1 j1 `6 ~2 a$ G; D{" B9 i3 ^0 U) W
        if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))
2 S0 U* i% p, }/ L" |! A1 R/ E                flagBuzz=1;
4 V$ C' d# m2 D9 D3 \        else% ~. W, }, f$ D; `1 [
                flagBuzz=0;
" o( N9 ~% e% {7 T        if((flagBuzz==1)&&(EBuzz==1))
7 R& k5 I. u3 v% I        {
$ R, x+ M- _8 c& W" u                Buzz=~Buzz;% @( W# V3 O3 c' R
        }
4 t, f8 T' G  V& P}
' R3 R; H8 K9 k0 E1 V' D: J7 e% ?' `, |! f; L1 O
void delay(uint z)
9 p* y5 r! ]( E0 H{& Y) ]3 ^. V1 A5 p- P6 W. h7 a
        uint x,y;
1 \1 e- }' a# l& i. R        for(x=z;x>0;x--)               
$ D! R3 {; b- O3 C7 ?' Y                for(y=115;y>0;y--);
7 \5 Q: J6 J/ f9 W( ~' e9 `, Y}2 G" i; ?+ y& c: j% b* i7 f
( O# N: A4 b& `0 e9 Z& q
/**********定时器1初始化函数***********/( v* ^0 d: E( n8 J, Y
void Timer1Init(uint ms)
* P+ F* j+ F7 v1 G$ P{" j! L9 F1 g) t* f* [/ u& v& o
        ulong tmp;                                               //16位长整型变量tmp
' x8 ?4 ]1 a. ~: ]& C% F……………………
* ?6 I3 Q/ b* H9 r' j; M' e+ F; E* w8 H! D6 x
…………限于本文篇幅 余下代码请从eda365.com下载附件…………
- Q# H! F( d8 o* B5 v& b( @1 `) e- Q' p* C
游客,如果您要查看本帖隐藏内容请回复

# K$ j! Y( N  W

该用户从未签到

2#
发表于 2019-1-10 17:19 | 只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-28 09:51 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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