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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 - ]( R, m& Y: M2 u
( T( H' |% Q) G5 R0 k2 f
基于18B20的温度报警系统(可调节温度上下限,超温报警)... d! ?4 P8 K2 u' x- I
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
( i* z+ }* H0 o
. \9 G, x' r1 O% \6 k

9 H9 y# ^9 w5 x1 p9 D2 V1 \单片机源程序如下:
6 o/ s' l) N& }. }) l) }, U8 i' n0 V7 h# l, X

  s! H8 T0 z9 A3 S6 L#include "reg52.h"
$ y2 {" `: c4 H# _7 |! G
8 ~) `* K6 @+ D, j- N8 E7 y#define uchar unsigned char
3 A# p3 h. [& W#define uint unsigned int( B. N6 N) @9 G. Z4 G
#define ulong unsigned long
! \. F1 B! ^+ ?! R* m  H1 j2 n+ ^$ Y( C7 m8 e5 @
//sbit Buzz = P3^2;+ c( s! z5 _0 f7 L6 U) ~+ [. W, |
sbit Buzz = P1^5;5 X- i+ ^2 ]" G& j0 d% d
- B' o! q1 I6 I5 f
/*******************************************lcd1602.c函数声明************************************************/! R4 W3 s" g# F9 v6 k1 i
extern void InitLcd1602();                                          //lcd1602初始化函数8 C% D& l! M- Y% O) @: b
extern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限3 l! o0 n( e3 I- D7 t6 a: Q
extern void InitMaxMin();                                         //进入温度报警值设置界面% o6 }  `. S+ S" o5 G
extern void Display_user(uchar x);                               //显示用户自定义的字符“↑”
& C- I4 x( X# i6 e; _extern void LcdShowStr(uchar x,uchar y,uchar *str);
3 `4 i$ {" j) u+ Oextern void LcdShowDat(uchar x,uchar y,uchar num);
  }: j* g6 a( Kextern void Display_laba();! g  y6 I% r6 _. k7 W
/*******************************************key.c函数声明****************************************************/
) x1 D- Y- d/ Q; l7 w7 eextern void KeyDrive();4 j3 h( Q- B4 c
extern void KeyScan();
, i. M" l/ }, E. o( s: Y/****************************************ds18b20.c函数声明***************************************************/
9 c$ a1 x" T5 k$ O$ p: ~: `# N, }extern bit        RESET_DS18B20(void);3 m9 R  X5 T" ?+ I. f
extern uint Read_DS18B20_TEMP(void);
) A5 [8 l" R3 A- K" |/*****************************************main.c子函数声明***************************************************/
+ k: d3 A9 i  k1 hvoid Timer1Init(uint ms);                                    //定时器1初始化函数
, |' ]9 ]* O: A6 pvoid SetLimit();                                            //设置报警值函数
( B' P$ u# ~/ w: Lvoid ControlBuzz();                                        //蜂鸣器控制函数4 f; u( U. o$ a/ F- p2 O
void delay(uint z);7 F/ `; S! d4 n6 e/ b% C8 S1 `
/**********************************************变量定义******************************************************/, o) B7 }/ [( Y# p- T9 J/ Q: N9 F
extern uchar code buff[];$ ?( @/ y2 e, d; c; V5 u
uchar T1RH=1;                                           //定时器初值
8 Q2 X/ F0 W' s: o. Quchar T1RL=1;                                             
: n8 i4 ~7 _6 J8 Vbit flagBuzz=0;                                       //蜂鸣器开关标志
% T* l" H( [. M1 ^6 Ibit EBuzz=0;                                         //蜂鸣器使能标志
/ T0 [; I% @% i% s' Ochar High=20;                                       //温度上限  超过限度蜂鸣器开
7 G7 p+ f+ p- E- k! F" @/ kchar Low=10;                                       //温度下限9 T" M+ B6 ~# v. [, Q$ }
uchar mode=0;                                     //模式变量
1 }; Z5 K8 ~! J$ E1 Y5 Ouchar cnt=0;                                     //ESC按键 变量
  f9 l5 s5 B; ?; Tuchar tflag;                                    //温度正负标志位
) T. N$ e0 U$ q* w5 j  L/*************************************主函数***************************************/
9 K) f( h; T. k3 e6 Mvoid main()) [5 |3 ]! k/ {
{
/ b. M0 q/ `3 l' Y        EA=1;                                            //开启总中断
! D; b, U2 R- e, v3 c$ f  j7 l        Timer1Init(1);                                   //初始化定时器1
+ {/ S" b' G/ _6 F. V) O        RESET_DS18B20();                                 //复位18B20) b; }$ G' X4 h( k% h" E; x
        delay(20);0 p) c. @  s" |& T' w5 ~. }* f# f
  InitLcd1602();                                   //初始化lcd1602
6 M2 s3 p% e# }: v0 X        while(1)
; x( y6 Y3 h- a: P+ A1 ~/ W' W* W        {
2 q7 X6 q" n5 }                LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位) i  k& |) F0 {
                LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位
7 f5 r* u  T, x                LcdShowStr(12,1,".");                                     //显示小数点* E; e* w, V  b# ?/ x+ k- \4 J  l9 L
                LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位
; N" K/ S" B: R- J$ i$ P                KeyDrive();                                    //按键驱动: E! M* x+ N5 ]  V9 _
                SetLimit();                                    //设置报警值7 u# m2 W( F/ X# P/ D
        }
5 v$ N2 _' c0 S7 i; S}
" ~  w$ s, [' L& E8 W5 E0 g- A
% g. |" T' u0 T' c* J- h/**********************************按键动作函数************************************/
$ F2 x1 R; O' O3 ^( d$ c: P2 g, y; Avoid KeyDown(uchar keycode). v! X, n$ z! e
{
. A1 F6 Y5 K! m1 Z" o5 G& l        if(keycode==0x0D)                                        //回车键:进入模式设置
7 V+ |4 F+ e* W1 \" R        {5 q+ J* s( |' C, ~( ?0 P0 Q5 i
                mode++;0 N0 K* P3 O& [
                if(mode>2)mode=0;" t/ |1 P- B& h* ^( v
        }
3 h* [3 @4 T. G8 E+ L5 K        else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+16 E* o: S; Z8 \! J
        {
: k( q: E- b) v5 }) ?/ `$ O' o3 C                if(mode==1)
& I3 n1 T5 M. ?( V" h+ O  v                {& O/ V' I4 V- ?6 ]8 D$ U
                        High++;5 O8 g: b: @/ k
                        if(High>99)High=99;
2 B& y1 ^- w! g# o8 e; N$ p+ x; K                }
9 ~8 c# I; ^/ R" g- {2 [% u                else if(mode==2)
( m. _0 Q' N7 c' C; X% W                {
' k% K- x1 j$ F' |                        Low++;$ U1 a+ v$ j2 U8 L: g6 A- r2 D/ K
                        if(Low==High)Low=High-1;
5 M( s$ r, L# J                }6 O# G5 t( U  t& x: U# z
        }8 x: X$ ~; {) l0 d& g9 q
        else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-12 B+ ~  v" S* n" x& }7 ?& j
        {1 G# j2 S0 n  |3 k" T
                if(mode==1)
9 c# Z1 V1 G/ I7 z  g% B, N9 c                {
. ^! y" L$ X+ |/ |0 C) d                        High--;* v7 U: @. T( H8 v  N/ m4 Z; G
                        if(High==Low)High=Low+1;
$ t$ `1 E/ c% H' R! h% t1 X: ?                }
/ K7 C/ Q- ~- p                else if(mode==2); M2 y6 S, z3 o
                {9 O& m9 E6 O& f2 L
                        Low--;" r1 U+ j: f, {* t6 Z: v
                        if(Low<0)Low=0;/ J$ p- R7 k# E1 D6 f$ y: q* [
                }0 w/ ]4 v; z5 \- b2 ]
        }9 j) I7 ~1 z3 ~
        else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警! D% A( i. r" Y: C8 Q
        {
+ L: e5 p; ^' s0 ]! u                if(mode==0), _7 f8 _  ~# V6 L7 Z
                {/ X' \6 _! P& ~
                        cnt++;  f' Y. F9 c8 G
                  if(cnt>1)cnt=0;
4 M0 ]: }* C* d  B, D' q                  if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像
) K3 |1 o7 A7 n9 k6 f: b& F! M                  {
, s) \, j3 V% a                           EBuzz=1;$ `8 e2 ?! O, l, P, z4 k) E
                                 Display_laba();
: P& a* n3 c  h; \3 {. X7 Z1 g9 V) m" `                  }9 o5 }2 \; @- W& X& R5 E: Y
                  else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭( |/ g- ~2 W! t0 d1 G
                  {
# F; F0 Z9 k" s+ D, V9 `9 Q                           EBuzz=0;* X3 C7 g" I0 _$ e9 v7 n
                                LcdShowStr(7,0,"  ");/ z# i$ }1 K/ f
                  }
6 v$ d( Y; ^+ n+ s# V          }* e+ ?. f; V7 {1 a- A/ s
  }5 \- y! {- ~# `$ ~4 W6 m( a
}& y: V6 l' X6 T' `" b/ p5 O
! \+ d) u; R3 C6 l( I
/************************************报警值设置函数*********************************/
: C4 d4 O2 ^! t$ N! `4 g% _7 Q5 \void SetLimit(): k. i% b8 _/ p. ?5 r3 u
{( M% K& R8 c1 T8 N2 N' G- q' Z
                if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数' M/ a( }& v. C' j; b, N/ E2 j; L
                {
4 z) L/ C& u1 u                        ControlBuzz();7 s5 ]" O4 O' Q! U3 v" b# D2 c9 d
                }
2 U" {$ F/ {" [5 c, z/ ]6 X& y
. I6 i6 N7 {$ d; d3 x                if(mode!=0)                                              //模式1 调整温度上限 " p. I) V0 Z, F6 S* Z# X6 A
                {                                                        //模式2 调整温度下限
$ E; g' V6 }8 z9 M( K4 s- Z. @                        EBuzz=0;
9 v  Z9 y2 `# ?  A: Y- B' V3 M4 A) ^( C                        InitMaxMin();0 f8 e$ l" C" Y
                        while(mode!=0)6 R9 @# A, v' x" @2 i9 R
                        {; q/ s- r0 B8 J* l% _, o; V
                                KeyDrive();
3 t2 k. i" _8 o9 T3 {  B4 h                                if(mode==1), `% N" Q$ I* T
                                {
2 i7 H7 {: [6 X* f                                        Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限
1 k3 ^1 A/ ?) n9 j( b: x                                        DisplayLimit(2,0,High);                            //显示 温度报警值上下限
' |' [/ C; z  L! ~5 G" H+ ], M3 ?                DisplayLimit(12,0,Low);4 K5 {+ g2 A4 g) D
                                }
% |/ r4 n: ~. o                                else if(mode==2)
4 @8 D& e) ~2 Y1 I/ n7 p" V                                {
4 ?: T/ j: s' @) H                                        Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限4 Q( V2 K; f. ?
                                        LcdShowStr(3,1," ");4 ^" M9 G  D% _  u; B; c. o- U
                                        DisplayLimit(2,0,High);7 g& y3 F! `: f5 f- M- y
                DisplayLimit(12,0,Low);' S" c* n1 X5 e' g# O  M2 F
                                }2 ^* A/ M8 x0 y! ~* f5 C9 d/ k
                        }
, r% ~: ^9 _# U1 T                        InitLcd1602();
2 _- N5 v) p/ L6 K- x# I4 L                }
7 M4 a0 I9 ]. {}9 k) B- _; R7 X7 a, ~

7 S6 V7 F5 b# o! r! ~/************************************蜂鸣器控制函数************************************/2 C8 x/ G/ I8 L, i
void ControlBuzz()* Q2 M  ]' _& v3 K, i+ W4 I
{
: i& n8 j8 H6 H! Z1 r! f        if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))
. e6 v7 ^+ b; K9 a% ?/ f$ h                flagBuzz=1;, c4 t  w: k3 B" f1 h* {, _
        else, f2 {1 P: [( N+ o
                flagBuzz=0;
) t8 J( E1 q8 b; B7 N" R* b        if((flagBuzz==1)&&(EBuzz==1))& a/ U& \9 V# t5 s
        {( z/ m8 B. c3 ]5 h! h$ t
                Buzz=~Buzz;
/ R, e1 y- t# n# d& K        }7 c0 _( F+ C4 G! Y: a
}; q" i- u$ A( l7 @
( h9 P# x) `+ W& O+ V  ]
void delay(uint z), B2 ?% u  S% X# M5 u0 x2 D
{' L% M' c8 m" ]$ N& H$ F8 G) y- F
        uint x,y;
3 d$ x5 N$ C- O8 }        for(x=z;x>0;x--)               
0 O- b. J9 L8 E) D/ Z# T  u* m                for(y=115;y>0;y--);% U4 \( V2 G/ R8 v7 ]0 O
}
% J2 n( Q4 L" E' w! Q7 M3 b# _8 ?
) D2 C: y8 r5 ]/**********定时器1初始化函数***********/
& h+ O0 B- d! G' [9 C+ w! a  ^2 K- pvoid Timer1Init(uint ms)
; b8 M) Q! O9 `' Z$ r; {  _{
3 d+ y; x9 R0 Z) }5 h        ulong tmp;                                               //16位长整型变量tmp
. i) q' o5 D$ j; X5 V0 n……………………; ~# x5 M6 V6 ~8 Q* s

. T& P! X/ |) D4 O. g…………限于本文篇幅 余下代码请从eda365.com下载附件…………' T/ b6 x' x! `7 [% g

! B( L3 V) C- u5 t2 B3 X
游客,如果您要查看本帖隐藏内容请回复
& |% o/ |6 o+ Q% s1 v1 w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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