|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑
! x \+ ~4 Z2 d G" r* l" _, P$ F! O, l8 c
基于18B20的温度报警系统(可调节温度上下限,超温报警)..' t4 u c3 r5 j' l: f3 ^( v
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
+ q+ z5 n$ t9 X( i6 N" _
4 P6 E' ^, p1 p7 }# e* z; O ]
4 V# ~5 ^" w/ g单片机源程序如下: G/ l' h7 u/ o' h( V0 V c
) k) O3 P$ _! O, w7 K0 c
9 |; W8 y; [. z3 D( W0 `
#include "reg52.h"
% e. E( c' p' z
* u5 |& a6 U6 w, s& ^#define uchar unsigned char1 \/ S) J- W/ D- K
#define uint unsigned int
* ~( m& X: r: Q9 P#define ulong unsigned long. c G: b3 r5 r& h
3 S8 B/ M: \) ^* w' {1 U//sbit Buzz = P3^2;
/ A9 n% q+ L0 ^' Y+ F* h$ r4 I5 |3 i: lsbit Buzz = P1^5;
3 [ z3 {. c% U! v% o+ n
) [8 b2 l: `) i/ j$ E' u- M/*******************************************lcd1602.c函数声明************************************************/
% v/ K3 U: @# zextern void InitLcd1602(); //lcd1602初始化函数
6 K0 q# L" J6 |* q$ l9 t0 j- Cextern void DisplayLimit(uchar x,uchar y,char dat); //在坐标(x,y)显示温度上限或下限
# d% ]$ x2 N8 S. l8 r4 mextern void InitMaxMin(); //进入温度报警值设置界面
% E, S0 Z: O1 h1 d. Dextern void Display_user(uchar x); //显示用户自定义的字符“↑”5 D% t% Y* ?! N* R! b
extern void LcdShowStr(uchar x,uchar y,uchar *str);. w {" E7 K, ?1 [ S
extern void LcdShowDat(uchar x,uchar y,uchar num);% Q7 j4 m6 N! s; i
extern void Display_laba();
6 P* k3 b- S4 k+ l/*******************************************key.c函数声明****************************************************/
$ `2 y) G$ C* v# | D5 Qextern void KeyDrive();
, t m7 ^, m' F/ A9 |7 Rextern void KeyScan();
, C! B7 Q9 o" T ]: w4 X& s- Y/****************************************ds18b20.c函数声明***************************************************/
O+ T* ^# ^/ h) z P% S0 @1 oextern bit RESET_DS18B20(void);$ ? M0 N! s* U3 S) V! `7 ~5 v, U
extern uint Read_DS18B20_TEMP(void);
1 G3 Q8 e. w% U: y* R% L/*****************************************main.c子函数声明***************************************************/
; q" i: ?3 y& O; y- Kvoid Timer1Init(uint ms); //定时器1初始化函数
( A* J- \+ A# e# n9 i: rvoid SetLimit(); //设置报警值函数' \5 D1 q! l3 r& m$ j x
void ControlBuzz(); //蜂鸣器控制函数
- h. e- b( V9 n' `void delay(uint z);; f' o( _/ W- o0 J9 H* { v$ E& i7 T
/**********************************************变量定义******************************************************/
6 J/ D4 \) v9 ?# ^* S7 F! oextern uchar code buff[];
& g# G7 c* p) H$ @9 d* euchar T1RH=1; //定时器初值( W* O' o, y/ p( q, r, j; ]" v* l
uchar T1RL=1; # I1 N" n7 {5 q. X. K' p* f4 o
bit flagBuzz=0; //蜂鸣器开关标志
* ?& S* a$ A' K6 g; J" |; S$ R1 tbit EBuzz=0; //蜂鸣器使能标志6 q5 p5 Z* e! n5 b
char High=20; //温度上限 超过限度蜂鸣器开
1 s7 c5 |1 y; \, G; c# Rchar Low=10; //温度下限9 v4 f8 c4 i8 o' v. t. {
uchar mode=0; //模式变量
^; M$ u* i6 z& iuchar cnt=0; //ESC按键 变量* m; Y$ [3 A" j+ Q1 J9 C* O0 \
uchar tflag; //温度正负标志位- }! a+ {/ l% t$ ]. |
/*************************************主函数***************************************/4 W G+ |5 }4 t1 W6 [" n" M2 e+ }$ _
void main()1 p+ C, g; R: c- M# C
{: r) C! r3 R6 L e' J% s' J
EA=1; //开启总中断
- n$ e5 u. S [, \. v p# s Timer1Init(1); //初始化定时器1
2 {' F' L- x- c RESET_DS18B20(); //复位18B20
9 h: ^9 R+ X7 H+ K7 g9 {2 k delay(20);1 d, [7 _7 B) p; o0 l: Q0 c
InitLcd1602(); //初始化lcd1602
0 B4 ^7 q' O8 x- `3 d* b% j# o while(1)
; x' m/ K; ~8 u, O {
- _ \# P+ O w( P LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]); //显示温度值十位0 P, X1 n! {: d/ w* ^" p' y
LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]); //显示温度值个位$ C5 Y) g4 l0 ]7 X6 z1 Y
LcdShowStr(12,1,"."); //显示小数点
6 B8 w4 I5 l% q LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]); //显示小数位
/ o/ D0 u% s/ h% P H( m3 u KeyDrive(); //按键驱动6 A1 @4 w) Y/ ]. Q! @
SetLimit(); //设置报警值
% b ?9 v# ^! _: W Z }
% ^7 y% _+ R4 b( n}
) p$ q. D5 q7 C& L# {5 j8 B. c& h" ^4 J/ j/ R2 y+ F- o S( W
/**********************************按键动作函数************************************/
f& h# g" u6 }- ?$ W4 @* { Wvoid KeyDown(uchar keycode)$ X# i1 I2 i1 t. y/ q$ m/ ~
{
$ N7 v( [: s3 ]/ y P/ e if(keycode==0x0D) //回车键:进入模式设置- L3 o; R, ~: \* h- y4 v
{
; f4 c- U, S4 ]# y mode++;# B# Y( a) J2 }5 b, H$ Z. e
if(mode>2)mode=0;
5 B1 Q- Z6 \2 k: T3 b' ~1 N% W }
3 _, r. N: U6 o& ]6 @6 H3 d$ A8 M else if(keycode==0x26) //向上键:模式1 上限值+1 模式2 下限值+1( J! v! |4 g+ E0 b, r2 h
{
& b, V; X& r, e+ n) q8 S- k2 i% v if(mode==1)
! q$ P" q9 [/ I6 i1 b# H {
. p# I' d2 J( U9 u3 y, K) P High++;
/ J# T7 m Y3 T8 b7 X0 J% X if(High>99)High=99;' m: @; z1 B* ~, G0 s" z" u2 H0 b
}* i6 A, ^" B7 Y1 j: l) p* [
else if(mode==2), M; y% e( ~: R2 r( J
{
. Q, ]9 `1 G, M* C* Z Low++;
/ R+ C4 v- S/ r' B6 Z0 ~: U if(Low==High)Low=High-1;
( x# ~( K) H) ?6 }7 B/ G" @ }
6 S* y% k D& H7 d }7 [! h9 F( p: g: S6 U/ ?
else if(keycode==0x28) //向下键:模式1 上限值-1 模式2 下限值-1# U7 Y6 {8 H$ B4 a& H( K# T1 |
{8 V1 U) Z" {9 `" B0 j
if(mode==1)
6 o1 B9 ]2 q' H' ~% m! p {: F1 _7 I! K0 m) p
High--;3 [8 o' J' Z9 N
if(High==Low)High=Low+1;$ i- p" Z+ U" V. s3 E
}
' f9 Z% U3 L! y6 G$ o/ t% W else if(mode==2)
! `1 i) @; R( q" @ {& c+ r+ O }, W* R m8 j
Low--;% H3 g9 Y; W/ |( X2 q
if(Low<0)Low=0;) o8 U2 a, K9 J' _% w! x" g
}) f, h; f+ W& E: P/ Q* l/ z+ _2 D9 S
}
% F% l2 m/ Z8 E) U. Z else if(keycode==0x1B) //Esc键:开关蜂鸣器报警
8 L8 {& ]8 z8 o# L/ K" P7 E; X { |4 D! r$ } f4 t8 A S
if(mode==0); [$ ~$ `9 I. h
{
6 m7 D( A5 h1 ^' k, B v# { cnt++;( @! M( l( A l+ e; D# h
if(cnt>1)cnt=0;. J c5 @" \& I* q
if(cnt==1) //蜂鸣器使能开启 显示喇叭图像
, {( v1 b: v: _" [0 h2 w { ( o4 Q: [1 y+ _$ {$ u' ?0 {
EBuzz=1; w; \- }$ y" ] }0 _ ?, \
Display_laba();, n) \4 ~1 v4 j) Y* `
}8 P4 F1 M% D' f; I' e
else if(cnt==0) //蜂鸣器使能关闭 不显示喇叭
( n0 p9 A- N8 I' |& T" p9 I {
2 {" `0 c: I0 J- E. V! i EBuzz=0;4 |! w; L) k G/ Y% O
LcdShowStr(7,0," ");
# D3 q- E$ B+ R$ q }+ Z9 O" ]8 N' S) x
}
0 u0 o3 i$ t, D' w( f6 B }
* O5 w5 s- o9 h. A# o}) P$ e9 H9 \0 J! \% y/ |
: T' G$ S. c& o# f* _& A/************************************报警值设置函数*********************************/
3 r: F1 A- I) _* |: F, }void SetLimit()
4 {+ J) z7 ~/ I& x+ X$ @' H+ K- t{, d4 b; e, K O; j% B& M
if(mode==0); //模式0 正常显示 调用蜂鸣器控制函数
1 v* i! t; }5 V {' X* P0 _1 F5 `1 [& o
ControlBuzz();
/ ]4 J3 v( H8 o. @/ u+ i/ W }; p! ^) ~6 a" [1 ]
+ z/ Z; d; i+ U4 l
if(mode!=0) //模式1 调整温度上限 : E0 _ b5 n! [8 K, `0 x" R6 p8 f' [
{ //模式2 调整温度下限; J/ H" J' Z4 {, U3 i
EBuzz=0;
: b% [+ _% {" X InitMaxMin();
4 G6 j) x& J/ l. G+ u while(mode!=0)# E b2 X9 Q7 a K, K6 }7 d' ~
{
: R" q: V# j: m- l+ j K6 ?# D) f KeyDrive();
% r; j9 ~) `. O u9 l# _ if(mode==1)
5 N w# _- T+ R/ V( Q/ m {
$ A5 @# I5 b' E Display_user(3); //显示自定义的 箭头 图像 指向温度上限/ T+ N4 I2 V' E/ L
DisplayLimit(2,0,High); //显示 温度报警值上下限
" r4 ~8 ~1 M9 p5 z DisplayLimit(12,0,Low);7 ]5 T2 M3 O" y
}
( \: Q T( A3 o ^# l else if(mode==2)
- ~+ C3 t p, I3 j, d6 [" z1 P {3 `" N: i) z, Q* {4 U- o
Display_user(13); //显示自定义的 箭头 图像 指向温度下限3 a: I0 N& Y m$ A z
LcdShowStr(3,1," ");
# Y9 X1 p) B& A% V1 h+ |: u+ \ DisplayLimit(2,0,High);
0 ]9 D* `1 b$ S/ l+ V! d DisplayLimit(12,0,Low);
- t& C1 ~; c, [. Z+ |' U }
. _% |& k! d! W, }1 e0 M }. H/ T. ?& G9 g X1 k a9 Z
InitLcd1602();5 }/ S; y) m# o4 w% e! _
}
2 G' H1 A: s x/ c$ w& @}
V" m) n3 n* T4 E( k" |
# }3 Z/ M2 q, } z0 t0 t5 r4 D/************************************蜂鸣器控制函数************************************/
: ^7 t- m# v$ P7 B y% h0 I$ Uvoid ControlBuzz()' @0 H! K, ?$ j N
{
7 x$ X3 F5 V. H( @( H3 s3 e+ U2 A if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low))). r& l' P3 u. p4 y9 Z. L8 y
flagBuzz=1;# S- v, k2 k6 ?" N
else% y; Z0 u% n' P9 @' h
flagBuzz=0;
' {' o2 y' q4 I, M if((flagBuzz==1)&&(EBuzz==1))
+ a6 P# _" i8 L' L8 Q {* u8 {, R# I7 { `
Buzz=~Buzz;
7 b# m% f/ X0 b$ U3 E) I! M% v }7 E1 @5 i) E5 e& y; ~
}5 x7 o, y6 l5 ?4 _# K0 E
. e5 Z/ `6 k5 E E A; Dvoid delay(uint z)- U" A8 D2 Q/ U
{$ B5 v3 Z" V+ W# @, b$ W
uint x,y;
6 ~. j0 B# U. t for(x=z;x>0;x--) % Z* L2 Y+ V6 V# s
for(y=115;y>0;y--);
9 F! S& c0 }( u; n* D- |( l9 w: N}2 I; P) E1 k$ I% P, ~* c
7 i% I: F7 s8 @4 S$ D' ?4 p/**********定时器1初始化函数***********/
' j. S( z \) i2 w7 T) Z1 P; gvoid Timer1Init(uint ms)
- S" B# `0 f4 i, t{# D! h7 S V0 _3 ^ j
ulong tmp; //16位长整型变量tmp- j* |3 P" ?* t& M
……………………
; y2 f9 c3 ` p. c# z \
; q& B9 f% c1 h1 Z6 I…………限于本文篇幅 余下代码请从eda365.com下载附件…………6 O% { R% T! b! v- {
) B6 K" R+ V3 \4 ]7 N
$ y7 x0 t9 T; D4 h |
|