数字温度计实验报告.docx
《数字温度计实验报告.docx》由会员分享,可在线阅读,更多相关《数字温度计实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
数字温度计实验报告
数字温度计实验报告
一实验目的
1.熟悉温度传感器ds18b20、LED或LCD液晶显示器、数码显示器的原理和特点,掌握其实际应用的工作原理与方法。
2.在熟悉数字显示温度计的电路组成与工作原理,掌握相关芯片的作用与使用基础上,培养设计、制作、调试电路等一系列工程设计的能力。
二实验要求
1:
能够实时显示环境温度。
2:
能够保存使用时间内的最大值和最小值,能够查阅。
3:
有温度报警功能,能够设置报警温度。
用绿灯表示正常温度,红灯表示报警同时发声。
4:
自由发挥其他功能。
5:
要求有单片机硬件系统框图,电路原理图,软件流程图。
三实验基本原理
1.硬件部分
此次实验主要使用到的芯片有传感器DS18B20、单片机AT89C51、七段译码器CD4511、以及LED数码管。
由于传感器DS18B20的输出即为数字信号,因此省去了很多工作,如电流\电压转换、转换等。
A\D此次电路的基本原理为:
传感器读入温度信息,发送给单片机处理,单片机处理后将信号发送给译码器进行译码后送给LED即显示出当前温度;温度过高时蜂鸣器实行报警。
2.软件部分
软件部分主要包括初始化程序,初始化ds18b20程序,读ds18b20程序,数据转摄氏温度BCD码程序,报警程序,显示程序,中断程序,延时程序等,具体程序见附录。
其中下列程序的编程方法做以下说明:
(1)数据转摄氏温度BCD码程序:
由于要实现分辨率可调,所以编程时小数位的值是根据分辨率的值来对从ds18b20读入的四位小数位进行取舍,百位、十位和个位的数则由二进制数除以一百、一十和余数求得,这样即实现把从ds18b20读入的温度装换成代显示的摄氏温度BCD码。
(2)报警程序:
对所得的温度进行判断,当温度超30°C时,即驱动蜂鸣器(P1^2口)。
四实验设计分析
针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为初始化程序,初始化ds18b20程序,读ds18b20程序,数据转摄氏温度BCD码程序,报警程序,显示程序,中断程序,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。
第三部分是软件部分:
先学习理解基于KeiluVision4的c语言编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
五实验要求实现
A.电路设计
1.整体设计
整体设计图如下:
2.硬件设计
硬件设计图如下:
3.数字温度传感器:
ds18b20
数字温度传感器ds18b20由DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。
它具有体积小,接口方便,传输距离远等特点。
1.ds18b20性能特点:
1采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位)。
2测温范围为-55℃-+125℃,测量分辨率为0.0625℃。
3内含64位经过激光修正的只读存储器ROM。
4适配各种单片机或系统机。
5用户可分别设定各路温度的上、下限。
6内含寄生电源。
2.ds18b20内部结构
ds18b20内部结构主要由四部分组成:
64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。
64位光刻ROM是出厂前被光刻好的,它可以看作是该ds18b20的地址序列号。
64位ROM结构图如图2所示。
不同的器件地址序列号不同。
ds18b20的管脚排列图、引脚分布图如图所示。
3.ds18b20控制方法
ds18b20有六条控制命令,如表所示:
4.复位和应答脉冲时隙
5.读写时序
4软件设计
软件部分主要包括初始化程序,初始化ds18b20程序,读ds18b20程序,数据转摄氏温度BCD码程序,显示程序,中断程序,延时程序等。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^2;
sbitbeef=P1^3;
sbitred=P1^4;
sbitgreen=P1^5;
unsignedcharcodeduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0xFF};
/*0123456789ABCDEF*/
unsignedcharcodeduan1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};//加小数点
unsignedcharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uintrecord[50];
voiddelay();//延时函数
voidinit_ds18b20();//初始化ds18b20
voidwrite_byte(uchardat);//写数据函数
ucharread_byte();//读数据函数
uintreadtemp();//读温度函数
voiddisplay(uinttemp);//显示函数
voidkey();//键盘函数
voidshowmaxtemp();//显示最大温度函数
voidshowmintemp();//显示最小温度函数
voidshowwarntemp();//显示警告温度函数
uinttemp;
uchara;
ucharc;
uintmaxtemp;
uintmintemp;
ucharn=0;
ucharm=0;
uchare=0;
uintd;
uintwarntemp=300;
voidmain(void)
{
EA=1;//打开总中断开关
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65535-50000)/256;//赋处置
TL0=(65535-50000)%256;
ET0=1;//打开定时器中断
TR0=1;//启动定时器
while
(1)
{
temp=readtemp();//读出温度并赋值给temp
key();
record[c]=temp;
if(n==0&&m==0&&e==0)
display(temp);
if(temp>=warntemp)
{
beef=0;
red=0;
green=1;
}
else
{
beef=1;
red=1;
green=0;
}
showmaxtemp();
showmintemp();
showwarntemp();
}
}
voidtime1()interrupt1//中断程序
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a++;
if(a==20)
{
a=0;
record[c]=temp;
mintemp=record[0];maxtemp=record[0];
for(d=1;d<=c;d++)
{
if(mintemp>record[d])mintemp=record[d];//
if(maxtemp}
c++;
}
}
voiddelay(uintt)//延时函数
{
while(t--);
}
voidinit_ds18b20()//ds18b20初始化函数
{
ucharx;
DQ=1;
delay(8);
DQ=0;
delay(250);
DQ=1;
delay(100);
x=DQ;
delay(4);
}
voidwrite_byte(uchardat)//写数据函数
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(10);
DQ=1;
dat>>=1;
}
delay(4);
}
ucharread_byte()//读数据函数
{
uchari,t,dat;
for(i=0;i<8;i++)
{
DQ=0;
t>>=1;
DQ=1;
dat=DQ;
if(dat==1)
t|=0x80;
delay(10);
}
returnt;
}
uintreadtemp()//数据转摄氏温度BCD码程序
{
uchara,b;
floatt;
init_ds18b20();
write_byte(0xcc);//跳过rom
write_byte(0x44);//启动温度测量
delay(300);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);//读温度
a=read_byte();
b=read_byte();
temp=b;
temp<<=8;
temp=temp|a;
t=temp*0.0625;
temp=t*10+0.5;
returntemp;
}
voiddisplay(uinttemp)//显示函数
{
P3=wei[4];
P2=duan[temp/100];//取显示数据,段码
delay(300);
P3=wei[3];
P2=duan1[temp%100/10];//取显示数据,段码
delay(300);
P3=wei[2];
P2=duan[temp%10];
delay(300);
P3=wei[1];
P2=0x00;
}
voidshowmaxtemp()
{
if(n==1)display(maxtemp);
}
voidshowmintemp()
{
if(m==1)display(mintemp);
}
voidshowwarntemp()
{
if(e==1)display(warntemp);
}
voidKey()
{
uchark,x,y,z;
P0=0xff;
P0=0x0f;
if(P0!
=0x0f)
{
delay(20);
if(P0!
=0x0f)
{
x=P0;
P0=0xf0;
y=P0;
z=x|y;
while(P0!
=0xf0);
switch(z)
{
case0xe7:
n=1;m=0;e=0;break;//数字1[1,1]
case0xeb:
m=1;n=0;e=0;break;//数字2[1,2]
case0xed:
n=0;m=0;e=0;break;//数字3[1,3]
case0xee:
e=1;n=0;m=0;break;//运算符+[1,4]
case0xd7:
k=1;break;//数字4[2,1]
case0xdb:
k=2;break;//数字5[2,2]
case0xdd:
break;//数字6[2,3]
case0xde:
break;//运算符-[2,4]
case0xb7:
break;//数字7[3,1]
case0xbb:
break;//数字8[3,2]
case0xbd:
break;//数字9[3,3]
case0xbe:
break;//运算符*[3,4]
case0x77:
break;//数字0[4,1]
case0x7b:
break;//小数点[4,2]
case0x7d:
break;//运算符=[4,3]
case0x7e:
break;//运算符/[4,4]
}
if(k==1){warntemp++;display(warntemp);}
if(k==2){warntemp--;display(warntemp);}
}
}
}
六设计总结
本系统以AT89S52单片机、DS18B20温度传感器为核心,实现了低功耗高精度便携式数字温度计的设计.对于便携式仪器,本设计实现了低成本宽测温范围条件下的低功耗高精度要求,具有一定的实用价值.整个便携式低功耗高精度数字温度计使用方便,工作稳定,待机时间长,具有广阔的应用前景.通过本次设计,使得我对之前学习过的知识比如:
电路分析,数字电子技术,有了更进一步的认识.同时,锻炼了我独立思考和独立完成任务的能力.在本次设计中,不但查阅了很多书本上的资料,也通过网络查阅了芯片的结构,接线等方面很多相关知识.