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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
DS18b20温度可调上下限1602液晶显示程序: O6 o: e0 O6 b4 h

& F2 M  S# L+ s0 n8 E8 y( Y+ J
) C) _3 `# E4 u0 O* ]0 d/*-----------------------------------------------: O  Y" g  h' C! w
  名称:DS18b20 温度检测液晶显示
# Y1 u* E! X& h  \1 A: Q  内容:
; X2 I. q4 K: z' u. @- I------------------------------------------------*/$ [$ f7 W( s9 u* U$ y0 B, d9 p
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
; {2 G+ l& w6 Z; l#include<stdio.h>9 ?' b+ P0 p8 r) U7 T: r& t
#include "18b20.h"2 V( T# P3 ?9 p
#include "1602.h"
, T3 D$ \1 b2 _! K) @7 O3 f#include "delay.h"6 M- E8 J$ w2 K1 A( g, I
#define KeyPort P3 //定义按键端口
. b# A. j7 s( E  |3 t& Y; q! [6 |  S7 E- P1 m7 D- O4 Z
bit ReadTempFlag;//定义读时间标志
# K. ]; N/ `4 s3 H: j) L6 Rsbit P2_0=P2^0;
5 G) ~, }1 E8 Z! J% Y, ~( `sbit P2_1=P2^1;3 B" q- ]. }/ k! H$ t9 S  h- N* l
sbit P2_2=P2^2;
' X2 u* d: |7 M6 K7 ysbit P1_7=P1^7;         //定义电机输出端口
7 m& n+ s, Z, ?$ ]% d/ Q$ Psbit P10=P1^0;8 ]  z  W3 S1 `4 x# \1 K+ P- j
sbit SPK =P1^1;8 Z$ S" D. Z! `( N# L$ H- r+ D+ j4 D
unsigned char frq; % ~' W  x! N. t8 l6 K! d
void Init_Timer0(void);//定时器初始化
  e5 _; Q: B4 ~void T2csh(void)  //定时器T2初始化( ~) o5 w9 N9 b9 j4 c
{
) I' C, ?9 c' v! U% C RCAP2H=0xff; //TH2初值 : X8 L6 U* R! ^0 S% @3 J7 A! O3 T8 a
RCAP2L=0xee; //TL2初值
% H- ?" y+ p8 l3 k
/ |3 h$ r8 t; z3 Z3 A7 S TR2=1;   //启动定 时器; t( t% D8 y% z, k
ET2=1;    //打开定时器2中断
* L/ K/ A6 H" b1 b //EA=1;     //打开总中断 & ~2 D. R* V& r1 L) L4 G2 Z$ Z" b
}' o! J% z3 X7 {- d
unsigned char KeyScan(void);//键盘扫描* \+ S0 r+ e8 E% {. I2 w
/*------------------------------------------------
4 v8 }; j* \/ b$ k7 R( G              串口通讯初始化' U+ N8 m  c4 g9 D# M0 }
------------------------------------------------*/) s, X7 R1 L+ _
void UART_Init(void)
( ]! D  a3 D/ N{$ a4 G' X& c& I3 T5 B  i- q
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
& P* E; ^. M: G  k! D, D    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
' c2 l! d, K# J' F2 j    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
) V- H2 M" n# w3 ]3 D    TR1   = 1;                  // TR1:  timer 1 打开                         ) o5 E* v1 [" h$ x
    //EA    = 1;                  //打开总中断2 j  d' h. H8 D9 C- f' m* g4 H' U
    //ES    = 1;                  //打开串口中断
. M9 ?% u& z5 u" `        TI=1;
: B* s6 {5 K0 D: [% P}3 \6 S$ r* n9 P7 s% i$ T) p
/*------------------------------------------------& b& h; U: y8 o- M7 U
                    主函数& \: L5 @! z8 a5 P7 ^0 _
------------------------------------------------*/
9 }% T* B, T: l/ Lvoid main (void)
' r3 M3 `  i) O9 i1 y% I{                  3 \8 ]. M8 i' `
int temp,tempH=18,tempL=15;* J9 F  _3 w3 M$ Y
float temperature;
$ Z0 a8 j8 n! x# w( punsigned char TempFlag=0;) `+ @; }6 b1 c% E4 [
char displaytemp[16],num;//定义显示区域临时存储数组$ K. y0 n" w/ q* K% n
LCD_Init();           //初始化液晶
  {  B. i# k6 k, m1 T) pDelayMs(20);          //延时有助于稳定8 K# n5 G6 W9 ~& n# S0 P& r
LCD_Clear();          //清屏( k" ~1 M( X" V* q- t9 M% {
Init_Timer0();. ^- [) O  S; _4 X5 \+ y( l
UART_Init();
2 N# y) `; t" ELcd_User_Chr();       //写入自定义字符
& L; o8 b% H' A6 U- K( H1 K8 W) f" w( b' l
while (1)         //主循环
* X5 R8 U2 O# \+ z0 g( ~3 Z& U  {, I: R( c; S" a/ S7 K
num=KeyScan();3 A# J5 d6 ^* ?. i! g) M; k
switch(num)3 @6 ^+ o/ S- X3 y; v9 E& v
       {
, R/ v* B0 h+ |# z) z  V9 X            case 1:if(tempH<127)tempH++;break;
* p2 I& P, t3 m                case 2:if(tempH>-55)tempH--;break;/ H. `( h* U$ c! V) r1 B7 |, ?! D
                case 3:if(tempL<127)tempL++;break;6 \) T" q! b. ~9 O: y" w  [+ G
                case 4:if(tempL>-55)tempL--;break;
* a  _& ?1 ?& c" U                default:break;
9 X" S& _- c$ V4 P) H+ M4 L' C, t5 C           }
' O1 m4 Q$ U& _- @1 nswitch(TempFlag)                                                                                                                                                                                                                                                                       9 N$ u2 S: n- i
       {: k% S& |! r) ]' O
            case 0:    //输出温度上限下限% O$ G  ]# i' E- E. d5 M
                    {
' j- W8 V/ G" w: C1 T4 O$ o+ H3 @                      sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);
% F9 s0 n) I- m' v  a( w              LCD_Write_String(0,1,displaytemp);        P2_0=02_2=12_1=1; P1_7=0; 8 l0 T1 ^# w8 C6 z
                          break;
! o" \4 R8 M3 {8 B, _. z; Z                    }
+ E- Z9 N  _3 {! e* H4 |& c                case 1CD_Write_String(0,1,"over  tempH    ") 2_1=0;P2_0=1;P2_2=1;P1_7=1;
  ^8 E8 S3 X0 M                       break;
0 h8 z. z$ R' y4 K& k% [                case 2CD_Write_String(0,1,"under  tempL   "); P2_2=0;P2_0=1;P2_1=1;P1_7=0;  ! R. W! Z- j* }$ b7 A
                      break;
& d' T) E( t# ^/ |; B) B% y! j: O                default:break;
4 Q% L2 X- \: @+ h+ C7 O           }/ X7 Y8 l$ i% p, R' ?
if(ReadTempFlag==1)
6 ~) C$ a: b6 w: l- a {
2 |5 v3 H) }. V) b6 f    ReadTempFlag=0;
% e  U" x+ k) Y0 g    temp=ReadTemperature();
  ^2 U+ Z( t/ o% G6 f+ _0 d) F3 c9 i+ A; k- {+ `
    temperature=temp*0.0625;
( O  T2 o/ y+ M  g& [1 K' b$ n    temp>>=4;
' p5 O: N& l$ _: u4 A8 C    if(temp>tempH)
/ _0 `9 A7 v: J$ ]" f7 s, c, A7 ^     {9 g& ~2 k& W; i4 {6 G# D
        TempFlag=1;  //高于高温标志$ k+ s6 \5 c: I2 l- K7 N
                ET2=0;( w# u2 k& J, N" e0 J% }+ d$ M$ e
     }
* R! y4 j8 }/ W! H7 Z& I  h    else if(temp<tempL)' _9 H  X& y9 H6 {* _2 L+ _
     {5 \4 {% h1 I0 ]) r- |& F! V
        TempFlag=2;  //低于低温标志1 `" r' Y+ B' n! p* c% @3 Z2 ^
                ET2=0          ;4 X! {1 U# [0 K  ~
     }5 x& J2 H  P2 Y
    else
; S: V4 N/ ]+ Z7 V3 q9 i) j  x     {6 H. q1 Q$ c' x2 \5 W
       TempFlag=0;   //正常显示标志0 B1 O- d) Y3 W. u4 a
           if(temp>tempH-1)  B9 j, \% d; R) q: G: n
            T2csh();
9 |$ F2 g: J0 n3 i' b     }
8 }2 J( X' D' @6 B" _' |     sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值
1 K/ d; y3 e3 M( I, u1 e/ p     LCD_Write_String(0,0,displaytemp);//显示第一行+ }, p; r1 \9 o. O
     LCD_Write_Char(13,0,0x01);//写入温度右上角点6 W2 G& H) `. F. i7 P
     LCD_Write_Char(14,0,'C'); //写入字符C
4 H1 R( o, N% c1 k7 M1 u  }        1 J7 B' L* G( V3 L
2 v2 O# W" i  H$ c/ o2 N" a
}. Y5 c7 `/ z: P- H1 O8 Z) Q
}
5 ]4 n  ^% z7 Z1 o0 A, I  \$ C- @/*------------------------------------------------
: T& ]* W& R: ]9 y1 s                    定时器初始化子程序
& J6 t- q8 f6 {' i! \. v------------------------------------------------*/
" Q- _4 [' k8 G$ }* rvoid Init_Timer0(void), C1 ]/ W/ _$ p
{8 Y8 d1 {8 t( M
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
- u+ E# R3 K( }! ~2 q //TH0=0x00;              //给定初值
# ?# N: }" {7 S! O8 r0 d //TL0=0x00;
* m* L5 R) e' O; { EA=1;            //总中断打开: V+ t  U! d3 U; b! n3 _  b
ET0=1;           //定时器中断打开
  V! Y# z& o9 A9 i3 S TR0=1;           //定时器开关打开4 I. M' n( e3 o
}% |1 M$ \9 Z* W$ D
/*------------------------------------------------
: |8 f* _( l2 G                 定时器中断子程序' e  k! [6 H* G7 K  `+ b5 w
------------------------------------------------*/& g, t5 C# l$ @. t
void Timer0_isr(void) interrupt 1 4 T- {1 i4 C/ F( U$ U0 {7 J& ~
{
$ i' G+ M1 M( y% r: c% m8 V1 n( _1 w static unsigned int num;
, H4 \% T  l% N& | TH0=(65536-2000)/256;                  //重新赋值 2ms6 c5 {. N6 s2 k3 Z  d; ^
TL0=(65536-2000)%256;
& W5 w. \$ j; B4 `6 j8 j9 F num++;
: U1 d% J9 |* I* J4 ?; ^ if(num==400)        //
8 t3 A! R' ^4 Y' _* r- T8 }$ M5 p/ x4 O   {! h5 w/ F  @, X, X" W
    num=0;
4 f7 l# s) Z2 A6 k    ReadTempFlag=1; //读标志位置1
2 R# R5 s* N7 ^6 Z- a4 h        }
" c1 V5 h+ r% o  j, D) {6 Z}& g: F- ]2 v* o% O( T
/*------------------------------------------------# H; B. M! g9 z; s% ~1 Z( \. G5 H
按键扫描函数,返回扫描键值
/ V4 w/ S, R# t5 w- u1 g9 o------------------------------------------------*/  Y/ }! ~5 ?5 C1 }: V
unsigned char KeyScan(void)$ W! {8 @3 B0 ~8 ^' c, V) ?
{
& S) K; n) W7 X! @' @ unsigned char keyvalue;3 w+ r6 }$ d3 H- F! ~
if(KeyPort!=0xff)
5 H( S* Z0 m+ V! h& s' j  d& e   {
* T3 l" s  I" j+ T. ], N    DelayMs(10);) l: e4 ^/ A" A5 b' z
    if(KeyPort!=0xff)" s9 z& }% }: m$ S. k
           {2 @2 H# _1 `# U+ x
            keyvalue=KeyPort;! g( e. l  T! |2 \% d
            while(KeyPort!=0xff);- O3 ~; F( U" L  s, v
                switch(keyvalue)
' A. V% R" Q( N; B7 D! f. ?8 U                {, `3 }0 h4 ^/ A9 ~) `; ]7 v
                 case 0xfe:return 1;break;7 h- _  K2 F: z) P
                 case 0xfd:return 2;break;
: d3 m! Z6 w0 D* M4 ^3 g; L  T                 case 0xfb:return 3;break;8 W0 |: Q5 y, S( L5 ^0 i3 B. k; F
                 case 0xf7:return 4;break;3 H! v  |* m& n' J/ v# X! v
                 case 0xef:return 5;break;& I+ W0 f9 P+ _
                 case 0xdf:return 6;break;
4 x- s" n1 c, _) o9 H* [                 case 0xbf:return 7;break;4 I+ ?3 w9 M# E* q/ g
                 case 0x7f:return 8;break;
! _# T2 s0 V( X2 o5 w                 default:return 0;break;
4 o4 K) \$ V2 d/ K$ _                }
* b" {- n8 I* R          }& b1 J( `  r) ]! e
   }
! x1 B. M- r/ L- ~& B* T7 y! |   return 0;$ h3 E/ N& {1 v; Y7 @: F
}) L6 N& `. e" Q% ~, v
//定时器2中断
. j9 [3 P7 B/ r! Ktimer2() interrupt 5  . J. j: `7 }. d
{
5 i( I' G6 }9 |9 A static uchar t;
* [& j- A% w, I, I TF2=0;( s5 z5 j) _7 W3 Z+ |# j, o3 w
t++;
2 I% y% q% A; g, v5 y if(t==20) //溢出20次就是1秒钟,晶振12Mhz' N) i5 G1 l8 Z+ y- W) L% p3 O
{
# j2 r" t( j  ]4 N  t=0;0 Q+ o- D+ [6 E7 T  q( K
  P10=~P10; //反转LED灯的亮灭) ^7 p  @( s& c
}
% J3 n) E4 F! w6 Y2 D/ _5 Z+ }}  F; {  ~9 g2 ^, |/ O. T/ q

- _. z+ H/ N9 p) H8 N
% k  m+ N+ F8 y" C# d# L完整源码下载:! o$ y. Y0 c# F, s
游客,如果您要查看本帖隐藏内容请回复
% ^6 N% c$ z; n4 ^4 d4 Z# I

2 m$ f4 e9 s+ a

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-29 09:16 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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