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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑
, J$ l) p( K- C' D/ [2 T5 h+ H8 L: u: Y+ t" i. q
基于18B20的温度报警系统(可调节温度上下限,超温报警)..- X* Y( r& Q, i
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
. b1 w8 J' h4 H' Y3 u! K' z2 Q5 ?. w1 x/ m

' A( M* }+ v4 P/ n7 Y( w# @单片机源程序如下:
$ e. ?7 y3 B0 X
8 O0 }! H- m% A. F3 g

- r1 v: Z& ~# U. U# j#include "reg52.h"
$ e6 b" o. V1 j$ G$ R! t2 U
. {" o9 x; Q1 x#define uchar unsigned char4 p) K9 Z! p4 t5 Y9 j  q0 l9 a/ P
#define uint unsigned int9 j0 K$ T! q- i7 s
#define ulong unsigned long" b& `0 [# v" m, B5 j: M
% Z( P# T- `& s8 c1 e' `) @2 K
//sbit Buzz = P3^2;5 e! H7 ]% Z' Q. F% z3 r
sbit Buzz = P1^5;* I# ?2 L) h$ d" W# C

9 F$ K7 U4 r8 C! z4 P6 H/*******************************************lcd1602.c函数声明************************************************/. `6 D% b/ U% N9 ^: I/ ~* U. q
extern void InitLcd1602();                                          //lcd1602初始化函数
5 |0 s0 N, {5 p$ p: qextern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限
+ _6 t" h4 w- _) r9 fextern void InitMaxMin();                                         //进入温度报警值设置界面6 w9 v5 ~' I1 S+ N& i  d
extern void Display_user(uchar x);                               //显示用户自定义的字符“↑”3 I/ J( ^* s* W" k- O* V( w; `
extern void LcdShowStr(uchar x,uchar y,uchar *str);
; w, d5 B! k9 wextern void LcdShowDat(uchar x,uchar y,uchar num);$ J& e9 }) O4 A) ?7 {0 W( i
extern void Display_laba();% i# \+ C0 `( {* {* R) W" A+ r& f
/*******************************************key.c函数声明****************************************************/( d. R5 g1 {" g& C" e5 a
extern void KeyDrive();& v6 u" r$ ~( [2 O9 |# ]0 b
extern void KeyScan();* [' A  w3 u" l6 Q
/****************************************ds18b20.c函数声明***************************************************/
" B, t( T% K# p9 ~, R; Oextern bit        RESET_DS18B20(void);* E+ Y6 N, t5 m3 B0 v7 g
extern uint Read_DS18B20_TEMP(void);6 p( p) m. L  N8 m& }
/*****************************************main.c子函数声明***************************************************/6 g0 y6 H/ y$ M- O) g" _/ ]3 K' {9 r
void Timer1Init(uint ms);                                    //定时器1初始化函数
4 @! K5 P5 `0 X& qvoid SetLimit();                                            //设置报警值函数
. k: ^& V% q* U: ]- h/ P7 evoid ControlBuzz();                                        //蜂鸣器控制函数4 i3 P5 k" `+ U( X$ I9 w. g) l+ ^* @
void delay(uint z);
6 b* A+ i) R4 m& [4 _8 T/**********************************************变量定义******************************************************/
8 Z! {: m  y9 w7 c; p1 lextern uchar code buff[];
' [6 j- ~$ b$ _0 x9 K6 ?6 n# auchar T1RH=1;                                           //定时器初值9 A$ s; Q% r- a( Y
uchar T1RL=1;                                             
8 C# k5 k: v4 h) e* O! i5 bbit flagBuzz=0;                                       //蜂鸣器开关标志& t9 @: ]# \% W6 x9 |" T2 d3 m7 D
bit EBuzz=0;                                         //蜂鸣器使能标志8 J; T2 p4 z. C8 ^& |1 q- v
char High=20;                                       //温度上限  超过限度蜂鸣器开% l( f% B3 b( p5 }3 T. W
char Low=10;                                       //温度下限. D( D0 {/ ]+ v  [" V2 Y
uchar mode=0;                                     //模式变量1 r  x4 h2 X  H
uchar cnt=0;                                     //ESC按键 变量
2 ~( I1 h- M+ I) h$ B# Auchar tflag;                                    //温度正负标志位' a- A4 j) ]$ l  z
/*************************************主函数***************************************/
4 Z, z4 ^  W/ Y; i2 H& N# Zvoid main()0 p+ j9 h* M8 f8 j4 Z
{3 _2 `7 `" q) R4 P# ^, ?
        EA=1;                                            //开启总中断
$ \& [) `- G7 @3 N        Timer1Init(1);                                   //初始化定时器1. q  ~0 t$ O: q" k
        RESET_DS18B20();                                 //复位18B20
0 L0 C( \3 E5 k- t- K        delay(20);& \4 E1 ^* ^; a0 e! N0 ]/ S
  InitLcd1602();                                   //初始化lcd1602 ) }' w3 d7 k+ {3 H
        while(1)2 g1 j$ s, }- [6 Q
        {3 r8 m8 S( R3 M; W" G. A: w. d
                LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位
4 |  o0 n% f# h9 l                LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位* t" _4 v" P  {) [
                LcdShowStr(12,1,".");                                     //显示小数点
4 ]! F" _5 g, {- k# a" t                LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位' W0 \) r& H' \# Q' s2 g3 l8 s
                KeyDrive();                                    //按键驱动
+ A  T& J0 h& k) y                SetLimit();                                    //设置报警值! ^& L% ]- G1 L$ R7 _& m
        }
( C0 s& a% e9 {( c& e0 O}
+ r4 d* @& ?1 X0 o& R4 }: y: l* J6 A( c8 f3 d1 C  V
/**********************************按键动作函数************************************/
. |7 t* v1 I4 E- }1 L$ v& J3 q3 Jvoid KeyDown(uchar keycode)
- S% ?. A& _" Z+ |7 p2 p5 ]7 b/ M{
4 X( K( u5 d+ c/ K0 b$ v        if(keycode==0x0D)                                        //回车键:进入模式设置
( P( _# ~  ~% L; X" G) Z  m9 K        {
2 N: h' t& `6 {- y: X  H                mode++;
9 {( Z5 {" d. k                if(mode>2)mode=0;
- M8 y' O, W; i. r0 E7 t: {        }6 P' }' ]) ?* f( [
        else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+1* G' U! w( Y7 \3 e  g
        {
' `# l- S- K2 N- {! m& i                if(mode==1)
% z' X9 ?  u8 H  h0 [                {$ l& X3 w9 i5 [: H  X+ f' [3 M
                        High++;
1 u: O/ E  i  q: m- ~: t                        if(High>99)High=99;) L  g1 c- J5 D% @
                }
, C0 R3 a7 K7 n( B  ?                else if(mode==2)
: n9 g  ]* I3 P                {
9 k3 }: A5 v3 `                        Low++;
5 y7 `/ N; ~9 K2 r* P  ~                        if(Low==High)Low=High-1;
# f* P3 c, m! D6 p, M                }
, x$ y! w; D+ U6 v; R) E/ R        }
( S) R1 a+ o6 _3 O# M0 q. V* j        else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-1
4 b5 X& B# E$ ]8 _& W        {) ~$ i3 E6 q' y% Y% Q  U* T& G
                if(mode==1)
: L/ J, K2 v/ K                {
, d/ k- X1 c+ \7 q3 C3 @                        High--;/ F' O8 p1 w7 ^! H: f, ]
                        if(High==Low)High=Low+1;
. o5 E1 E; a6 P6 P                }
  n2 l9 p- @4 H! n- }7 V9 ]                else if(mode==2)
' k! e4 [0 w9 ?* s% m$ e% I* {                {
9 [  n' o0 `/ u3 o% V7 J8 K3 Q                        Low--;
  v3 ^+ W5 c" Z1 x9 e! q8 k                        if(Low<0)Low=0;- T. m: \1 _  N6 O1 }/ |
                }9 Z* X* h; p4 T2 H9 [  H
        }) A( O- E/ m" j& m( `/ B
        else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警
% e, v5 E5 C+ t/ K        {
" s3 v) v) G8 C( l                if(mode==0)
& a; h9 k9 O1 i1 Y: I' _+ D2 E1 n                {
0 U/ l3 c0 W* i' u                        cnt++;
* m  o& s# ~+ H  q& `( ?* S                  if(cnt>1)cnt=0;/ w& [6 @# L9 J6 l$ \) v& P
                  if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像  @$ A( Y, q4 m9 @& A; z; P5 ]
                  { 2 [) v9 ]! X* m" s5 t
                           EBuzz=1;7 F0 h: U$ v9 E( b. V& M
                                 Display_laba();% }( P% g4 u" e5 c0 }5 z1 Y
                  }
4 z6 y! X! s) ?* r                  else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭% O1 V% T" _/ Z, i  _) n% {( w
                  {0 z$ q) r8 L3 s! V& K
                           EBuzz=0;3 B5 w1 P) W( Q
                                LcdShowStr(7,0,"  ");
, j" \, R+ D) m. R7 ]: T, r, Z) n& \: h                  }- c7 E$ \$ f% K$ p0 }, k
          }! h' e7 g1 v7 I# O6 C1 J( K
  }! ~6 x/ y4 i' Q/ `! V
}
5 _( {5 s2 _5 f; \( A- p1 G5 w, ?2 l* X* ]9 H& p' }- z) {+ a
/************************************报警值设置函数*********************************/
) {4 i8 C6 p5 q4 u6 D3 {% Kvoid SetLimit()
0 a, A4 T4 r8 q+ \: G{
) N4 d4 c6 H) n* _, @                if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数% h' w0 s' L& {1 N* }' T
                {9 J, Y( |8 T7 |: X4 }
                        ControlBuzz();; ]1 U6 ]+ t$ Y. `7 a$ ^) h7 ?( E
                }( o1 M  x2 o! r& F  K" [3 s3 e
) w+ p" r* u4 v( C3 v1 W
                if(mode!=0)                                              //模式1 调整温度上限
; }" U% v8 |- z                {                                                        //模式2 调整温度下限
0 c/ r% z+ H, ~3 u5 Y                        EBuzz=0;
3 q- M7 F* G: X3 G                        InitMaxMin();
, w$ i! y% d# @  r+ f! Z                        while(mode!=0)
% ]' J8 _9 o. |4 s6 D4 p7 e                        {3 z) Y" T7 O- _* z1 k* w& z
                                KeyDrive();1 t' u  S% D5 C$ ]
                                if(mode==1)
" J, I/ S! }7 R. c0 }                                {" ~& c7 A$ c+ X4 z% p
                                        Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限
3 K0 V+ K( E. h6 X7 B3 Y* a# Z                                        DisplayLimit(2,0,High);                            //显示 温度报警值上下限
/ A- X$ V( d  n: i                DisplayLimit(12,0,Low);
5 d& R0 b1 g# r3 b# Z+ Y* `% E                                }
0 Z- }+ }3 }. k9 ^& G( `9 m5 G4 |9 K2 O! b                                else if(mode==2)1 l- T+ ^8 C! F, O+ S
                                {. t6 n* Q' D* d6 u% [( L
                                        Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限5 z4 m0 S& W/ p( O6 B2 C
                                        LcdShowStr(3,1," ");
; z" T8 \- z# Y0 W% L+ ^                                        DisplayLimit(2,0,High);) o. Q% t0 Z9 R6 L# t3 R6 ]
                DisplayLimit(12,0,Low);
- k+ g" Y5 C6 }% L+ _$ g' q4 F                                }
* A' z$ j- G% q# t. N                        }- o- l) m' x: _
                        InitLcd1602();( d9 h% o( t2 b* `5 k
                }8 X) k) i4 r& [& \" z% w/ V
}' a3 k( o$ a; t. N, Z8 f

0 O0 D: ~  O- t# P7 i. L/************************************蜂鸣器控制函数************************************/6 L: x' W/ C. u1 W/ J: P& g3 j% l
void ControlBuzz()
0 I  Z* k+ s2 J{4 L& F0 `# `6 v: ~9 V5 n0 Z
        if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))* Q& Q8 Z# C' r' X2 j, M$ h# W* y
                flagBuzz=1;
+ n6 D6 O0 v9 U' E- t& ?) n        else
8 W7 d2 N8 |& ^! I  |. P                flagBuzz=0;
# @; h2 ^9 E9 l! d  M8 B        if((flagBuzz==1)&&(EBuzz==1)). R! R  \- v' I. \& _& e# I! j
        {
0 ^$ [# O+ j% k                Buzz=~Buzz;
% O$ D1 N, G5 T1 C2 ~        }6 ?$ R1 _/ k' }0 q- g+ K
}" J% y) Y2 X9 e8 ?. x
2 Z7 K! m( u1 b' [; v# Z2 N- F
void delay(uint z)
2 L5 C3 E: X* I  z+ U8 M2 X  o{
+ e: u6 a, T: _1 A0 h        uint x,y;1 _' _' Y2 R( W; \# \4 a
        for(x=z;x>0;x--)               
% y1 G3 L: Z/ l5 Y                for(y=115;y>0;y--);1 e% U$ l6 b: R- z* u6 {4 K6 X0 E
}" D4 f, H% F9 k* u5 l
% N* o( G8 i9 j& Y8 ~' U
/**********定时器1初始化函数***********/! S+ m  ~4 L3 T
void Timer1Init(uint ms)0 k( O$ b2 w) w% R+ A- N
{
; H! ]0 O$ ~6 q/ S( \( k4 Z4 x        ulong tmp;                                               //16位长整型变量tmp% e3 }* D4 |0 D; d5 h' u1 l
……………………' B( L) A9 Q. F* C

8 Z/ Z4 F/ Q$ Q3 O, r7 i…………限于本文篇幅 余下代码请从eda365.com下载附件…………
" m5 b+ \$ f7 w
$ k# |" q7 A4 L% M2 Z/ T
游客,如果您要查看本帖隐藏内容请回复

, {  i' o2 Z- Y6 f: B7 z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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