|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
DS18b20温度可调上下限1602液晶显示程序
! y/ h% [- i3 D( D) _7 A# W0 }' m" Z. A- g+ K) Z9 G$ j
, @+ r. a: `0 D0 m& U2 j/*-----------------------------------------------, s# W# @* \4 e+ a! U g1 a
名称:DS18b20 温度检测液晶显示
! o7 k; J1 a D 内容:
' Q0 P+ `' N- O9 m0 l8 l$ ]------------------------------------------------*/( q% u) w0 A: R* u
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
8 O% Y8 e9 Z1 P) }7 P7 K3 V2 d#include<stdio.h>- F5 z6 E; q# a( y2 S( d5 \
#include "18b20.h": _) I* {9 x9 x: M! f4 N$ ^
#include "1602.h"# @2 S0 J9 R& n. i5 R% `, d* O/ D
#include "delay.h"2 K0 r$ Z9 ~% G7 w0 ~" i
#define KeyPort P3 //定义按键端口! g y" X$ z) i! D& Z/ v% U
) u' W( S) l1 {% K4 ?& T
bit ReadTempFlag;//定义读时间标志 y; p2 p v% O# Q3 r o' S
sbit P2_0=P2^0;$ @" R& z3 Y4 ]9 g- N, X
sbit P2_1=P2^1;, {% l' @* V8 t) i% T
sbit P2_2=P2^2;
( G" @/ \) G$ Xsbit P1_7=P1^7; //定义电机输出端口
6 E: i7 A; C. M, _, O' Jsbit P10=P1^0;- F3 h. \" {+ u4 K
sbit SPK =P1^1;
2 I! z( U) n+ ]* E6 v. c) ounsigned char frq;
3 W3 L k3 {+ e' d6 Gvoid Init_Timer0(void);//定时器初始化
4 I6 p7 l. P: i* Qvoid T2csh(void) //定时器T2初始化
* {2 }. J* p: M% h{) W& K' Q: \$ a5 s
RCAP2H=0xff; //TH2初值
; r! [- b- p) k5 ` RCAP2L=0xee; //TL2初值 - X* d3 G5 L) l2 h7 K! W0 j* F, y3 Q
$ H9 W2 x& Z' u6 Z
TR2=1; //启动定 时器
# H% [4 _6 j7 e& W; v5 ` ET2=1; //打开定时器2中断
4 X5 }3 g) |0 G0 S# R: S. t! y5 o //EA=1; //打开总中断 / ?6 u& i4 U2 [" g2 ^) l( G- e$ A
}
6 C8 Q1 J+ q0 V, |) I ^9 Runsigned char KeyScan(void);//键盘扫描* l t0 I+ h+ `6 Z
/*------------------------------------------------
3 D( ]5 R# ]& t# x/ Z! A4 ^ 串口通讯初始化
+ v! x. n; h& C) C$ U------------------------------------------------*/ N( g8 J; S9 a+ m
void UART_Init(void)
% D3 `! K: R& B% ?' z' Q{
! ~, {0 q M4 ]/ K SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 2 e5 e1 ]/ k2 E' c- W0 | L
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
t: f4 F4 C" N( x TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz & [& Y% D- p Q$ A
TR1 = 1; // TR1: timer 1 打开 . \( I' O5 A6 A. j
//EA = 1; //打开总中断# o5 |3 ]7 l% ^ S* k
//ES = 1; //打开串口中断- R, {1 w8 E i! B p& H
TI=1;% V8 ~* \: ]1 }5 v' e. a3 M
}1 @2 N& s0 D0 Z
/*------------------------------------------------
+ z6 [" n" M9 ?4 |4 v 主函数
+ p1 y- x! g! u3 T------------------------------------------------*/
1 \* C; U$ v ?void main (void)
8 n& C J) ^7 g+ J{
( Y- X. g N4 @" M' U. b) u2 @( [! ]int temp,tempH=18,tempL=15;/ B4 W+ T$ `- o! d$ Z0 \" e
float temperature;+ L2 z, u! V3 c/ x7 V
unsigned char TempFlag=0;) o2 U* C! b0 z5 k; Q0 d
char displaytemp[16],num;//定义显示区域临时存储数组
) q9 v2 T! `: o+ I& vLCD_Init(); //初始化液晶! l! T: {) W- U8 q
DelayMs(20); //延时有助于稳定
. X* B( V6 n% d9 M1 Y6 FLCD_Clear(); //清屏& B, |& D ^: P) a4 N
Init_Timer0();
9 B& C; w0 s& ]3 A b! VUART_Init();+ w% Y m; e+ l" q% x4 G
Lcd_User_Chr(); //写入自定义字符3 e2 G; L/ M) }+ |% @0 R( `5 |
# W- ?( o0 g* G" F7 I9 Q! B: p
while (1) //主循环2 ] F8 ~' v3 Z7 o2 Q, Z
{/ P6 X; i7 |) r8 |* ?
num=KeyScan();
) y. P, {1 q6 D8 t switch(num)! T, [' D1 W: B3 \) V6 S( ?0 K
{
; N5 c P2 A* x case 1:if(tempH<127)tempH++;break;( g3 a& e$ S" s2 ~
case 2:if(tempH>-55)tempH--;break;
$ u1 g) G' @5 n9 ]8 G* |( k case 3:if(tempL<127)tempL++;break;
" a( W& t ?# W. | case 4:if(tempL>-55)tempL--;break;) K# T( e% j! P! X
default:break; \* q; N% z$ ]# }5 U0 }0 P
}
/ ~/ T5 }$ ^! [; T( pswitch(TempFlag) ( J( s( f, C1 o" m3 V9 t
{: I/ a; ^8 e4 }/ _% c8 u$ M
case 0: //输出温度上限下限
5 `9 B) Q1 ?2 ?7 e: q) V4 X {5 k( s7 R' @" y6 h$ u4 L3 o1 }
sprintf(displaytemp,"H.%3d L.%3d ",tempH,tempL);
/ S- l- k9 u! ?8 `* F& N LCD_Write_String(0,1,displaytemp); P2_0=0 2_2=1 2_1=1; P1_7=0;
4 t+ P$ n5 Q# N ^* k break;; R6 e( A: L1 n- }6 N4 l1 u
}
) O! q8 k2 ^& {! h' a ^ case 1 CD_Write_String(0,1,"over tempH ") 2_1=0;P2_0=1;P2_2=1;P1_7=1; / h3 [1 _3 r3 X! B
break;
# o' V5 u8 h: _* J case 2 CD_Write_String(0,1,"under tempL "); P2_2=0;P2_0=1;P2_1=1;P1_7=0; , w2 Z8 |) `6 M* w& {' V2 s* B
break;
3 ?! F4 B" X" b% s default:break;
! ]# G+ {- s& v5 V) l% u }' Q* d+ l( y& ?/ F- q/ T2 L
if(ReadTempFlag==1)8 o) X4 f: e( U5 y! z# U
{
0 i; |4 p# g) r. L' d# h/ D8 ]) | ReadTempFlag=0;0 [/ o, j- t. p$ I/ [
temp=ReadTemperature();. }7 K( f u: E! O9 r( k
8 D( ? E: P- c) }. Z) a! ?
temperature=temp*0.0625;
/ k: t, u, q) z temp>>=4;; f! t3 D+ @1 F$ X
if(temp>tempH)3 k5 N$ {; z5 v* P5 G7 x2 |
{
+ e( C5 T8 A Y- k TempFlag=1; //高于高温标志
& f6 m0 M; j1 d5 }% s5 J ET2=0;9 {; r5 ]$ h8 Z
}# P u" k5 E) x, I5 F) e
else if(temp<tempL)) U: F) x. X' u- K
{
* b. u& y) U5 d2 h TempFlag=2; //低于低温标志2 t* ]: C0 J1 {, b c& ~! d
ET2=0 ;# n* x! a+ L% j: ?
}
# A8 o) ? g: W8 M! ^8 T: U/ ]1 e4 ^ else
7 f. k4 m9 a) X# C2 Y {
: v" r" D" Q0 J7 J# g* c- A/ J' Q5 J TempFlag=0; //正常显示标志* P5 E2 E: ~/ E, Y
if(temp>tempH-1)2 \* P& j" Q4 Q$ m) E, S" V I
T2csh();$ W& K5 z5 q+ W B8 m" O3 t
}
# N- F% [6 i& }( K; \, @5 j sprintf(displaytemp,"Temp %6.2f ",temperature);//打印温度值
: K: E" C% _; v8 L) g LCD_Write_String(0,0,displaytemp);//显示第一行$ a0 i C, g) Y k/ C0 I
LCD_Write_Char(13,0,0x01);//写入温度右上角点
$ {3 g/ c% A, A9 N6 i9 ^ LCD_Write_Char(14,0,'C'); //写入字符C
$ z+ F* N; [0 [ h }
# a3 y0 ^9 Y7 R5 C2 v+ }
7 |/ N' {& Y* B+ m& y; H }
' H6 G9 s* d4 I6 N6 R# I}2 A+ G3 {9 h3 ^& ^0 D
/*------------------------------------------------ R% A7 G' @0 M& N: H u1 Y$ C
定时器初始化子程序: t; d/ P# Z2 n% f( Q$ h$ K. @
------------------------------------------------*/& m/ k0 j1 n2 \% l* E
void Init_Timer0(void)& Q" G, ` P# `. {8 c' ?
{
; {1 D: D- L, R9 J TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 , c" c7 f- X2 S0 c/ f; ]% m
//TH0=0x00; //给定初值
/ J2 A [" A `' b/ V8 F$ e //TL0=0x00;
7 f' i- j9 g) w+ C EA=1; //总中断打开
0 Q* A S7 ?3 s7 N7 y ET0=1; //定时器中断打开
* F5 K3 g A7 G2 q( w( B/ l# P TR0=1; //定时器开关打开
2 P Y, y) S/ F- k% O* \ B}
9 l! H$ J4 d* J4 B. v/*------------------------------------------------
6 e: u9 y& x6 a5 {* u v4 ^ 定时器中断子程序
) z5 R; O }" e4 A7 d( S------------------------------------------------*/7 V; s3 x( d; @4 `; f
void Timer0_isr(void) interrupt 1 0 }0 }1 F2 r9 ~- m* S5 X) n: m
{, e) p8 Z( ^7 M) _6 _. F4 M- Q
static unsigned int num;
: a; |" D l8 ~) a9 [" L/ K TH0=(65536-2000)/256; //重新赋值 2ms
4 w* d9 N! F6 \7 Z g1 @4 ^( h- U7 i TL0=(65536-2000)%256;) Q# n, z w( C: `
num++;
+ q0 V; G/ G8 ~/ D% @1 _& Z) e if(num==400) //0 i" T) a4 Y: s7 Q: ^
{
9 l2 f; a# v6 ]: {2 x num=0;
2 g K' i+ A) M; R* \ ReadTempFlag=1; //读标志位置1. S \; i) c8 E) k! G" Y" V
}6 S& |& k7 E* Q/ l
}
. E$ \( T2 i' ^9 s( ?: b1 M+ j r/*------------------------------------------------9 N) U9 ~/ Z: g* q& x
按键扫描函数,返回扫描键值
$ _8 M6 W. I* P' A; T------------------------------------------------*/5 M1 c% y, M( ?; R7 m
unsigned char KeyScan(void)8 G# p0 b/ I1 ~0 ?8 R' S( L+ H
{
8 a8 s6 p* a5 w# Q8 c5 G) s unsigned char keyvalue;
! Q$ F$ Y/ x b. N if(KeyPort!=0xff)
, \9 m, t$ Q+ W* A$ B7 | {
" e1 d' T4 q1 @- c9 F7 U DelayMs(10);: a, l% c7 q( I2 H
if(KeyPort!=0xff): q4 g& ]6 R: p- w
{ y# G& V, W! o, ^! T F
keyvalue=KeyPort;
9 P+ L8 G( _* r6 T' {3 g* B2 @: ? while(KeyPort!=0xff);7 k4 n, \! }+ F7 N% t
switch(keyvalue)8 L6 z# N4 X$ w2 V3 G7 }
{1 I8 D# X- f0 ]8 L5 D
case 0xfe:return 1;break;3 ^/ W6 N% |6 X7 D
case 0xfd:return 2;break;
$ U- y8 m( J* e/ r case 0xfb:return 3;break;
% ^ R1 I" _; N, f case 0xf7:return 4;break;
) S5 g- E: `) r' M+ R case 0xef:return 5;break;
: ]" A- }1 ~$ j3 K; U case 0xdf:return 6;break;
7 |+ R' p8 _0 a: m! O- v case 0xbf:return 7;break;/ p A# \% N6 X; G( T( u
case 0x7f:return 8;break;# d+ O' i4 z% X# r/ R, K$ V& r( b: T$ s
default:return 0;break;
& m' b8 C2 S( z2 _ }
6 {7 Y8 [/ V5 n8 W }. h: `8 S2 j' [% f
}
' k* N. k" o+ j2 G- [$ V return 0; v0 ]8 h+ b+ }7 d
}0 L' g$ _4 e) I5 z" N }1 a& i; Y
//定时器2中断* P! E* g1 @) Y9 {0 `% K
timer2() interrupt 5 7 O1 u" g# F7 X$ l0 {- H5 v; u6 l
{
. w: P( ]) ], H$ _1 T& j static uchar t;
9 C% k6 P8 r1 _' ~, \( t p/ g TF2=0;
( ]9 O1 q, p/ k" S0 r+ `6 d9 b t++; " c% m% j/ P0 @! u- \! e
if(t==20) //溢出20次就是1秒钟,晶振12Mhz- _8 _" \/ s+ t; ?! a# d \5 g+ x1 ^
{4 H u% q- T/ `$ d- v/ r1 k
t=0;
( z1 x8 S2 l) [" c) Z P10=~P10; //反转LED灯的亮灭7 t8 F& i. S0 k' d/ h! {, Y. ^8 E
}
5 L, D) G: [& a}& ?; J" |1 _3 ?* V
% O* B0 h( }+ }; A W; `7 W7 s0 s1 c7 v4 x) U- J9 r
完整源码下载:0 Z {- B9 i# @1 a k0 l* o5 K
8 w0 k* N, z3 p$ ]
: M+ Q+ m e, j" ]- I7 w |
|