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