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

DS18b20温度可调上下限1602液晶显示程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
DS18b20温度可调上下限1602液晶显示程序+ }3 w% M, w9 I
7 d! {6 U4 ]5 b% e, y' t
- {# a  a+ _( n* C
/*-----------------------------------------------" c, [. c0 c/ r) n* N
  名称:DS18b20 温度检测液晶显示
" c, H8 S. T# j/ j, a0 a' ?  内容:
! w. X9 Q8 o" o1 o------------------------------------------------*/) d5 I+ g( b8 O$ d8 o- X
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义+ w4 d/ V5 P* {. p! F5 [
#include<stdio.h>1 R9 d9 H7 C# O- G6 K! X. M
#include "18b20.h"- N6 W' L: r( s9 F: y1 R
#include "1602.h"3 J: }# w+ ?' M( x+ j. C. f
#include "delay.h"0 y! T5 C  z+ b; s1 }! F6 {7 M
#define KeyPort P3 //定义按键端口
0 F  |' R7 \" s/ F5 I; D0 b' W1 e5 i+ C. [$ w8 l+ d& m" q
bit ReadTempFlag;//定义读时间标志
0 _2 T( z7 M/ Q; l0 ^; y: ?sbit P2_0=P2^0;" n" H$ g# \- G* S; o, N8 A
sbit P2_1=P2^1;
# d. b% n: d$ T9 Gsbit P2_2=P2^2;
  i5 t/ @4 k5 P% b% z% jsbit P1_7=P1^7;         //定义电机输出端口
' y( J2 |# v1 m$ bsbit P10=P1^0;; l, Y. o; }! B# L! |, e& T
sbit SPK =P1^1;
2 n5 |' m9 S! E+ Y* A% junsigned char frq;
- w# k- M, V' e. M' S; k$ ]void Init_Timer0(void);//定时器初始化
8 E2 Y8 z: o% }1 R1 a* a5 A7 Ivoid T2csh(void)  //定时器T2初始化
3 B" V) ~% P* h! g+ ?6 N{4 z; j- B( ~& B( N' i& [
RCAP2H=0xff; //TH2初值
3 F$ t; T+ t, p+ m, o RCAP2L=0xee; //TL2初值
! \/ g( f. Y) R% ]! p, Q- v4 a* k- f/ i) d9 q; I- Q7 a4 W
TR2=1;   //启动定 时器
5 O( b7 c! j+ n; b ET2=1;    //打开定时器2中断
2 j" p  |2 X. I" _3 ^$ D% F //EA=1;     //打开总中断 % v7 G  S: p0 Q& K
}  c1 y* i% a7 G
unsigned char KeyScan(void);//键盘扫描$ l; i/ L- r$ h4 G  G
/*------------------------------------------------7 X6 C; m1 S; S
              串口通讯初始化
4 S$ H4 C* x' \0 F' s- B) |8 [------------------------------------------------*/& g, l8 [1 q7 r
void UART_Init(void)
, [' W" K9 C- V/ M: K{% Z! N7 c" E% `
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
4 j1 y6 @- b0 f& ~    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
8 `0 v- u0 |" i2 T1 e9 e    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
6 A) U' ~% d- }2 c% z4 L    TR1   = 1;                  // TR1:  timer 1 打开                        
/ N* R  K% i- y$ Q! t    //EA    = 1;                  //打开总中断- h5 C) |! S  a, q
    //ES    = 1;                  //打开串口中断/ X3 ~1 u, i4 ?6 r
        TI=1;( c  y0 {! K/ j6 J/ o( C9 [
}8 s# J) j$ i* v: V+ s' r
/*------------------------------------------------
: ^" j7 A3 S0 p! M( Q; G, E                    主函数
! }. C  p7 B, D/ p/ ]: S------------------------------------------------*/; v9 D: m  I  }% g7 ?3 C, }  }
void main (void)
8 w) ]0 E  L) t, w# o{                  ; q: ?% r8 P8 q+ B% n) c
int temp,tempH=18,tempL=15;
! V$ |9 d' y0 Z# v  Tfloat temperature;
+ e/ \" t  U4 T, L3 E' q+ Uunsigned char TempFlag=0;
( V( j8 m  |5 ychar displaytemp[16],num;//定义显示区域临时存储数组4 @" S4 s' D- e* U' g
LCD_Init();           //初始化液晶7 z# ?/ B) H$ J3 P
DelayMs(20);          //延时有助于稳定
) ?9 e0 z9 y# P1 V8 Z' xLCD_Clear();          //清屏
6 H, {: H, T; K* W. @; TInit_Timer0();
& r) M  Q* U" y5 z8 p: J1 S2 i, _UART_Init();3 ]) e9 T, ^# R; A3 M; L
Lcd_User_Chr();       //写入自定义字符1 d6 f3 Z9 R% V$ @. a  O1 V# d7 ?8 K* p

4 N5 H9 {; b7 u: n) U( p' B/ uwhile (1)         //主循环
& K) h: ^" ^2 R  {* D% U$ O+ |, H! `1 w& I0 e1 w' z
num=KeyScan();
" y% P6 q: c( B$ Y1 K* m2 S switch(num)
# c5 N5 S% L, R8 V       {# q8 A' Y- H; l- v5 {3 t
            case 1:if(tempH<127)tempH++;break;7 C/ F4 O+ D; A+ o  a  c" ^
                case 2:if(tempH>-55)tempH--;break;
$ ]! F) a* u! y                case 3:if(tempL<127)tempL++;break;- e2 M: Z" s* a- g
                case 4:if(tempL>-55)tempL--;break;
# Y/ L) L$ ~9 w3 v                default:break;- Z5 |, B2 u1 S" K
           }
; E* I+ R; N3 ~9 Tswitch(TempFlag)                                                                                                                                                                                                                                                                       0 i4 E, I$ [1 B& j  x' C# m  m9 G
       {
* F2 w# u5 T$ G# D            case 0:    //输出温度上限下限2 T9 [7 m- K! N& L, r6 j) X
                    {  X. x+ w# @1 r+ s' @  E6 k
                      sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);
: z  T, J! b& _( B: F4 T              LCD_Write_String(0,1,displaytemp);        P2_0=02_2=12_1=1; P1_7=0; + d3 o# Y4 D: e0 A7 Y. c
                          break;+ V  S" R. i$ D# R
                    }
4 T6 x4 Q) c* \3 u6 I                case 1CD_Write_String(0,1,"over  tempH    ") 2_1=0;P2_0=1;P2_2=1;P1_7=1; 2 T  A& f6 B# @2 F/ t% b; L8 o
                       break;+ [: K& a/ O5 E$ O# @
                case 2CD_Write_String(0,1,"under  tempL   "); P2_2=0;P2_0=1;P2_1=1;P1_7=0;  
+ t# f7 ~1 ?3 C. E3 b+ A                      break;7 v! w# E* S+ y* y4 N% `1 D
                default:break;
) n- m5 k0 w1 h" f3 ~           }& R  d' |* h( g1 z6 ?/ w( b
if(ReadTempFlag==1)% N1 J+ K8 I6 u/ k5 f
{' c, i- j% {1 `) R$ {( m0 P" k
    ReadTempFlag=0;2 J, S9 X$ U: K" C& S
    temp=ReadTemperature();. M( @" n  X, R2 W% U

! ?& b% ~8 \, H  A+ J    temperature=temp*0.0625;. D2 ^6 n" z" O1 ]; ]5 s
    temp>>=4;
$ t  s0 m0 u3 e    if(temp>tempH)
5 C# z1 i* V1 q, `% }     {
! y! G+ G) [) j, B: }! m- U. ?        TempFlag=1;  //高于高温标志
/ N! `; R2 Y) L, f7 o. E                ET2=0;6 P4 g8 q! E6 v, h  I: C; [
     }" n& f  _+ K9 e9 I
    else if(temp<tempL)( c( B" K5 m0 S6 P% M+ ?9 L8 q
     {
& o* U) E- [; b3 X. `! O. P: G        TempFlag=2;  //低于低温标志
+ a9 T' w( ?" C" F  q, _                ET2=0          ;8 j" {4 O; \% P6 p
     }
$ z7 f( p/ c6 H/ @2 {    else
8 ?4 M+ _# {/ b1 x0 ^5 E& {     {
9 t/ H. [  G- ]  ]+ x2 y       TempFlag=0;   //正常显示标志
1 B6 p" ]5 j* O6 {3 x8 c1 N           if(temp>tempH-1)
0 G. [' H( B/ I7 c4 ]3 n            T2csh();
$ }2 R6 m, g4 X+ ?) }0 O: v4 [$ y     }6 h9 l) |, I7 {+ ^8 V6 ~  z
     sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值
: v% `/ P$ o8 I$ H: O3 `     LCD_Write_String(0,0,displaytemp);//显示第一行
' q; C( Y9 K, U2 u8 A/ @; S     LCD_Write_Char(13,0,0x01);//写入温度右上角点
# s; H. b. I7 C1 f     LCD_Write_Char(14,0,'C'); //写入字符C( |  E  ^( H' U, ~
  }        
) h" b+ e  Q/ [+ b/ h9 b2 N8 J; `: x. m( R& O
}' v1 F8 y6 n' V) E* I
}
, m2 L2 J3 _7 A: V. U* A( N/ y/*------------------------------------------------
3 I# b0 e- B3 R. x) }; ]                    定时器初始化子程序! Q0 R$ ?  d* }  g, ?* ~$ M
------------------------------------------------*/
4 Q5 c, O. d, g" j) U! N# y+ _void Init_Timer0(void)+ f6 c9 k; F. A) K$ r9 M
{
7 [/ O1 g+ N1 J. ]0 Y  E7 z. O TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
4 O; h/ _% Y' h% N; N  H //TH0=0x00;              //给定初值) V! S  Q: d7 n. y
//TL0=0x00;5 a4 n5 a1 V8 Y1 O4 `7 _! r  O) ]3 V
EA=1;            //总中断打开
- }* }" z3 L6 a# w  R* Y# o& d4 J ET0=1;           //定时器中断打开
0 W6 G7 ~8 l2 e) i TR0=1;           //定时器开关打开+ U$ ^/ K- ?: i% D- A1 ~$ u1 u
}
$ Z7 a* A" D/ p8 `6 Q5 H6 G7 H* h/*------------------------------------------------
' O& Z2 a+ O* D                 定时器中断子程序7 a0 E( F9 [) @2 u  ^
------------------------------------------------*/
1 d% r$ s# _/ v! i9 u: B4 `* Jvoid Timer0_isr(void) interrupt 1
$ b! ~0 F. M2 |* l: a{; I7 h7 d7 v0 K$ C5 e+ j
static unsigned int num;$ ]' g! L% h3 b' n9 c5 `
TH0=(65536-2000)/256;                  //重新赋值 2ms
7 {  f3 t, C; k6 {6 H5 _ TL0=(65536-2000)%256;
  p$ k5 B* c: u+ w! E: @ num++;5 L0 P3 q3 D+ P0 E$ X: j
if(num==400)        //
3 i) Z/ @9 V" J) l% [" n   {5 e! p/ I7 E. X; x8 ?
    num=0;
0 l0 m" z" g; @% ]; S2 G2 n4 W) I* P    ReadTempFlag=1; //读标志位置1& o$ }, k( Q/ I; c
        }
! j9 p6 q' j: Y/ ~/ g3 n}( P1 t9 \( _+ z3 B" g' w$ z
/*------------------------------------------------
- a" L. I8 u% L8 f按键扫描函数,返回扫描键值
4 N1 L  `% e4 u+ ^; T4 A+ A------------------------------------------------*/; ~% w! G. B8 V; q
unsigned char KeyScan(void)
1 C4 ]9 o# {# H{
4 l' W7 Z$ F/ X% F. l9 W unsigned char keyvalue;
/ |# D6 Z$ H9 U if(KeyPort!=0xff)5 Q$ `: Z+ c" Z3 v% G: ~# T
   {: ]- l5 b% Y0 B- h/ k: g
    DelayMs(10);* `# G5 W  p% d3 h4 d
    if(KeyPort!=0xff). j% ^9 Q+ P% Z3 _; }: M3 i
           {
3 Y4 U, o' w/ m6 Z8 ]            keyvalue=KeyPort;
/ ~( N% k6 P3 y/ i* I" b2 n            while(KeyPort!=0xff);
" G2 i+ V! o$ Z                switch(keyvalue)+ i3 Q" `3 S) f  y2 }( c: [
                {
* F8 ^' _7 `7 w. R0 c4 K8 r' D1 J                 case 0xfe:return 1;break;
) Q2 t) r3 r5 I3 X. P3 x3 n                 case 0xfd:return 2;break;: y& T& F) T& I* V) x" d5 i
                 case 0xfb:return 3;break;
2 t( n# I) K- a& r& l$ S' _0 e                 case 0xf7:return 4;break;
6 W) j+ Y/ L5 `6 ~& p                 case 0xef:return 5;break;
3 R  V7 x) F5 A9 @5 [                 case 0xdf:return 6;break;
$ L3 Z1 W7 p! h/ ^: q: h) q                 case 0xbf:return 7;break;' n, I& k5 o( B$ V9 _3 W
                 case 0x7f:return 8;break;
8 g6 p% j1 v% \+ U" p' @                 default:return 0;break;8 \9 x( P! a" Z, p
                }
( z% n) j+ `3 E. W2 f          }
- @- D. e1 b5 q" R8 W- z   }
! ]+ T. F" F% J5 {: c* D) P4 ~& g# P2 m   return 0;7 s2 w8 F5 c3 u8 N: E- G7 e
}
, s6 Q5 r: z+ J$ p: f1 Y" z2 Z. k//定时器2中断* B& g9 V* a; n' K+ g2 w4 C
timer2() interrupt 5  
; J; k8 C* U" y4 G{
  a3 z2 W: m/ B2 n8 M static uchar t;
: G/ m8 ~) W4 V7 L6 W4 Y9 M8 q% l TF2=0;# J) B7 P4 C( m1 y- v& u
t++; 6 D7 n2 {4 A1 L& t  _
if(t==20) //溢出20次就是1秒钟,晶振12Mhz
: H9 S; |  M9 u8 b, n6 Q( A {
! k; g3 v/ r: d) b5 R  t=0;
# U+ C" V5 u0 b+ |! D5 B- i  P10=~P10; //反转LED灯的亮灭6 P7 g7 S6 M* o/ [7 [3 u% A
}$ J2 t" [5 N3 c3 l1 e, [' [" N% \
}' R. ~" {# z1 x" s0 R. i3 ]: Q" k

- Q3 }' q* r7 |. C" Z' X* r/ L' m& a4 J5 s+ ^" q( }3 S
完整源码下载:7 f, ]7 p# g2 q" Q  L$ [
游客,如果您要查看本帖隐藏内容请回复
$ ]" x9 ]5 M' y9 ]0 B) J% a9 D
2 z# s3 W2 h4 u

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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