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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
DS18b20温度可调上下限1602液晶显示程序
% b: H6 F" s' @( x5 Z6 j4 `$ x1 I3 B
! I. i+ [* Q' @
/*-----------------------------------------------. G; l* R: T  S% i7 \) U
  名称:DS18b20 温度检测液晶显示; C5 f, {8 u/ G6 K( K# W$ C% o% P
  内容:
+ ?% I2 f- p# o2 M0 K------------------------------------------------*/5 O+ w; V+ ^3 Q6 D: u& l
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/ P9 x; M5 k6 }$ H& M" N#include<stdio.h>
( }2 _, F5 u! y% ~: K/ s+ \; z4 P5 l#include "18b20.h") h6 v6 \) u; N9 G4 \$ @; v' E9 x$ y: h
#include "1602.h"8 C4 h# N0 ~; l9 ?8 Z) o
#include "delay.h"* q+ _+ A4 n. C8 Y  [" S
#define KeyPort P3 //定义按键端口. h4 V  n$ A( J/ D) Y

) x+ D) P2 m' a* h" {bit ReadTempFlag;//定义读时间标志
. z6 a" A( L* B3 Osbit P2_0=P2^0;4 H& s% `; F) q
sbit P2_1=P2^1;
( r  r, _' z: o/ E/ V+ wsbit P2_2=P2^2;
5 W/ Q( k: L/ n/ hsbit P1_7=P1^7;         //定义电机输出端口9 c  \' ~9 K* g& o
sbit P10=P1^0;
6 e: ~& B4 o6 \sbit SPK =P1^1;
8 r, z! ^1 L* K6 dunsigned char frq; # m  h/ J( \* ?* `# P
void Init_Timer0(void);//定时器初始化
- {( A* s6 ?0 ^+ L* rvoid T2csh(void)  //定时器T2初始化4 X/ L: z8 U- h; L" J* w
{
3 y" v* r1 m3 ?, U6 h+ j RCAP2H=0xff; //TH2初值
4 T1 ?" j/ W: A8 U/ K RCAP2L=0xee; //TL2初值 + G9 F. c* `1 F: l% ]* b! v
( ~, i% e: C. U
TR2=1;   //启动定 时器+ A6 o; I$ W" x! S& j
ET2=1;    //打开定时器2中断: e; o, p8 ?4 W9 h2 X
//EA=1;     //打开总中断
5 k. v# f5 [; X4 E- w6 p" r& [}  T9 U& a+ o! r1 Z" f
unsigned char KeyScan(void);//键盘扫描" Q# G7 W0 |6 q2 [9 Q7 L
/*------------------------------------------------0 ?5 o) k! G8 e9 A2 r0 Y
              串口通讯初始化: P% w' Y# L4 J( J
------------------------------------------------*/& ]! b  Q) c  G. X9 w- x$ K4 a
void UART_Init(void)* r$ P& L( }# l8 ]% m+ C
{
9 Z  n, S" D8 K7 j1 {    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  ) ^! @% o" _( r& W% R. O- }. m  e
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
; F  E" D# h4 c7 [# b' e$ b+ W. d    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
0 C& z! Q+ C7 r6 f0 b    TR1   = 1;                  // TR1:  timer 1 打开                         7 b4 r6 Z. M+ d- j
    //EA    = 1;                  //打开总中断
/ M9 \/ s2 m& A) S) N2 w; t    //ES    = 1;                  //打开串口中断
! r; f6 `$ E) i: |0 K/ }( c        TI=1;( D/ \0 |" i9 }; _2 j5 A
}% {8 t; X) e$ p/ h8 o8 K
/*------------------------------------------------5 S, S; O; A7 z( t. j8 Q
                    主函数
: N3 _; X4 S. H------------------------------------------------*/( i0 S$ u' J* l! ]" g7 |6 J/ a8 U% O
void main (void)$ @7 {1 g9 F) }2 s- e! ?
{                  - c" Q/ J' |7 Q
int temp,tempH=18,tempL=15;: }4 q9 ?8 L9 `* ^
float temperature;
; ~5 @. G" W! `: Ounsigned char TempFlag=0;) G% Y- K8 T- e* K; R# n0 h& M* n
char displaytemp[16],num;//定义显示区域临时存储数组
% f; Q4 q0 l8 vLCD_Init();           //初始化液晶
6 {& q9 |4 \, _1 ZDelayMs(20);          //延时有助于稳定+ R5 V( p- M9 c+ K1 `
LCD_Clear();          //清屏
9 Y/ \0 r+ m0 C" OInit_Timer0();
" Y5 \' D1 m& L( V, xUART_Init();
) Q/ }0 Y8 Q: m% VLcd_User_Chr();       //写入自定义字符
* c: i: |3 J) r3 G0 \! M* u3 ], I. W6 P
while (1)         //主循环
' r, I, @0 m, l+ b% x/ s4 U  {
: C( z; m- {: y4 u3 ?. o5 g5 {" H! E num=KeyScan();& T2 S) D( t$ w2 L' E/ r) Y/ K9 L
switch(num)
2 h9 u+ `# c) m. P( m  K" @3 g3 ^. p       {
2 B$ F  X- e' n            case 1:if(tempH<127)tempH++;break;  X" Z, U& _  Z
                case 2:if(tempH>-55)tempH--;break;6 g  S0 u9 K2 t+ A* {
                case 3:if(tempL<127)tempL++;break;6 K4 ?7 t$ V4 l& P3 l
                case 4:if(tempL>-55)tempL--;break;
, D+ d. c( f+ `# d% ^1 h                default:break;
" a) P/ y4 O, o4 s           }
( h; V2 W( ^0 F/ Cswitch(TempFlag)                                                                                                                                                                                                                                                                       % N5 R6 o+ W" Q6 v" A1 u4 ^
       {
* \- E% M* ?+ a9 R! ~7 w            case 0:    //输出温度上限下限3 \5 _9 W2 v, i0 g" X( _
                    {/ V1 H5 W% C% g( y& \( y
                      sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);- n' B1 A; H" d% X0 T
              LCD_Write_String(0,1,displaytemp);        P2_0=02_2=12_1=1; P1_7=0;
* s& s# g2 ?4 O7 I+ _% w5 d8 f                          break;
# t$ o+ a1 r( a0 c/ C) d+ O                    }
/ U- e! }5 D2 t, S9 |4 w+ b$ I                case 1CD_Write_String(0,1,"over  tempH    ") 2_1=0;P2_0=1;P2_2=1;P1_7=1; . _1 G- Z- q( O2 o% i5 ]
                       break;5 x7 I; @& G3 b- x# R
                case 2CD_Write_String(0,1,"under  tempL   "); P2_2=0;P2_0=1;P2_1=1;P1_7=0;    _7 M% l$ Z; P% s
                      break;. m: `( Z% N$ G: ]9 ]1 T
                default:break;* t9 \- K8 a" F, b1 L
           }
4 k) K2 m! J2 w- e" Q8 r& p1 pif(ReadTempFlag==1)  n, q3 p, `, s7 P4 O# C
{
1 p% ?' J4 T  ]    ReadTempFlag=0;  }) @0 N5 W1 `8 _& B/ ~( Z
    temp=ReadTemperature();
4 j0 T3 L  R7 A5 ]' J6 S% t0 X/ k& r$ g7 N
    temperature=temp*0.0625;6 e) I* ^* p8 m+ F2 P. X
    temp>>=4;
$ S& k4 u: k6 ^, T; e2 y    if(temp>tempH)& n1 @! N6 c3 ]4 J" m
     {
: z2 I3 J6 J( S2 |3 {        TempFlag=1;  //高于高温标志; j3 }* s& |; p/ i- S( y  Q! A
                ET2=0;
: O/ U5 X- k- k1 V) t     }3 H2 `: f, F9 y, E" x
    else if(temp<tempL)
8 ]' X* W% d0 J9 v) d' W     {8 k9 `/ }- n  s- C
        TempFlag=2;  //低于低温标志; q  |* ?4 i. @( H* Y. N8 X
                ET2=0          ;( k2 ]# _8 E9 a; o
     }
1 V9 |4 k8 w; G) L, l" w1 ?! {    else2 u- R& Y% E! b* d" m  ^
     {
& [6 J$ w& Y, K8 b       TempFlag=0;   //正常显示标志9 t5 @$ `9 @% p/ g* S
           if(temp>tempH-1)+ N) U, n# v' H% v0 P
            T2csh();' A2 G' |" O8 u
     }
  ^, {" k+ q) q" i     sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值' \' w' w0 \5 L
     LCD_Write_String(0,0,displaytemp);//显示第一行9 S, T* w& p9 K7 Y5 x
     LCD_Write_Char(13,0,0x01);//写入温度右上角点5 t% s7 |; J# l# B6 ?1 v, V
     LCD_Write_Char(14,0,'C'); //写入字符C4 g2 }1 f! Z1 x$ Y
  }        
9 P) L3 B$ w4 m; h7 U1 [. y5 a7 K2 ?4 p4 r4 j
}
# s! B- p0 h% ^7 ?8 l2 j}6 c) `& n! B3 K
/*------------------------------------------------8 _: x% k) d$ o5 Q' H( y% d. H
                    定时器初始化子程序
5 D" L$ O5 d4 f  }! K, `. X, k------------------------------------------------*/$ u3 m: S$ X1 ^: b+ g2 z# m
void Init_Timer0(void)
& ?* B, [% q! y& v: s# k{
3 a+ k5 U0 s* [5 ?5 R( r TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
/ z7 L. Q( H  ]. v //TH0=0x00;              //给定初值
; t$ K1 ^5 r/ F" J" b5 { //TL0=0x00;  f  b7 g/ \! o
EA=1;            //总中断打开
0 h0 r1 j4 W# e! h) t9 X5 P( J ET0=1;           //定时器中断打开
, C! m9 r: m; @3 K# j  g: z TR0=1;           //定时器开关打开
/ J. e! h" f/ q}
4 Q# M- E+ D( F( a; P$ g8 X/*------------------------------------------------2 F8 U1 x, u+ H2 l( d( c
                 定时器中断子程序
/ Y8 M- l9 ^, Z3 f------------------------------------------------*/5 S, x3 N! U- F3 A+ k( I
void Timer0_isr(void) interrupt 1 * e" v/ U. ?: d6 g
{) H2 s6 h; G( f4 L
static unsigned int num;
. x7 {, H+ c& a TH0=(65536-2000)/256;                  //重新赋值 2ms
# N7 J: F  n0 y2 A TL0=(65536-2000)%256;  n3 I$ g. V5 N& ]5 E
num++;
$ `4 Y. r0 S2 e( }+ E6 N if(num==400)        //
3 r3 Y' Y' q# _) i* m$ y$ q2 r   {8 s2 ]) D* D6 R" E. B- h. b
    num=0;
: X: X; o! w( ?7 D/ I  @    ReadTempFlag=1; //读标志位置1
2 r5 }  b8 V+ L/ D2 `( K        }" M7 z& B$ d" g( }2 m" R
}
- j( ?1 }# h) `- v$ @. ~4 z/*------------------------------------------------
4 z; ~$ V  Q3 d  J- e- ^5 f按键扫描函数,返回扫描键值  f9 N4 Y7 r  N& Z1 }% R( j
------------------------------------------------*/2 j. @  z( j& V' D( W0 d& k
unsigned char KeyScan(void)6 l6 E) k9 G0 f* U- y$ c  x
{
+ P- b2 b% ]( ?8 w, Y( x" w- c% S unsigned char keyvalue;
' v, D7 P/ Q& Y' `3 @- G if(KeyPort!=0xff)7 M; p& P: W% {9 f" P* r
   {' ], O1 }; H% V1 M/ y
    DelayMs(10);  [7 M6 Z1 q" i3 A# q! @* n
    if(KeyPort!=0xff)) p8 E( M( k( q8 T* ^3 s
           {. d5 j4 G' \4 {5 C. i" _# x
            keyvalue=KeyPort;1 A# `( l, Z8 A7 }
            while(KeyPort!=0xff);
4 m) C/ W2 l9 W  w! D" R, E& ]8 M                switch(keyvalue)
- E4 Z5 {" ~" f                {
( E5 p' l, z/ B9 U5 o                 case 0xfe:return 1;break;
3 u: C0 `# U9 ]5 {                 case 0xfd:return 2;break;
; {- _/ z8 _% m# |                 case 0xfb:return 3;break;
" e2 X% J9 a& F8 ^8 H% ~6 r" i2 c  d                 case 0xf7:return 4;break;
/ e6 y) b1 W; R4 r# A                 case 0xef:return 5;break;, ~$ L1 J$ Q* {
                 case 0xdf:return 6;break;
. y1 w/ r& }9 S4 y8 f# Q# E6 n                 case 0xbf:return 7;break;& X" K+ d# J8 b3 V: p
                 case 0x7f:return 8;break;
8 I: |, g& Y  q* }; B' V1 U                 default:return 0;break;
' ]' s& f( v6 g  g; G& u) E                }6 H3 [) i! b& _1 k: {) m% K* A0 A
          }) ]/ B" e4 c; H" R
   }
& w3 ^( r, n/ Q5 N8 E   return 0;
- k& ~2 T, u) Y9 l' x& ?3 q% ?; M}  i4 i+ ]( ^" g9 `- q6 j2 `5 Q
//定时器2中断+ R& l9 j0 v0 U
timer2() interrupt 5  
. ^- Z1 h9 P$ ?6 i8 F{; J( @' |. Z" ~4 P5 f. L
static uchar t;2 _) ?% j3 V* u0 f& H5 D- Y5 x
TF2=0;& W# B* S9 K( \8 C
t++;
( I7 N, p* B1 d- `" v if(t==20) //溢出20次就是1秒钟,晶振12Mhz) g7 @2 |6 {8 }+ C% v
{: m  i: [9 Q2 ^6 g& h
  t=0;
! G- I" _* a+ b+ l) r; o1 [% T. s  P10=~P10; //反转LED灯的亮灭
  k' @3 O+ @6 S9 Q }
/ S! |$ ?4 V4 C; s" E}7 ?) {5 z3 Z' p( a6 U

( Q* t0 {3 n6 I7 n) I! g
8 O( F. {( H6 e0 H5 ]) `' k8 W完整源码下载:
' L  r7 \0 ~+ H$ A. p( ]* K! s
游客,如果您要查看本帖隐藏内容请回复

# o2 M; {* t& i2 p9 r. t: B6 v4 F( c4 @* v1 h

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-28 20:32 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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