找回密码
 注册
关于网站域名变更的通知
查看: 274|回复: 1
打印 上一主题 下一主题

基于51单片机的数字温度报警器源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于51单片机的数字温度报警器源程序
8 X" z' A, }& g# Z0 N6 T$ N" z) ?9 W# G$ \, {5 ~7 G; g

9 Z3 Y. E+ H8 w7 E! Q#include<reg51.h>
  z  I! D/ p# Y; Etypedef unsigned char uchar;: k+ o9 a: H. j% e1 J5 x
typedef unsigned int  uint;! U9 g+ f1 b6 p  G! X
uchar i;- x  \/ x  h% P) b
sbit RS=P2^7;
. y! W/ k3 S: Z8 @' wsbit RW=P2^6;
5 W( `2 Q; _- [sbit E=P2^5;
- ?7 Q( W% N* A2 F2 x, ~9 }sbit D1=P1^0;5 n! x, ]- O, m. K
sbit D2=P1^1;6 ]* m- \) l: f% p, a' {
sbit k1=P2^1;//加按键1 j% G6 k$ @! ?2 Y0 u% T! W
sbit k2=P2^2;//减按键( d+ f, I! {0 E( s$ T* g
sbit k3=P2^0;//设置按键1 n7 D' M  e% `
uint th=360;//设定 高温
2 `7 v! T& R; }0 S9 M! A: ?uint tl=350;//设定 低温
9 ^  Y6 e* Q3 Z5 Suint ta;//实际温度
1 X; n; Q: `7 U: tuchar code t0[]="WD=  .          ";
9 a: O5 S1 N: `# \uchar code t1[]="TH=  .  TL=  .  ";) _" }& @- |+ S- ?0 D
uchar code wendu[]="0123456789";        //利用一个温度表解决温度显示乱码: h+ y9 M* O, @3 G5 d8 t1 ~
sbit DQ=P2^3;//定义DS18B20总线IO
5 H# f2 `6 g, [" ~+ ~0 vuchar position;//设置的位置, \" ~$ {& P* V
//延时子函数* V' J9 b* C( ?) m% `. x$ c
void delay(uint z)
: f- v; W5 o7 t5 g* ^: v* K& c{
  Z. p" E" P$ l3 H+ ~" o' ^2 _        uint x,y;- I( I% l0 j% K( ?
        for(x=100;x>1;x--)
! F5 q, s- O3 c/ s" G) Y3 Q                for(y=z;y>1;y--);
: p# j0 ]3 Q8 m% J}
0 ^: V) x5 Z" o7 f4 {8 T//LCD1602液晶写命令子函数  h& r0 B* Y5 ~$ a$ N" {
void write_com(uchar com)
2 {6 @+ c: L* X( v2 f' W' O4 y9 {{
- j0 d& j1 |9 t8 c* c# e        RS=0;
" ]7 s/ K* D! n        P0=com;                                       8 j2 Z, n& f1 a+ A
        delay(5);+ y/ p: X* f! f+ E2 x. }6 b4 E
        E=1;
( b6 B$ ^* x7 n3 p# L, ~5 q        delay(5);
9 |3 R& ?5 z8 z5 k        E=0;3 V; Q. A, u  ?( j
}
8 x( Y2 r. }0 v' G# w) E% o//LCD1602液晶写数据子函数
! r+ ^) E3 Q8 j( |2 K- p+ ?void write_date(uchar date)# z6 a  e2 o" C" Q3 y
{5 o% ]3 t: ]! K; W
        RS=1;
' P. j' y2 Q& z        P0=date;
0 [1 I7 B$ [% E5 Z, D, P( [: M& k6 O        delay(5);
. m% a5 K( i# ?        E=1;
" c( @( o2 g4 V/ c' [        delay(5);
6 B2 ^# K. p* {! G/ l' K- h6 l- p/ D* K        E=0;% @) J+ j0 j( D
}
% t- u/ _* ^6 v/ H//LCD1602液晶初始化子函数
" e3 V7 O9 ?$ e" L6 @% I4 {void LCD1602_init()
+ W5 {" T) B8 u{
- Y; s4 c1 r6 g4 {/ j  W3 D        E=0;
( |/ w, D1 w3 d        RW=0;
  Y7 Q/ {: x( v: ^        write_com(0x38);
8 z6 G; x7 {1 W3 Z8 v- a. f; _        write_com(0x01);/ U  K6 }/ m4 g* P( Y- h5 s# F6 B1 y
        write_com(0x0c);
" `5 e* A6 l; Y9 J9 n  {        write_com(0x06);+ y9 n$ x+ I) Z/ Q6 \( f9 P
        write_com(0x80);        
! C# c% X. b8 H1 ]        for(i=0;i<16;i++): s2 |$ ?; i3 k
        {
+ P& K. f' e$ c# i9 u& d3 K  l                write_date(t0);
+ f6 w" E$ G- s                delay(0);
1 I5 W$ u9 O) O9 w" w        }
( k, p( V. A1 A1 ^        write_com(0x80+0x40);
9 }0 C7 `1 X+ G3 f# g. d" O        for(i=0;i<16;i++)' K7 H2 x7 q. |+ J# }6 k
        {2 ]3 l5 J$ k$ J, p
                write_date(t1);1 T5 s0 p! N8 F4 q
                delay(0);2 n# ~7 n) }: W4 ^- k( B
        }' R% Q9 e, q; _/ K% H
}+ d7 f" {3 P9 C8 ~; W+ L7 e
//延时子函数/ |0 ?  E0 C. y  A2 z
void tmpDelay(int num)
2 D' B% o7 b. {. H, J5 V' ]/ `7 b{
; A& Z# _# H# K! w* G' t        while(num--);7 G$ }5 J& h9 ], l( h0 o5 x! B
}        
% J+ e% d7 V  `7 V  g//DS18B20温度传感器初始化子函数# J4 b9 L& _. D7 h  [% g2 O# h
void DS18B20_init()
9 @& L: Z4 x' W* V% Y{
6 B, n, j" s) u8 K5 m% B5 x% O  X        uchar x=0;, u* s! L( C' G, S0 Z5 Q
        DQ=1;    //DQ复位
& z) f$ P2 _/ w        tmpDelay(8);  //稍做延时. \8 S7 C7 G0 Y' h3 R9 t
        DQ=0;    //单片机将DQ拉低
* @1 V% ]# ~* f        tmpDelay(80); //精确延时 大于 480us
3 Q  A( m$ L6 e! a' n, x; o" W3 q. d        DQ=1;    //拉高总线
8 L, E: j" S) b  J. p/ q  g  M        tmpDelay(14);
7 M3 A+ {2 x) d+ W5 i' g& H  `        x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败) x7 |- g0 W, [, E& s! N
        tmpDelay(20);% n4 U) b8 {! \* Z) r" G6 Q$ Z' \
}# Z8 ~: Q8 J: M5 t, H$ h- Q8 {
//DS18B20温度传感器读一个字节子函数, v( N" u& u' t5 ]
uchar ReadOneChar()
- Q0 T/ i& ?% E+ g; ?{  Q" `( V1 C4 R6 v( m4 e- J9 z; d
        uchar i=0;# V% \, h5 R! G" ?0 M
        uchar dat=0;, _5 a- k0 p7 s. ?
        for(i=8;i>0;i--)* M. F1 d. }2 _& \: W8 Y" t% `* i' R
        {
- P9 v, V! R, Q                DQ=0; // 给脉冲信号: O$ L( t, ~: V8 S8 f9 u' {( f
                dat>>=1;
/ N. t3 i  U$ R                DQ=1; // 给脉冲信号
6 q; K+ _9 X, X- y                if(DQ), j  \  a" _1 z- f$ d) N
                        dat|=0x80;4 N. l  Y6 C0 O3 B5 s4 J9 j5 N
                tmpDelay(4);
! Q9 t* y5 X5 C7 p! ^6 {' M! h2 H+ u        }
0 s1 g  Y: g- i2 [3 I, N7 g        return(dat);, L) K) `- A# w4 J  W7 k+ e% C8 X
}5 x9 ?, \7 {& W
//DS18B20温度传感器写一个字节子函数
* t4 Z5 n4 M% G6 F7 ^1 dvoid WriteOneChar(uchar dat)
# g* j; w% h: Q& Y5 W{
% I2 l3 |) |8 Q        uchar i=0;
* I% \; [3 a1 A  {4 A; T        for(i=8;i>0;i--)* {1 Y3 B/ Y( r# r) k2 P: X3 A4 D& t
        {
* W3 r" E- r$ [) a( O5 ?! k# o                DQ=0;
6 E: w6 X+ A8 E! z" E4 h0 D# D8 k                DQ=dat&0x01;" b/ b0 |( V% r  p2 U4 b" r
                tmpDelay(5);& m- U, A# t& y, H
                DQ=1;
) [& y+ M: q/ L3 |4 M- [8 V                dat>>=1;' O# U/ S  q1 M, H- I) ]: Q
        }
! v+ H; ^, P' |( h% N4 r3 `! c+ a+ ?}
: O' Z) e2 O. z8 _  P2 n6 ^//读取温度子函数
; @) W- k: k3 Fuint Readtemp()8 B3 L' v" Q8 n/ d4 r5 j6 s
{* Y6 w1 _6 K7 F6 c# K- F* u1 V8 Q
        uchar a=0;
( ?. G9 [7 G, T3 x        uchar b=0;* k* V. h; x% D5 o- _! V
        uint t=0;
0 n: P# R" e* R5 H        float tt=0;        9 s$ w' i8 u' F. _$ g( i- A4 c
        DS18B20_init();7 {$ f$ H) e$ q1 p6 r* M. L
        WriteOneChar(0xCC); // 跳过读序号列号的操作
/ z7 {4 l7 k3 s/ y( Y! O+ M        WriteOneChar(0x44); // 启动温度转换
6 {& d( {7 g  t% z8 A+ r        DS18B20_init();
9 j& b  E, t% W        WriteOneChar(0xCC); //跳过读序号列号的操作; t! t7 W! n9 t) {2 Y' Q4 C" [3 c
        WriteOneChar(0xBE); //读取温度寄存器
% o; v5 R) b, @) q5 h        a=ReadOneChar();   //连续读两个字节数据   //读低8位
8 u* g6 w) i: U* o2 Z1 z) E7 q' H        b=ReadOneChar();                          //读高8位
% f) g1 j: Q- I6 N2 e  b+ v        t=b;
$ A( r! \" b; x0 L        t<<=8;
' W7 c8 ^4 c5 N% b        t=t|a; //两字节合成一个整型变量。+ k( r$ R' Z( l, v% R0 d; k2 r5 D; `
        tt=t*0.0625;  //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
/ W' I, W' a6 j3 \0 G4 h; \$ n        t=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
" _- R' U0 }& ]9 e" F( v0 O        return(t);  R0 |. L3 @; @& e6 r
}6 Q/ I0 [8 D! @) g
//LCD1602液晶显示子函数# @" w- y4 W  p* P) G
void display()
: s" _4 |3 Q, `% C/ F; m{
! F9 X/ T8 y" b           uint shi,ge,xiaoshu;            //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误% t9 E- }. W' O* c
        shi=th/100;                  //显示 最高温度 Th
+ K% Z4 N" w$ E. B+ V        ge=th/10%10;( K* T* d( q, X* E/ Z
        xiaoshu=th%10;
' [* L5 u8 j# a+ m* R% G; Q        write_com(0x80+0x40+3);
# X( q( ^) X. l- g( r% a        write_date(wendu[shi]);1 u' X1 V+ V: }# K0 x
        write_com(0x80+0x40+4);
9 k, r4 [4 l: C5 m        write_date(wendu[ge]);                                       
3 O9 `  C* a6 a# ^        write_com(0x80+0x40+6);
& V& q7 J# y0 ^        write_date(wendu[xiaoshu]);
. n9 P  u7 H5 _( A$ b        shi=tl/100;          //显示 最低文帝 Tl  . d& I' X. E! I1 X8 s
        ge=tl/10%10;3 R% k+ J" @% T: s& |
        xiaoshu=tl%10;: _0 f4 A8 ~  W3 i5 I1 h* K3 J- j# ^
        write_com(0x80+0x40+11);3 n5 M& w% }2 ?. M
        write_date(wendu[shi]);' W$ Q+ J* L7 D9 T
        write_com(0x80+0x40+12);$ c% ^: G! D3 E$ r7 ?, M" G4 l
        write_date(wendu[ge]);                                                
0 R0 g7 K* ^0 a4 s        write_com(0x80+0x40+14);
) K& q. r% m0 }% G        write_date(wendu[xiaoshu]);
  b/ N( H% g* ]4 F}
: d* F6 o* q8 ^, a//报警子函数
4 ^- D. a' a8 q0 n9 Gvoid temp_check()$ b& g! h7 q/ F$ u
{
& `# ]5 T8 }, i* a3 n        uint shi,ge,xiaoshu;            //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误$ M, `; ~' ]& }: [( v+ P; y& c
        ta=Readtemp();; x8 I+ ?3 F) `7 x
        if(ta>th)
+ K( c+ [2 ~0 l2 X: Q1 y        {
, n" V% W; ~+ P2 ^5 u$ {                D1=0;
9 ~& O5 H% H- R: T8 Q. A                D2=1;
+ q1 |- {, _0 F* {+ a7 I' O        }% i+ G3 A7 o/ r3 ]
        else if(ta<tl)
& f! c7 {9 l, ~9 C        {
. b$ h/ B; C2 W2 q" A                D1=1;  W/ ~% X, f2 Z+ ~. r
                D2=0;* l$ ~8 t& `# a3 j( b- O; a
        }2 T  E+ N6 _. K' l0 U" u
        else: j2 U' W( L$ ]7 {1 V% I
        {
9 G2 u. H, e6 S                D1=1;. q. d/ r  y! I% K$ z
                D2=1;! \0 J4 p* T( k. O: I$ V0 u  x
        }
3 `' C$ H- J. R7 E. V$ B8 z- ?        shi=ta/100;         //显示 实际温度  ( r( h. W' X1 K
        ge=ta/10%10;
. y3 H8 n  J, x        xiaoshu=ta%10;
: ]8 l* Q5 d, q( g: `; q+ \! C        write_com(0x80+3);
4 `( E- n# R5 O/ C        write_date(wendu[shi]);1 ^6 ~  Y# G" Y
        write_com(0x80+4);1 j* a1 ?" @; ]5 o
        write_date(wendu[ge]);                                                
' A; s- f4 A7 _( d# p: H( F        write_com(0x80+6);- B* f9 [9 t% K! M
        write_date(wendu[xiaoshu]);
+ C1 \& h' _" I8 ]: ?) e7 C. h}5 [8 U: v% K) ]: z/ {
//按键扫描子函数
* ]% l- w4 q/ w$ x8 T2 Z/ o+ `9 Gvoid key()5 y6 w) A( t" X3 |; y) `2 s% K
{        : `/ G9 O* y+ i
        if(k3==0)                 //set 按键 按下 , b% K, a% i& S4 x  y7 G' X: t
        {9 M0 y4 Y. F# `
                delay(1);' q& w  _& S4 k" @% u
                if(k3==0)
: X/ ^- j: q' h5 ]  S                {                                                        //设置位置设定
1 L: h: F2 `7 G! Z4 C                        position++;
' [8 T+ q2 H. t! C& k0 Q                        if(position>2)
) Y% I  _( B; ?; i' u                                position=0;9 p3 a) c" b0 N
                        if(position==0)                  // 无设置位置
3 j! ~" ~+ R. n$ g  v                        {6 N3 r) n* c7 @% [0 H- X6 ]
                                write_com(0x80+0x40+7);0 J9 _) _: O* _2 m. P$ r
                                write_date(' ');7 S4 L4 a5 g6 J7 J  f% Z& W/ O
                                write_com(0x80+0x40+15);& u6 t0 r* r* a. h5 R: ?! s' \& W
                                write_date(' ');
3 K7 I2 e) i& U8 h) p0 `                        }" X' ^. K4 Z% J- O# d, S. f+ W" ~
                        if(position==1)                //设置TH 在th后显示< 标识当前位置" F) S# \( h9 T8 h9 R1 N9 K
                        {4 m3 i! \7 \5 _* C; B' z! n! S5 V3 O! d
                                write_com(0x80+0x40+7);
. ^- w: x  R2 h- z! c) l6 _) C                                write_date('<');
' T5 I" |8 p2 J8 i) R% r4 B                                write_com(0x80+0x40+15);
7 E7 e$ z$ e$ n/ |9 x/ M4 P4 \* A2 u                                write_date(' ');                  
+ n8 q1 {  G+ b% ^1 L% I                        }5 m9 P# I2 z+ U) f) [
                        if(position==2)          //设置Tl   在tl后显示< 标识当前位置
/ u4 r1 P; n5 l2 D5 `( {/ w                        {
: O1 ^7 [* ?5 O& a; R2 F; e$ V6 g                                write_com(0x80+0x40+7);1 F; u7 y4 [/ O+ W: g# K9 I; f
                                write_date(' ');
# A! X# L1 s' M                                write_com(0x80+0x40+15);% x8 {6 G6 }0 Y9 n& k
                                write_date('<');                  
- m- V- \9 P/ i- b                        }7 r1 t& c1 z4 s& Q
                        while(k3==0);        + `+ v8 B0 A0 a; c! P
                }        & w# g) o% t$ }$ [9 A
        }        
: d' n8 |# Y0 J7 U3 D, l( x! z1 O' F        if(k1==0)0 O- w& t: x! l' O
        {* Z$ |& |& |' _; l3 i- l7 e' v
                delay(1);" ^0 K( J+ m! q7 y" L; I! i
                if(k1==0)+ U# R, z( ]1 g& [1 }" p' \
                {
- Y: Z3 j% W9 G* k0 f                        if(position==1)
* S5 @2 R8 _3 ?; e! y5 O8 Z                        {
! Y- S; Y+ t5 x9 n9 k/ k6 [                                th+=5;
+ I6 B  @- }) H  f                                if(th>1000)
: N# _* m3 [8 q7 x0 c                                        th=990;
; W0 O  O2 u" a7 ]                        }
  V7 t- ]" M, N% r1 J- R                        if(position==2)
0 |- o, [/ I6 H- t1 Z0 w                        {. F1 t  _  S+ L/ ~  Y
                                tl+=5;                          //tl>th时  是个错误,这里避免此情况发生" V+ ]. P0 D1 N
                                if(tl>=th) ' ^+ d4 B% c) X- J% m
                                        tl=th-5;: V  g0 j& d& K: h9 q2 f
                        }        
- K  T2 X- i& K' A9 n) Y                        display();5 {" T, I6 J4 _$ u: k+ w: |
                }        
. S! q- p; R# k( h: ^! T                while(k1==0);# J$ O1 y2 C9 e
        }8 B9 o! r' E" c# B% [
        if(k2==0)' E" y' A2 p8 j$ |5 m3 ^
        {: m" C% d7 n7 J4 |  h
                delay(1);. W- o/ Q8 M8 c" t( O+ z0 u  a( Q
                if(k2==0)# g# Y: r* h1 g( J9 d3 O' ?6 k5 }
                {; W1 m7 z+ D9 H% |% ^. a
                        if(position==1)0 j5 R. U1 |$ l% i8 B5 B
                        {
. Y! d  f9 ?7 K9 R0 A- h+ S) `  m                                th-=5;                         //th<tl时  是个错误,这里避免此情况发生
0 h* I0 z+ b( m                                if(th<=tl) 9 q; P2 w! B6 c) A# H
                                        th=tl+5;% l4 j" h7 ?1 \
                        }
( a# L% k# G6 G" H. X6 z: m) Q( I                        if(position==2)
* s- q( w2 z5 |, L, q, v4 b                        {        1 e; X# m1 ~3 ~% j& E
                                if(tl<10)
) d9 x, c9 m7 j7 i( F+ k% `. t8 L                                        tl=10; 0 `' W7 I0 M2 _/ O+ ^+ J, ~2 t
                                else   X* M: z) x$ _* n" D, ]/ h
                                        tl-=5;/ D9 ~7 V8 z- H' \! o
                        }        
. O3 a/ U) {; k6 N# q! C                        display();9 T& C; x9 i  o$ G
                }        
; H! Y0 j/ g9 K7 U$ @5 ]9 Y                while(k2==0);0 N' C1 x6 V/ o- F
        }: L0 }3 o& F" d& M. h# H, N
}
" w% ?  R1 t( n2 C" @* x//主函数9 A2 Q6 }- u+ S2 Y' n1 S4 z9 W
void main()
$ k: U. d$ _* C, W: m- T2 ~{         
  G% O8 P6 d9 A/ m- ?        uint i;6 k: v4 G; C2 G- t) {0 [
        LCD1602_init();* D2 J; G0 \' W' G
        display();: j. H% n7 E, w$ V5 @
        while(1)2 g* n. u2 Q$ T' s& W0 Q" z% @
        {        
9 ]1 y% T, I" I, q' h. s                delay(1);
# D0 e. y  @& J9 [# ?& v                if((++i)>500) //500ms 检测一次温度
9 [) b# x: F# r5 f' P. r0 z                {
1 N! Q3 I+ n1 `) a3 z8 Y- {7 ]                         temp_check();
  i; B) c+ j- B  f                         i=0;
2 d+ D8 x: |0 u. {. U- I                }               
/ C! D4 p3 O3 x                key();               
- V) a# `$ b$ e( Y- R: w3 j        }/ E8 X8 t9 [+ K$ p# z) w  E
}
: S- y* a: V. ?& U% I% @% Q$ Z0 k

5 {% ^) p7 s8 P  i* @% H

# ~. _: p$ g; h2 {4 x9 z下载:3 y% g$ [2 ?( C  Z
游客,如果您要查看本帖隐藏内容请回复

8 X: V$ @/ L8 \6 D

该用户从未签到

2#
发表于 2019-1-17 18:17 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-19 11:59 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表