基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx

上传人:b****9 文档编号:23428659 上传时间:2023-05-17 格式:DOCX 页数:26 大小:538.77KB
下载 相关 举报
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx_第1页
第1页 / 共26页
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx_第2页
第2页 / 共26页
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx_第3页
第3页 / 共26页
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx_第4页
第4页 / 共26页
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx

《基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx》由会员分享,可在线阅读,更多相关《基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx(26页珍藏版)》请在冰豆网上搜索。

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释.docx

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

欢迎光临我的学习交流博客:

上面有很多我个人的嵌入式开发经验总结、程序源码及详细注释。

邮箱:

zpz2005@

电路实物图如下图所示:

电路原理图如下图所示:

 

C语言程序如下所示:

/********************************************************************

*程序名;基于DS18B20的测温系统

*功能:

实时测量温度,超过上下限报警,报警温度可手动调整。

K1是用来

*进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限

*调节模式.在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动

*退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;在调节上下限

*温度模式下,K2是实现加1功能,K1是实现减1功能,K3是用来设定上下限温

*度正负的。

*编程者:

ZPZ

*编程时间:

2009/10/2

*********************************************************************/

#include

h〉

#include

h>

#defineuintunsignedint

#defineucharunsignedchar

ucharmax_int=0x00,max_dot=0x00,min_int=0x00,min_dot=0x00;

bits=0,s1=0;

#include”ds18b20。

h"

#include"keyscan。

h"

/***********************主函数************************/

voidmain()

beer=0;

led=1;

IT1=1;

EX1=0;

EA=1;

timer1_init(0);

get_temperature

(1);

while

(1)

keyscan();

get_temperature(0);

keyscan();

display(temp,temp_d*0.625);

alarm();

keyscan();

}

/********************************************************************

*程序名;__ds18b20_h__

*功能:

DS18B20的c51编程头文件

*编程者:

ZPZ

*编程时间:

2009/10/2

*说明:

用到的全局变量是:

无符号字符型变量temp(测得的温度整数部分),temp_d

*(测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表

*示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1'表

*示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1'表

*示“负温度”),标志位w(报警标志位‘1’启动报警‘0'关闭报警)。

*********************************************************************/

#ifndef__ds18b20_h__

#define__ds18b20_h__

#defineuintunsignedint

#defineucharunsignedchar

sbitDQ=P2^3;

sbitbeer=P3^0;

sbitled=P3^1;

uchartemp=0;//温度的整数部分

uchartemp_d=0;//温度的小数部

ucharn;

bitf=0,f_max=0,f_min=0;w=0;

/***********************延时子函数************************/

voidds18b20_delayus(uintt)

while(t——);

}

voidds18b20_delayms(uintt)

uinti,j;

for(i=t;i>0;i--)

for(j=120;j〉0;j——);

}

/******************ds18b20初始化函数*********((*********/

voidds18b20_init()//DS18B20初始化

{

DQ=1;

DQ=0;//控制器向DS18B20发低电平脉冲

ds18b20_delayus(30);//延时480μs

DQ=1;//控制器拉高总线,

while(DQ);//等待DS18B20拉低总线,在60—240μs之间

ds18b20_delayus(20);//延时,等待上拉电阻拉高总线

DQ=1;//提升数据线,准备数据传输;

}

/******************ds18b20字节读函数******************/

uchards18b20_read()//DS18B20字节读取

uchari;

uchard=0;

DQ=1;//准备读;

for(i=8;i>0;i——)

{

d>〉=1;//低位先发;

DQ=0;

_nop_();

_nop_();

_nop_();

DQ=1;//必须写1,否则读出来的将是不预期的数据;

if(DQ)//在12us处读取数据;

d|=0x80;

ds18b20_delayus(10);

}

returnd;

/******************ds18b20字节写函数******************/

voidds18b20_write(uchard)//ds18b20字节写

{

uchari;

for(i=8;i〉0;i--)

{

DQ=0;

_nop_();

_nop_();

_nop_();

DQ=d&0x01;

ds18b20_delayus(5);

DQ=1;

d〉〉=1;

}

/*********************获取温度函数**********************/

voidget_temperature(bitf)//得到整数的温度值

{

uchara=0,b=0,c=0,d=0;

uinti;

ds18b20_init();//DS18B20初始化

ds18b20_write(0xcc);//向DS18B20发SKIPROM命令

ds18b20_write(0x44);//启动DS18B20进行温度转换,结果存入内部RAM

ds18b20_delayms

(1);

ds18b20_init();//DS18B20初始化

ds18b20_write(0xcc);//向DS18B20发SKIPROM命令

ds18b20_write(0xbe);//读内部RAM中9字节的内容命令

a=ds18b20_read();//读内部RAM(LSB)

b=ds18b20_read();//读内部RAM(MSB)

if(f==1)

max_int=ds18b20_read();//读内部RAM(LSB)

min_int=ds18b20_read();

if((max_int&0x80)==0x80)

{f_max=1;max_int=(max_int-0x80);}

if((min_int&0x80)==0x80)

{f_min=1;min_int=(min_int-0x80);}

i=b;

i>〉=4;

if(i==0)

{

f=0;//i为0,正温度,设立正温度标记

temp=((a>>4)|(b<〈4));//整数部分

a=(a&0x0f);

temp_d=a;//小数部分

else

f=1;//i为1,负温度,设立负温度标记

a=~a+1;

b=~b;

temp=((a>>4)|(b〈<4));//整数部分

a=(a&0x0f);//小数部分

temp_d=a;

}

}

voidstore_t()

{

if(f_max==1)

max_int=max_int+0x80;

if(f_min==1)

min_int=min_int+0x80;

ds18b20_init();//DS18B20初始化

ds18b20_write(0xcc);//向DS18B20发SKIPROM命令

ds18b20_write(0x4e);

ds18b20_write(max_int);

ds18b20_write(min_int);

ds18b20_write(0xff);

ds18b20_init();//DS18B20初始化

ds18b20_write(0xcc);//向DS18B20发SKIPROM命令

ds18b20_write(0x48);

/**********************温度超限报警函数***********************/

voidalarm()

if(f_max==0)

if(f_min==0)

{

if(f==0)

{

if((temp+temp_d*0。

0625)<=min_int||(temp+temp_d*0.0625)〉=max_int)

{w=1;TR1=1;}

if((temp+temp_d*0.0625)

0625)>min_int)

{w=0;}

}

if(f==1){w=1;TR1=1;}

if(f_min==1)

if(f==0)

if((temp+temp_d*0.0625)〉=max_int)

{w=1;TR1=1;}

if((temp+temp_d*0。

0625)〈max_int)

{w=0;}

}

if(f==1)

if((temp+temp_d*0。

0625)>=min_int)

{w=1;TR1=1;}

if((temp+temp_d*0.0625)〈min_int)

{w=0;}

if(f_max==1)

{

if(f_min==1)

if(f==1)

if((temp+temp_d*0。

0625)〈=max_int||(temp+temp_d*0。

0625)>=min_int)

{w=1;TR1=1;}

if((temp+temp_d*0.0625)〈min_int&&(temp+temp_d*0。

0625)>max_int)

{w=0;}

}

if(f==0){w=1;TR1=1;}

}

#endif

/**********************************************************************

*程序名;__keyscan_H__

*功能:

ds18b20键盘头文件,通过键盘设定设定上下限报警温度

*编程者:

ZPZ

*编程时间:

2009/10/2

**********************************************************************/

#ifndef__keyscan_H__

#define__keyscan_H__

sbitkey1=P2^2;

sbitkey2=P2^1;

sbitkey3=P2^0;

sbitkey4=P3^3;

uchara=0,i=0;

bitk4=0,v=0,v1=0,v2=0;

/***************************读键盘延时子函数**************************/

voidkeyscan_delay(uintz)

uinti,j;

for(i=z;i〉0;i--)

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

}

/****************************温度调节函数******************************/

inttemp_change(intcount,bitf)

if(key2==0)

keyscan_delay(10);

if(key2==0)

if(f==0)

{

count++;

if(a==1){if(count〉125)count=125;}

if(a==2){if(count>125)count=125;}

}

if(f!

=0)

{

count++;

if(a==1){if(count>55)count=55;}

if(a==2){if(count>55)count=55;}

}

while(key2==0);

keyscan_delay(10);

if(key3==0)

keyscan_delay(10);

if(key3==0)

{

count--;

if(a==1){if(count〈0)count=0;}

if(a==2){if(count〈0)count=0;}

while(key3==0);

keyscan_delay(10);

returncount;

/*****************************读键盘函数******************************/

voidkeyscan()

if(key1==0)

keyscan_delay(10);

if(key1==0)

{

TR1=1;

k4=1;

v=1;

i++;

if(i〉2){i=0;TR1=0;k4=0;v=0;store_t();get_temperature

(1);}

switch(i)

{

case0:

a=0;break;

case1:

a=1;break;

case2:

a=2;break;

default:

break;

}

}

while(key1==0);

keyscan_delay(10);

}

if(a==1&&v==1)

{led=0;max_int=temp_change(max_int,f_max);}

elseif(a==2&&v==1)

{led=1;min_int=temp_change(min_int,f_min);}

else;

if(k4==1)

if(key4==0)

{

keyscan_delay(5);

if(key4==0)

if(a==1)

{if(max_int>55)f_max=0;elsef_max=~f_max;}

if(a==2)

{if(min_int〉55)f_max=0;elsef_min=~f_min;}

}

while(key4==0);

keyscan_delay(10);

}

}

if(v==0)

{

if(key2==0)

{

keyscan_delay(10);

if(key2==0)

a=1;

TR1=1;

s1=1;

while(key2==0);

keyscan_delay(10);

if(key3==0)

{

keyscan_delay(10);

if(key3==0)

{

a=2;

TR1=1;

s1=1;

while(key3==0);

keyscan_delay(10);

if(v1==1)

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

}

#endif

/**********************************************************************

*程序名;__ds18b20_display_H__

*功能:

ds18b20数码管动态显示头文件,通过定时器0延时实现数码管动态显示

*编程者:

ZPZ

*编程时间:

2009/10/2

**********************************************************************/

#ifndef__ds18b20_display_H__

#define__ds18b20_display_H__

#defineuintunsignedint

#defineucharunsignedchar

sbitwei1=P2^4;

sbitwei2=P2^5;

sbitwei3=P2^6;

sbitwei4=P2^7;

 

ucharnum=0;

ucharcodetemperature1[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

ucharcodetemperature2[]={0xbf,0x86,0xdb,0xcf,0xe6,

0xed,0xfd,0x87,0xff,0xef};

ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38};

/***********************延时子函数************************/

voiddisplay_delay(uintt)

uinti,j;

for(i=t;i>0;i--)

for(j=20;j>0;j——);

/**************************定时器1初始化函数***************************/

voidtimer1_init(bitt)

{

TMOD=0x10;

TH0=0x3c;

TL0=0xb0;

EA=1;

ET1=1;

TR1=t;

}

/**************************定时器1中断函数*****************************/

voidtimer1()interrupt3

TH0=0x3c;

TL0=0xb0;

num++;

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

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

if(num>25)

{

num=0;

s1=0;

v1=1;

}

/***********************调节选择函数************************/

voidselsct_1(ucharf,uchark)

if(f==0)

{

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

elseP0=temperature1[k/100];

}

if(f==1)

{

if(k%100/10==0)P0=temperature3[0];

elseP0=temperature3[2];

}

}

voidselsct_2(bitf,uchark)

if(f==0)

if((k/100==0)&&(k%100/10==0))

P0=temperature3[0];

elseP0=temperature1[k%100/10];

}

if(f==1)

if(k%100/10==0)P0=temperature3[2];

elseP0=temperature1[k%100/10];

}

}

 

/***********************显示函数************************/

voiddisplay(uchart,uchart_d)

uchari;

for(i=0;i〈4;i++)

switch(i)

case0:

if(a==0){selsct_1(f,t);}

if(a==1)

if(s==0)selsct_1(f_max,max_int);

elseP0=temperature3[0];

if(s1==1)selsct_1(f_max,max_int);

}

if(a==2)

{

if(s==0)selsct_1(f_min,min_int);

elseP0=temperature3[0];

if(s1==1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1