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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 ; O% E: x& c+ \& s5 R3 k
# o0 V/ }* c& f8 Z/ r1 h. o
基于18B20的温度报警系统(可调节温度上下限,超温报警)..9 W3 k6 p- G: b
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
) g$ B) z+ r6 k, a5 \( w; q6 |
) J' \( s+ \& w- u' M) E
) R1 i  |3 H" }7 v" x9 o+ V; a# ]
单片机源程序如下:
' h, Z' U) @8 M8 @. t- T8 ]5 f8 d" T* ]

- R" s' n2 k9 a#include "reg52.h"
; k/ ^) L7 G5 ?# g% _" V( z2 ~+ H) ^3 a) i. `- Q
#define uchar unsigned char
# j1 o4 j9 }- k; L, V- A* U! S#define uint unsigned int0 y# ^- B! T: s/ e
#define ulong unsigned long" N; ~) M8 o# t  J9 q5 b, B( R1 b

* k9 ]) a% t& X3 @; r; C1 j0 m//sbit Buzz = P3^2;1 c3 C( g$ u  D& t; c6 K' e
sbit Buzz = P1^5;1 B# Q. r3 [; s7 ]
+ n0 v+ V- r7 t4 j$ J' H- J) V
/*******************************************lcd1602.c函数声明************************************************/
. J$ `% Q# b# q. Eextern void InitLcd1602();                                          //lcd1602初始化函数8 H: X+ |3 y2 w5 e
extern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限2 V- L: l1 m- x( o; a' r; x
extern void InitMaxMin();                                         //进入温度报警值设置界面
. h, z- @3 |7 n7 jextern void Display_user(uchar x);                               //显示用户自定义的字符“↑”. I3 ]* q1 G8 G7 k
extern void LcdShowStr(uchar x,uchar y,uchar *str);
8 Y& N) a+ c' K3 |extern void LcdShowDat(uchar x,uchar y,uchar num);
& v5 Z+ Z' K( ^' i3 V9 Kextern void Display_laba();
9 I' f0 h9 r, x/*******************************************key.c函数声明****************************************************/0 Z7 r. b" W# F# V1 Z
extern void KeyDrive();# u8 V7 b6 M3 m- [& C
extern void KeyScan();
" D: }$ N0 P. e# `* `/****************************************ds18b20.c函数声明***************************************************/
' T7 \& ]- j, t. uextern bit        RESET_DS18B20(void);
7 j9 k0 i/ T# `4 uextern uint Read_DS18B20_TEMP(void);
" k0 ?3 }( l2 F" h$ n/*****************************************main.c子函数声明***************************************************// q% C) X! C/ U1 j' X3 N9 w
void Timer1Init(uint ms);                                    //定时器1初始化函数+ u! d0 s  ]" v1 a
void SetLimit();                                            //设置报警值函数
* {0 }- ^8 U: g! R- }void ControlBuzz();                                        //蜂鸣器控制函数
. X" K. K$ R- O4 _% nvoid delay(uint z);
! Y1 M( {$ J6 i' v8 C/**********************************************变量定义******************************************************/
' b) c+ N2 Y8 b0 j. m. pextern uchar code buff[];
; {$ w  l) E7 V; {% x& f9 ?4 e0 Muchar T1RH=1;                                           //定时器初值
; r0 e5 ^& j" u. N& b8 Iuchar T1RL=1;                                              1 ?* e4 b. }3 m' K, J  Z+ H
bit flagBuzz=0;                                       //蜂鸣器开关标志
  Q4 ^4 C& }8 g- g0 t; F6 X. w9 g+ Kbit EBuzz=0;                                         //蜂鸣器使能标志2 h0 I- Z1 B9 m6 ?, K! P" _
char High=20;                                       //温度上限  超过限度蜂鸣器开5 S# Z" L) u( v, L, j' s. x
char Low=10;                                       //温度下限
3 k) M/ t# E! ^) u4 Cuchar mode=0;                                     //模式变量! f+ O( ?! j" ]# m3 J, r
uchar cnt=0;                                     //ESC按键 变量( g+ i7 l0 O& U" D/ h: o+ v1 ?
uchar tflag;                                    //温度正负标志位
' Z  d! y% t, Z, ?/ M/*************************************主函数***************************************/
  j5 Z) D$ V; \3 W* Q# w& E3 v$ \void main()
3 I) t" _- D) |1 J6 |: }{
; Q$ V8 D1 A# P* y$ Y4 Y        EA=1;                                            //开启总中断
' z+ {; h8 u8 c/ a        Timer1Init(1);                                   //初始化定时器1
, s+ ~" {% v0 R        RESET_DS18B20();                                 //复位18B20
1 G' N& Z1 |- x. {        delay(20);  c  M& R+ V- i' ]5 r
  InitLcd1602();                                   //初始化lcd1602
+ S, K2 k: V1 N; n& E  g" l9 q% K        while(1)
& X# j8 \7 B; u        {
, c* _$ A; Z# h4 ~3 H                LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位
6 L2 W% g; b1 |4 x/ ~                LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位- p: f& \0 u& }5 _
                LcdShowStr(12,1,".");                                     //显示小数点& h- C  v2 J: m" W# I
                LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位$ Z" l- ?0 f4 v; a* e" k$ d8 ]  @
                KeyDrive();                                    //按键驱动9 \  B; t- X* q! M
                SetLimit();                                    //设置报警值' N, O, A% Y% e& i; k$ ]7 q( C- ]
        }
% P5 j, _1 ~* b9 T}: \: r. L5 C3 g% U" c

, P# B; @  s9 r. d% ~8 @' t/**********************************按键动作函数************************************/
8 T' |, Z8 m  ]4 V+ _void KeyDown(uchar keycode), P1 ~; l# I7 a4 z
{
5 ^" J9 Y- Y" o5 c. P' l1 p        if(keycode==0x0D)                                        //回车键:进入模式设置' Z$ A3 G( n; Q6 ]$ x
        {% o. w! g& {3 j; A8 b$ P
                mode++;
. ]* [# o* k4 P& r6 i* P3 ^                if(mode>2)mode=0;
, Y/ K1 Z+ s8 i+ U+ J8 M( w4 Z        }
) D8 G  M' y7 S$ V3 r. f        else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+1& f8 C0 H( z& p
        {$ ]/ H9 D: l/ s% u! L1 W  w
                if(mode==1); x  g% K2 J% K' H. _
                {0 J: o: h) @" f7 G# \( W" v
                        High++;
  e$ o0 H9 `# @! X4 }                        if(High>99)High=99;
- F* U: g/ U1 ^7 o                }
1 ]8 D0 }2 t2 V                else if(mode==2)( g+ v4 K# y. W
                {
8 ]( E: f4 J4 J. M7 w3 o  ~! p                        Low++;
# S$ q2 |4 y5 u, s+ _: O                        if(Low==High)Low=High-1;9 R9 Q, U/ y2 l7 Y# U7 d4 J
                }
. J3 m+ m) k8 y6 y. x" j        }0 e$ d& Q& A. h- B$ g! k2 {2 c( j5 G
        else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-1
, m; D- C% V! J, p- _        {1 J$ B! {# \2 l
                if(mode==1), T! A' L. G. ~2 \) ~7 }" q) b/ w
                {
% k/ r8 o, N0 r- ]' L( Y: u7 {                        High--;& O- k) c8 v: ^% d/ o
                        if(High==Low)High=Low+1;
% ^4 k; L2 R4 \: B  j, N                }
/ n% }/ s9 s- U/ I: p$ I1 t                else if(mode==2)* {: m' p9 Z' A+ l2 T/ P& Y0 n
                {5 X! E6 H8 Z& W; e4 u8 c
                        Low--;
) O2 k: H; @2 L' u1 {4 p& {                        if(Low<0)Low=0;
! F) u. p( ]5 h4 L& U                }
! O1 U9 t; E2 U        }
; c, P1 h+ L2 Z6 z; p& i# [5 N0 n        else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警
- T4 E* I# r0 n' O        {: Y) E" f/ t- R  p9 Z7 n
                if(mode==0)
* `0 S$ d$ n. [( s5 ?                {7 ^5 V. r: {# H& H
                        cnt++;: P# n7 y/ N' v, Q, d3 B
                  if(cnt>1)cnt=0;: x3 _3 q* v! a  u* P
                  if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像1 Z* \/ N; o6 f) \. G  |. w
                  {
4 f; ^+ j9 H7 ~5 `/ f$ z. B                           EBuzz=1;) i6 e* ~/ D  q' x
                                 Display_laba();! U- m/ |, Z( k6 c2 d6 `& w
                  }
( Y( ]# i. i% @; t                  else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭  m* r) h1 E0 u3 _
                  {
( Y% h" J' ^. d6 w. k                           EBuzz=0;
7 ~/ Z- x6 }  X) i                                LcdShowStr(7,0,"  ");' P/ v7 ^! e. c- C
                  }' t7 }$ T4 F3 Y; _: G+ u. {
          }% C+ F. j( D- k
  }
, ]# j7 h/ t0 u0 U}
0 t3 Q: l4 r2 w$ L! a- k
9 L) d* h' V. u; M/ E6 V1 ^( w/************************************报警值设置函数*********************************/% Z8 t6 ?' z- B8 m5 n
void SetLimit()6 a, M, D  G4 f$ _
{
( [2 @* Z# B* v" L                if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数
$ q- J+ t/ G" Y$ O                {
( L4 E. D( F- M# h& l1 U                        ControlBuzz();3 \  _3 i* G8 w* K+ E) O% T
                }
) m4 V% N% G" |$ C) ^! b: P, y4 t/ ~" J# Y1 p3 n6 `0 ~% ]/ T
                if(mode!=0)                                              //模式1 调整温度上限
4 \4 ~; V9 o) H$ P5 i& _# ~, h                {                                                        //模式2 调整温度下限
5 q  A/ U5 i, w# a# |                        EBuzz=0;* ]$ a$ K( u6 B; v8 i& I
                        InitMaxMin();
& J3 M" U6 l, n5 v% l2 y                        while(mode!=0), o" D9 ~: ]8 t, i+ D' _
                        {
1 U: {: v( \4 v) E* U1 E                                KeyDrive();8 ^6 \9 q0 S! v$ f+ J! F9 H
                                if(mode==1)
$ a. o0 e) ~4 O  `# s                                {0 V/ K  B& ?% ^/ y) Y
                                        Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限/ p- ^' ~" W5 B1 s- d* o! h
                                        DisplayLimit(2,0,High);                            //显示 温度报警值上下限; j9 g% \4 p* ^7 Y8 W+ P: ?2 N$ R
                DisplayLimit(12,0,Low);  n+ P+ |3 X( V" r8 q! N+ O
                                }
& c$ j2 P3 E& w                                else if(mode==2)/ N5 |. a/ P4 ?/ H- y
                                {
  r# ^( N; ~: u8 i) w                                        Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限( u" G) H% W8 f7 S, J2 I
                                        LcdShowStr(3,1," ");
  R: q. r6 ^: S/ V2 d8 ?* j: T  s                                        DisplayLimit(2,0,High);; ]- w4 ]3 ^. I
                DisplayLimit(12,0,Low);- {3 [( p" @" o: D
                                }. ^/ D* Q/ s" [8 k
                        }+ u  u! i0 D8 e( G- M4 }
                        InitLcd1602();) A) \9 i& J! R: a( O  [+ ~% i, b/ S6 n
                }
+ @! n0 ~: p; G6 \0 u9 H* C}' p1 S* K1 a% D! e+ y7 @
6 O2 D6 [" ]+ m, |
/************************************蜂鸣器控制函数************************************/
# n' L! O; M' K, vvoid ControlBuzz()
7 b% i* K. M, c& _{
& Y6 C! s' {) @; x! U        if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))5 `( W; ]. c7 N. t. K
                flagBuzz=1;; ~) @$ l; f$ J! b: y9 r6 G
        else
. H2 O6 \7 N, I, r- L0 q                flagBuzz=0;. B6 l2 {7 g, f* S6 U
        if((flagBuzz==1)&&(EBuzz==1))3 N' c. C. z+ Q% y
        {
8 f) E' q% S7 Y" l  M                Buzz=~Buzz;
7 g% `# U4 t$ |$ X        }
, L+ _% f* E8 M9 \, j}4 T7 @# S* t% d9 A; `1 f! S

' M. h# G! T9 h0 {' {0 E( ]$ {# {' P3 ^void delay(uint z)
3 j3 _8 J& x6 @{
, [3 }6 H* `$ Z) S7 z( j& z+ J        uint x,y;0 z! `6 h7 J9 u6 r" P3 `7 A
        for(x=z;x>0;x--)               
5 i+ }2 Q2 K3 F* }  o                for(y=115;y>0;y--);% Z0 I6 |8 [8 P) r
}
! `/ o/ q# |& d/ G
: L: C0 j2 t6 c# n! k. U/**********定时器1初始化函数***********/& N# ], E# `& {( F
void Timer1Init(uint ms): o/ ]& _# l7 g' o
{
$ f  ]' Z" j4 m; q7 R        ulong tmp;                                               //16位长整型变量tmp: \4 B8 F  d% _+ c! M7 Z' U) x
……………………9 q7 [8 }) l. [' X' V
* @' f  j5 ?0 N; n% T8 [% Y! K7 B
…………限于本文篇幅 余下代码请从eda365.com下载附件…………1 S" g: m& M4 m
! a, _% S3 A. [3 [/ c
游客,如果您要查看本帖隐藏内容请回复
% h  v2 W3 r, Q8 m; G* x. n* K

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 21:50 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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