|
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 F5 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 |
|