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