数字温度计设计开题报告书.docx
- 文档编号:9458366
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:32
- 大小:118.70KB
数字温度计设计开题报告书.docx
《数字温度计设计开题报告书.docx》由会员分享,可在线阅读,更多相关《数字温度计设计开题报告书.docx(32页珍藏版)》请在冰点文库上搜索。
数字温度计设计开题报告书
数字温度计设计开题报告
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 *学习交流.zicreate.(建设中)2012-5-21 *********************************************************************/ #include #include #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 if(flag==1) {//首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。 display1 (1);//用开机动画耗时 } else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度计 设计 开题 报告书