基于51单片机及DS18B20温度传感器的数字温度计设计 联系客服

发布时间 : 星期四 文章基于51单片机及DS18B20温度传感器的数字温度计设计更新完毕开始阅读fc7e12cdf90f76c661371aec

基于51单片机及DS18b20温度传感器的数字温度计设计

{

if(key2==0) {

if(v2==0)beer=0; keyscan_delay(10); }

if(key3==0) {

if(v2==0)beer=0; keyscan_delay(10); } if(v1==1) if(k4==0) {

{

if(v2==0)beer=0; keyscan_delay(10); if(key4==0) {

beer=1; v2=~v2; //为‘0’时开按键音,为‘1’时关按键音 }

while(key4==0); keyscan_delay(10);

//v1=1时定时1s时间到自动关闭报警上下限查看功能

//a=0显示实测温度,v1清零,关定时器1

//k4=0时K4按键选择消按键音的功能

{a=0;v1=0;TR1=0;}

if(key3==0) {

beer=1; a=2; TR1=1; s1=1; }

while(key3==0); keyscan_delay(10);

//选择下限显示

//开定时器1开始定时1s

if(key2==0) {

beer=1; a=1; TR1=1; s1=1; }

while(key2==0); keyscan_delay(10);

//选择上限显示

//开定时器1开始定时一分钟左右

//上限显示不闪烁,显示一分钟左右自动退出

//下限显示不闪烁,显示1s自动退出

if(key4==0)

- 26 -

基于51单片机及DS18b20温度传感器的数字温度计设计

}

} }

}

#endif

/********************************************************************** * 程序名; __ds18b20_display_H__

* 功 能: ds18b20数码管动态显示头文件,通过定时器0延时实现数码管动态显示 * 编程者:zicreate * 编程时间:2009/10/2

**********************************************************************/ #ifndef __ds18b20_display_H__ #define __ds18b20_display_H__ #define uint unsigned int sbit wei1=P2^4; sbit wei2=P2^5; sbit wei3=P2^6; sbit wei4=P2^7; uchar num=0;

//变量类型宏定义,用uint表示无符号整形(16位) //变量类型宏定义,用uchar表示无符号字符型(8位)

//可位寻址变量定义,用wei1表示P2.4口 //用wei2表示P2.5口 //用wei3表示P2.6口 //用wei4表示P2.7口

#define uchar unsigned char

//定义头文件

//定义num为全局无符号字符型变量,赋初值为‘0’

uchar code temperature1[]={ 0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f}; //定义显示码表0~9 uchar code temperature2[]={ 0xbf,0x86,0xdb,0xcf,0xe6, 0xed,0xfd,0x87,0xff,0xef};

//带小数点的0.~9.

uchar code temperature3[]={ 0x00,0x80,0x40,0x76,0x38}; //依次是‘不显示’‘.’‘-’‘H’‘L’ /*****************************延时子函数******************************/ void display_delay(uint t) { }

/**************************定时器1初始化函数***************************/ void timer1_init(bit t) {

TMOD=0x10; TH0=0x3c; TL0=0xb0;

//设定定时器1工作在方式1,最大定时65.53ms //定时器赋初值,定时50ms

uint i,j; for(i=t;i>0;i--)

for(j=120;j>0;j--);

//延时1ms左右

- 27 -

基于51单片机及DS18b20温度传感器的数字温度计设计

EA=1;

//开总中断 //开定时器1中断

ET1=1; TR1=t; }

// 局部变量t为1启动定时器1,为0关闭定时器1

/**************************定时器1中断函数*****************************/ void timer1() interrupt 3 {

TH0=0x3c; TL0=0xb0; }

/*********************调整报警上下限显示选择函数**********************/ void selsct_1(uchar f,uchar k) {

if(f==0) }

void selsct_2(bit f,uchar k) {

if(f==0)

//若为正温度,百位十位均为0则不显示十位,否则显示十位

{ if((k/100==0)&&(k0/10==0)) P0=temperature3[0];

//消除十位的0显示,及正负温度的显示选择

{ } if(f==1) {

if(k0/10==0) P0=temperature3[0]; else P0=temperature3[2]; }

//若为负温度,若十位为0,百位不显示,否则百位显示‘-’

if(k/100==0) P0=temperature3[0]; else P0=temperature1[k/100];

//若为正温度,百位为0则不显示百位,不为0则显示 //消除百位的0显示,及正负温度的显示选择

num++;

//每进入一次定时器中断num加1(每50ms加1一次)

if(num<5)

{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}}

Else //进入4次中断,定时200ms时若报警标志位w为‘1’则启动报警,不为‘1’不启动

//实现间歇性报警功能 //进入20次中断,定时1s //num归0,重新定开始定时1s

{s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num>20) num=0; s1=0; v1=1;

//重新赋初值,定时50ms

{

//定时1s时间到时自动关闭报警上下限显示功能 //定时1s时间到时自动关闭报警上下限查看功能

}

- 28 -

基于51单片机及DS18b20温度传感器的数字温度计设计

else P0=temperature1[k0/10];

}

/****************************主显示函数********************************/ void display(uchar t,uchar t_d) {

uchar i; for(i=0;i<4;i++) {

switch(i)

{ case 0:

if(a==1) { } if(a==2) { }

//关第二个数码管 //关第三个数码管 //关第四个数码管 //开第一个数码管

P0=temperature3[4]; //若a=2则在第一个数码管上显示‘L’ wei2=0; wei3=0; wei4=0; break;

//选通第二个数码管

if(a==0){selsct_2(f,t);} //若a=0则在第二个数码管上显示测量温度的十位或‘-’ if(a==1) {

if(s==0) selsct_1(f_max,max);//若s=0则显示第二个数码管,否则不显示 else P0=temperature3[0];

//通过s标志位的变化实现调节上下限报警温度时数码管的

//若a=1则在第二个数码管上显示上限报警温度的百位或‘-’

P0=temperature3[3]; //若a=1则在第一个数码管上显示‘H’

//选通第一个数码管

if(a==0){selsct_1(f,t);} //若a=0则在第一个数码管上显示测量温度的百位或‘-’

//依次从左至右选通数码管显示,实现动态显示 //用于实测温度、上限温度的显示

} if(f==1)

//若为负温度,若十位为0,十位不显示,否则十位显示‘-’

{ if(k0/10==0) P0=temperature3[2];

else P0=temperature1[k0/10];

}

wei1=1; case 1:

闪烁

- 29 -