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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
DS18b20温度可调上下限1602液晶显示程序6 I6 G" U$ V3 o  U
: _* @8 A' |9 H  l1 s3 P4 g. i& A
; t; ?1 c5 P! B! O: l
/*-----------------------------------------------0 [0 x2 N/ _# `2 |, Z- B
  名称:DS18b20 温度检测液晶显示
1 O$ f- y7 e0 Z9 o9 \/ i  内容:
- g/ t3 P. ^- v( \------------------------------------------------*/
- S0 }7 n# x# b: g9 w#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
9 y0 O+ l2 y6 S+ `8 Y#include<stdio.h>) r" f3 H- }% t7 W  X
#include "18b20.h"/ H% I- w* A" l; u- C" p4 j2 K
#include "1602.h"; Q( T, o' P5 _' V: D. q
#include "delay.h". M6 e& c% a1 w* v" `8 O. e
#define KeyPort P3 //定义按键端口6 g" L) F! n! `! y- r

+ l( I! W: [5 L% @  o" J0 Z+ xbit ReadTempFlag;//定义读时间标志" N+ S. z  i% r+ l. x" v# q
sbit P2_0=P2^0;$ n3 ~4 v. R' h
sbit P2_1=P2^1;" K: i* g' i+ }* t8 i- D4 S
sbit P2_2=P2^2;% d. w+ Y% J8 h9 M' f# F+ _4 x) t
sbit P1_7=P1^7;         //定义电机输出端口
0 ]6 r+ |. i* {# E8 D4 I2 |0 s. Msbit P10=P1^0;& s) D5 O! A: Y' r% L: N
sbit SPK =P1^1;
, S$ k" s9 q9 c! Iunsigned char frq; 4 ~. Q" L% s. B& Q4 W' B4 p
void Init_Timer0(void);//定时器初始化1 Y5 e; m& Y0 Z' q* }; ?8 I
void T2csh(void)  //定时器T2初始化
6 a" C2 {( }" n{; H& W, _! j6 g8 {" O4 y
RCAP2H=0xff; //TH2初值 / ~& j3 a, ~: G2 L0 x# x8 G
RCAP2L=0xee; //TL2初值 : |3 o, `6 f7 g; ]6 p8 o. V) j
$ ]: U4 B$ O/ A+ \$ y, e. }8 e2 O0 i
TR2=1;   //启动定 时器* g- B1 T5 Q4 Q( k+ Z
ET2=1;    //打开定时器2中断
! ^4 a5 N. A. e# M //EA=1;     //打开总中断
$ s  [7 F4 F; C}& {+ z9 n3 X! I: p2 F' e
unsigned char KeyScan(void);//键盘扫描
/ @, P0 K2 S% W8 l- Y0 ]/*------------------------------------------------
# j) |! Z. g: j! F0 m              串口通讯初始化
  M, ?" P5 V8 o------------------------------------------------*/
5 Y" L1 g1 @) Z3 a+ f& M, ]void UART_Init(void)
1 V" R; B9 T/ |! B& o{
) m8 x$ h1 A4 u6 V  q3 j, n) e    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
) w5 V; j8 o$ O/ L& O2 r  a: c    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装: }% p. |# {* j% p9 n8 ]3 v
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
1 m: F8 M% T4 C9 j5 S6 |    TR1   = 1;                  // TR1:  timer 1 打开                         * W* z* T* L. G
    //EA    = 1;                  //打开总中断
, W8 E2 q$ i) i4 b! V( S0 O' M    //ES    = 1;                  //打开串口中断5 O3 V7 [: W! Z2 |4 r  a2 U
        TI=1;
+ M& r- L( A0 A  F) k1 Z/ f2 X}# n  m( A. V$ s+ I0 ?" m9 c( R
/*------------------------------------------------
2 s0 P3 S0 \3 r# g9 v8 b4 o4 d                    主函数
: w) \0 \4 Q2 @------------------------------------------------*/% x( l; [7 A: H
void main (void)
( p9 {# i1 ]- \! ~{                  
- s8 s$ n' v8 B6 f1 v( Rint temp,tempH=18,tempL=15;! [& E' M4 s2 O; M7 i. @+ c+ C
float temperature;
- M- R6 L: n2 _! k( ~unsigned char TempFlag=0;
* c, l) N7 @9 y9 f9 Ichar displaytemp[16],num;//定义显示区域临时存储数组1 Y: a2 L9 G/ v5 [; i* I5 J2 S
LCD_Init();           //初始化液晶5 |# I$ h: t# t1 n8 M
DelayMs(20);          //延时有助于稳定
9 x! p/ e( H# L$ C8 F1 BLCD_Clear();          //清屏
$ h) T/ l9 m  J" kInit_Timer0();3 Q3 ]# z. A) b. N8 W2 P6 Y
UART_Init();
- Y0 q% l0 Q4 M4 eLcd_User_Chr();       //写入自定义字符3 K) A: j! A/ `

6 y% K+ p. M9 F$ S+ E* twhile (1)         //主循环
9 J% _2 O% d- X0 {4 m) X  {
, q! @. x5 S. [, m  S- ^+ t num=KeyScan();$ S9 O' j) Y' k9 W5 [
switch(num)
2 X& Q3 j# M  |; y( O/ b       {" p' `' \  y# _/ F+ `8 [2 f
            case 1:if(tempH<127)tempH++;break;" a, x4 c9 c' [
                case 2:if(tempH>-55)tempH--;break;
9 o  U# e4 D1 _                case 3:if(tempL<127)tempL++;break;
  |3 ~8 i' Q* J+ Y2 K                case 4:if(tempL>-55)tempL--;break;
  v  i0 }1 Q' ?  B% _# y                default:break;
0 f- w/ n( {$ f4 }/ N( T- m           }
3 n; X! q2 d9 z' oswitch(TempFlag)                                                                                                                                                                                                                                                                       / @! b+ Z2 Z% T! n
       {
  y5 i: M8 G3 t( s5 Q' r            case 0:    //输出温度上限下限
' E- O) e+ X1 x                    {
( l, L$ ^* g$ Q  G5 M                      sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);4 M8 Y8 F- g# i4 x/ A9 m4 q
              LCD_Write_String(0,1,displaytemp);        P2_0=02_2=12_1=1; P1_7=0;
; g  t( d/ H( N. s  X8 u                          break;# r) d* q. R( {) X1 J
                    }% ^( T9 O9 P" _. ^7 f3 _9 a
                case 1CD_Write_String(0,1,"over  tempH    ") 2_1=0;P2_0=1;P2_2=1;P1_7=1; # i' }% R+ ^2 ~9 u; m, u, U
                       break;- C5 ]  F4 Z3 P7 ~1 [1 y
                case 2CD_Write_String(0,1,"under  tempL   "); P2_2=0;P2_0=1;P2_1=1;P1_7=0;  1 w; t) E3 r3 M3 g- m& I; A
                      break;, w3 _. y/ l1 l# L6 ]) [+ r4 e
                default:break;
; I$ T* A! P+ \- n           }3 D4 q' t; Z! i# l
if(ReadTempFlag==1)
6 |8 o% v, j3 n, q) {/ R$ k8 C {
% r( v8 J) X( q4 a: e    ReadTempFlag=0;& ?) C. [/ q, ^1 C
    temp=ReadTemperature();
: f1 A% A: ~( l" _* [0 J7 C9 n' ]0 f6 `6 d1 K& ~* l
    temperature=temp*0.0625;
  B5 S, c9 u, g7 @# _" X5 R, u    temp>>=4;
8 M0 r$ Z6 R# C( t5 S# q; g# `    if(temp>tempH)0 x% j! I+ e- N3 y% v( ?$ f
     {4 w' H* n; F8 e, [$ C, g
        TempFlag=1;  //高于高温标志
/ x0 h) {8 r2 J/ J                ET2=0;6 b4 L( m5 {0 d+ l
     }, }& `  Q' H/ ~5 A# S  T
    else if(temp<tempL)' H5 A8 M4 D2 n/ P9 e; O- I% Z
     {
8 P1 A3 F. i$ k        TempFlag=2;  //低于低温标志0 }6 A) x* J( s; z: o+ `; p
                ET2=0          ;
/ ^2 a) @- B: Z& D$ q+ E     }
( G+ W8 _  ?% O& @) U    else7 j. L+ u2 F- ^
     {
2 ~$ N- T/ m& I       TempFlag=0;   //正常显示标志
, k# p4 r/ q4 s3 _. i  H  S8 s2 K           if(temp>tempH-1)
6 V7 j# ?( z5 F8 m- V: ?& W  @            T2csh();
8 U8 _4 L/ G1 T3 y4 j     }5 X! S2 q7 o/ z/ h, ?; I2 p
     sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值  s% l- z! J2 j$ K) o( q; L
     LCD_Write_String(0,0,displaytemp);//显示第一行
: f/ K2 e! X1 x+ g+ E& B     LCD_Write_Char(13,0,0x01);//写入温度右上角点5 U3 [" Q6 B, o6 Q& w, T
     LCD_Write_Char(14,0,'C'); //写入字符C: S- W4 B9 |- J. k: U) Y
  }        
6 ^: X  Y2 ^+ F+ N; P# u$ Y) n1 B8 S0 w- F' R3 x5 L
}
0 j5 O( U$ B- t: a9 c: M& o# L}
1 t. a! j6 r, S. h/*------------------------------------------------/ e1 [# ~& q2 l$ F( H) S, E
                    定时器初始化子程序
$ `) ]4 m, _4 d3 w9 _1 z# a0 n: w------------------------------------------------*/6 |3 _8 X/ ?; y0 ]& `$ Y4 _
void Init_Timer0(void)3 v# r: ]  Z9 J' x
{
" Q( v' `" \  {( q/ g& Y TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
, v; A; }/ D0 [, L2 X  e- H& S //TH0=0x00;              //给定初值
$ L. Q# g1 J- P9 L/ H //TL0=0x00;( B* a3 Q; Q, k, x; Y& w* V
EA=1;            //总中断打开
! u* T/ s, J; B1 D" y! N4 ]( m ET0=1;           //定时器中断打开
) P* ^. T5 R5 A TR0=1;           //定时器开关打开
- M" ^6 Y7 V% e9 @& X}
$ z& x1 f& b7 F; k+ F. M/*------------------------------------------------
% B$ K. {+ T( p0 u( ]                 定时器中断子程序, q6 b0 M% w3 v. d
------------------------------------------------*/
$ O$ ^) {, L' Y. O9 v0 E$ N/ bvoid Timer0_isr(void) interrupt 1 # S! \: ?5 T9 J% l5 ?7 v+ a  O
{
2 g: B0 e' H# O$ p0 d7 I9 ? static unsigned int num;
" U. e. B- ]( t: p+ i. h$ H+ ` TH0=(65536-2000)/256;                  //重新赋值 2ms
- s# G( {3 u3 M% u- F. S2 a2 } TL0=(65536-2000)%256;
' Z2 k% c7 u1 \/ \- U( O5 Q# Y num++;
* T1 N* j2 i+ F7 L# R if(num==400)        //" e3 i1 j& x; Z  w
   {
6 u9 r- _- W3 u% D$ K    num=0;  w$ R$ S  y; I: O
    ReadTempFlag=1; //读标志位置1
0 Q7 y% V* S. H* C, X! m        }6 |1 D' d% ?, W2 T
}
/ T2 G1 T  a  D2 Q/*------------------------------------------------
: c" V3 K1 d. U: l9 y按键扫描函数,返回扫描键值# N5 R  r, L4 W7 S6 O7 ~
------------------------------------------------*/
5 `: Z" C$ t- s. _2 iunsigned char KeyScan(void)
' D5 S) J# e0 K. U{
' I& p  y. j! r1 e unsigned char keyvalue;8 ~- q7 Q- v' [; y
if(KeyPort!=0xff)
8 O  t5 i! u4 ~( u  p3 x9 W6 S   {
5 w6 A5 r8 }$ }4 K    DelayMs(10);
8 E$ a; x; U% \$ \5 s; _4 `    if(KeyPort!=0xff)# b: k4 [0 R2 s& v' q) I: U
           {6 {) ^4 f8 i$ W  S
            keyvalue=KeyPort;
9 d+ k1 S( U) P: K            while(KeyPort!=0xff);3 @% ~6 N/ {& v3 V) V3 N/ h) Y6 E
                switch(keyvalue)
5 r. e$ [) k+ U" [# p: A3 O% S" f# h                {
% l2 |4 X+ M5 r' Q                 case 0xfe:return 1;break;8 c+ l. [/ q8 ]! i% a( q5 q
                 case 0xfd:return 2;break;
# S) V. O9 Q; x9 d" o9 p( X                 case 0xfb:return 3;break;
5 }" Z/ R+ E6 y1 z                 case 0xf7:return 4;break;/ B* {6 N8 O( s8 i
                 case 0xef:return 5;break;
% N/ b7 ^% P, e: {3 E9 ]' V                 case 0xdf:return 6;break;- j) w2 ^  K7 D& A: L6 C% f" K
                 case 0xbf:return 7;break;
# |" r% X" `0 M3 |2 ?- K$ A                 case 0x7f:return 8;break;
4 R8 ^2 Y5 E1 m. r8 m$ u0 ?5 V                 default:return 0;break;/ y! D+ f' z9 T- c# u0 }
                }
. l3 M2 m5 S$ l2 P4 c          }: r4 _1 v4 P. L
   }
6 Y: v& P; ^, [0 v7 P   return 0;
' }+ A- C5 d( X+ {! F$ y$ e( F! [}
9 @1 z* S* b, f3 u: v7 Z. f' b//定时器2中断3 l  J: i4 p3 Z( t" r& y9 d
timer2() interrupt 5  
7 w: b. G# j" V4 U0 i& J{
* Q! k5 ~5 V; x2 e. v5 u# ]& ` static uchar t;: \( ?$ V& ^/ e& a
TF2=0;$ U& k; Q1 P1 g8 R8 m9 M! ]5 `" c
t++; 2 q" Y/ d5 N9 J4 ?( n" E
if(t==20) //溢出20次就是1秒钟,晶振12Mhz
5 P5 v7 {$ v0 C6 {' W {6 i2 f, x  `4 u- Y- ~! r) K
  t=0;. ]7 a4 N# A5 Q0 Y
  P10=~P10; //反转LED灯的亮灭" z" W# }  T$ U! ^8 ?% t" `& P
}9 v0 U6 r& O) Y6 ~
}
/ M8 y. M; z: ~' F, n2 @2 B3 g6 \$ G8 v' ^& y$ _3 [+ L- H

+ O; @! N, n9 U' W# o完整源码下载:+ E! c, g8 n4 ]0 l" u
游客,如果您要查看本帖隐藏内容请回复
, q5 e0 ?% _* P5 \
/ |( V- I% b7 o( t, X0 n0 M+ z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 04:11 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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