数字温度计设计开题报告.docx

上传人:b****5 文档编号:5928449 上传时间:2023-01-02 格式:DOCX 页数:27 大小:121.78KB
下载 相关 举报
数字温度计设计开题报告.docx_第1页
第1页 / 共27页
数字温度计设计开题报告.docx_第2页
第2页 / 共27页
数字温度计设计开题报告.docx_第3页
第3页 / 共27页
数字温度计设计开题报告.docx_第4页
第4页 / 共27页
数字温度计设计开题报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

数字温度计设计开题报告.docx

《数字温度计设计开题报告.docx》由会员分享,可在线阅读,更多相关《数字温度计设计开题报告.docx(27页珍藏版)》请在冰豆网上搜索。

数字温度计设计开题报告.docx

数字温度计设计开题报告

数字温度计设计开题报告

364.1设计要求

●利用温度传感器(DS18B20)测量某一点环境温度. 

●测量范围为-50℃~+50℃,精度为±0.5℃. 

●用LED数码管进行实际温度值直读显示. 

2.扩展功能 

●能够根据需要任意设定温度的上下限报警功能 .

364.2硬件设计

1设计思想

以51单片机为主控制器,以数字式温度传感器DS18B20为传感元件,以LED数码管作为显示器件实时显示测量温度。

数字式温度计测温范围在-50℃~50℃,误差在±0.5℃以内。

温度测量间隔时间选择1 s 。

     通过键盘扩展,实现温度上下限值的设定及温度报警功能。

对温度采样值实现数字滤波。

通过硬件或软件方法实现时间显示。

2主要元器件介绍:

单片机AT89C51温度传感器DS18B204位共阳LED数码管

3功能电路介绍

主控制器:

 单片机AT89C2051具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要。

 

显示电路:

显示电路采用4位共阳LED数码管,从P1口输出段码,列扫描用P3.0~P3.3口来实现,列驱动用9012三极管。

电路图

 

温度计电路设计原理图如上图所示,温度计的控制器使用单片机AT89C51,温度传感器使用DS18B20,用4位共阳极LED数码管以动态扫描法实现温度显示。

 

图中有3个独立式按键可以分别调整温度的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度显示,这时可以调整上下限,从而测出被测的温度值。

364.3软件设计

1设计思想

数字温度计设计的应用程序由主程序,LED显示子程序,温度检测程序组

2软件流程图

3源程序

ds18b20数码管动态显示头文件

*功能:

通过定时器0延时是数码管动态显示

*编程者:

ZPZ

*编程时间:

2009/10/2

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

#ifndef__ds18b20_display_H__//定义头文件

#define__ds18b20_display_H__

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

#defineucharunsignedchar//变量类型宏定义,用uchar表示无符号字符型(8位)

sbitwei1=P2^4;//可位寻址变量定义,用wei1表示P2.4口

sbitwei2=P2^5;//用wei2表示P2.5口

sbitwei3=P2^6;//用wei3表示P2.6口

sbitwei4=P2^7;//用wei4表示P2.7口

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

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

0x6d,0x7d,0x07,0x7f,0x6f};//定义显示码表0~9

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

0xed,0xfd,0x87,0xff,0xef};//带小数点的0.~9.

ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38};//依次是‘不显示’‘.’‘-’‘H’‘L’

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

voiddisplay_delay(uintt)//延时1ms左右

{

uinti,j;

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

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

}

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

voidtimer1_init(bitt)

{

TMOD=0x10;//设定定时器1工作在方式1,最大定时65.53ms

TH0=0x3c;//定时器赋初值,定时50ms

TL0=0xb0;

EA=1;//开总中断

ET1=1;//开定时器1中断

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

}

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

voidtimer1()interrupt3

{

TH0=0x3c;//重新赋初值,定时50ms

TL0=0xb0;

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’不启动

//实现间歇性报警功能

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

if(num>20)//进入20次中断,定时1s

{

num=0;//num归0,重新定开始定时1s

s1=0;//定时1s时间到时自动关闭报警上下限显示功能

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

}

}

/*********************调整报警上下限显示选择函数**********************/

voidselsct_1(ucharf,uchark)//消除百位的0显示,及正负温度的显示选择

{

if(f==0)//若为正温度,百位为0则不显示百位,不为0则显示

{

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

elseP0=temperature1[k/100];

}

if(f==1)//若为负温度,若十位为0,百位不显示,否则百位显示‘-’

{

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

elseP0=temperature3[2];

}

}

voidselsct_2(bitf,uchark)//消除十位的0显示,及正负温度的显示选择

{

if(f==0)//若为正温度,百位十位均为0则不显示十位,否则显示十位

{

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

P0=temperature3[0];

elseP0=temperature1[k%100/10];

}

if(f==1)//若为负温度,若十位为0,十位不显示,否则十位显示‘-’

{

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:

//选通第一个数码管

wei2=1;//关第二个数码管

wei3=1;//关第三个数码管

wei4=1;//关第四个数码管

wei1=0;//开第一个数码管

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

if(a==1)

{

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

}

if(a==2)

{

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

}

break;

case1:

//选通第二个数码管

wei1=1;

wei3=1;

wei4=1;

wei2=0;

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

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

{

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

elseP0=temperature3[0];//通过s标志位的变化实现调节上下限报警温度时数码管的闪烁

if(s1==1)selsct_1(f_max,max);//若s1=1则显示第二个数码管(s1标志位用于上下限查看时的显示)

}

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

{

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

elseP0=temperature3[0];

if(s1==1)selsct_1(f_min,min);

}

break;

case2:

//选通第三个数码管

wei1=1;

wei2=1;

wei4=1;

wei3=0;

if(a==0){P0=temperature2[t%10];}//若a=0则在第三个数码管上显示测量温度的个位

if(a==1)//若a=1则在第三个数码管上显示上限报警温度的十位或‘-’

{

if(s==0)selsct_2(f_max,max);//若s=0则显示第三个数码管,否则不显示

elseP0=temperature3[0];

if(s1==1)selsct_2(f_max,max);//若s1=1则显示第三个数码管

}

if(a==2)//若a=2则在第三个数码管上显示下限报警温度的十位或‘-’

{

if(s==0)selsct_2(f_min,min);

elseP0=temperature3[0];

if(s1==1)selsct_2(f_min,min);

}

break;

case3:

//选通第四个数码管

wei1=1;

wei2=1;

wei3=1;

wei4=0;

if(a==0){P0=temperature1[t_d];}//若a=0则在第四个数码管上显示测量温度的小数位

if(a==1)//若a=1则在第四个数码管上显示上限报警温度的个位

{

if(s==0)P0=temperature1[max%10];//若s=0则显示第四个数码管,否则不显示

elseP0=temperature3[0];

if(s1==1)P0=temperature1[max%10];//若s1=1则显示第四个数码管

}

if(a==2)//若a=2则在第四个数码管上显示下限报警温度的个位

{

if(s==0)P0=temperature1[min%10];

elseP0=temperature3[0];

if(s1==1)P0=temperature1[min%10];

}

break;

}

display_delay(10);//每个数码管显示3ms左右

}

}

/****************************开机显示函数******************************/

voiddisplay1(uintz)//用于开机动画的显示

{

uchari,j;

bitf=0;

for(i=0;i

{

for(j=0;j<4;j++)//依次从左至右显示‘-’

{

switch(j)

{

case0:

wei2=1;

wei3=1;

wei4=1;

wei1=0;break;

P0=temperature3[2];//第一个数码管显示

case1:

wei1=1;

wei3=1;

wei4=1;

wei2=0;break;

P0=temperature3[2];//第二个数码管显示

case2:

wei1=1;

wei2=1;

wei4=1;

wei3=0;break;

P0=temperature3[2];//第三个数码管显示

case3:

wei1=1;

wei2=1;

wei3=1;

wei4=0;break;

P0=temperature3[2];//第四个数码管显示

}

display_delay(400);//每个数码管显示200ms左右

}

}

}

#endif

 

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

*功能:

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

K1是用来

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

*调节模式。

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

*退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除

*按键音,再按一下启动按键音。

在调节上下限温度模式下,K2是实现加1功能,

*K1是实现减1功能,K3是用来设定上下限温度正负的。

*编程者:

ZPZ

*编程时间:

2009/10/2

*学习交流网站(建设中)2012-5-21

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

#include//将AT89X52.h头文件包含到主程序

#include//将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)

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

#defineucharunsignedchar//变量类型宏定义,用uchar表示无符号字符型(8位)

ucharmax=0x00,min=0x00;//max是上限报警温度,min是下限报警温度

bits=0;//s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右

bits1=0;//s1标志位用于上下限查看时的显示

voiddisplay1(uintz);//声明display1()函数(display.h头文件中的函数,ds18b20.h要用应先声明)

#include"ds18b20.h"//将ds18b20.h头文件包含到主程序

#include"keyscan.h"//将keyscan.h头文件包含到主程序

#include"display.h"//将display.h头文件包含到主程序

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

voidmain()

{

beer=1;//关闭蜂鸣器

led=1;//关闭LED灯

timer1_init(0);//初始化定时器1(未启动定时器1)

get_temperature

(1);//首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)

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//变量类型宏定义,用uint表示无符号整形(16位)

#defineucharunsignedchar//变量类型宏定义,用uchar表示无符号字符型(8位)

sbitDQ=P2^3;//可位寻址变量定义,用DQ表示P2.3口

sbitbeer=P1^0;//用beer表示P1.0

sbitled=P1^1;//用led表示P1.1

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

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

bitf=0;//测量温度的标志位,0’表示“正温度”‘1’表示“负温度”)

bitf_max=0;//上限温度的标志位‘0’表示“正温度”‘1’表示“负温度”)

bitf_min=0;//下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”)

bitw=0;//报警标志位‘1’启动报警‘0’关闭报警)

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

voidds18b20_delayus(uintt)//延时几μs

{

while(t--);

}

voidds18b20_delayms(uintt)//延时1ms左右

{

uinti,j;

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

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

}

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

voidds18b20_init()//DS18B20初始化

{

ucharc=0;

DQ=1;

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

ds18b20_delayus(80);//延时15-80μs

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

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

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

DQ=1;//拉高数据线,准备数据传输;

}

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

uchards18b20_read()//DS18B20字节读取

{

uchari;

uchard=0;

DQ=1;//准备读;

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

{

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

DQ=0;

_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;

DQ=d&0x01;

ds18b20_delayus(5);

DQ=1;

d>>=1;

}

}

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

voidget_temperature(bitflag)

{

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

uinti;

ds18b20_init();//DS18B20初始化

ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令

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

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

当前位置:首页 > 医药卫生 > 基础医学

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

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