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