传感器DS18B20数字温度计的设计.docx
- 文档编号:5496811
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:22
- 大小:307.41KB
传感器DS18B20数字温度计的设计.docx
《传感器DS18B20数字温度计的设计.docx》由会员分享,可在线阅读,更多相关《传感器DS18B20数字温度计的设计.docx(22页珍藏版)》请在冰点文库上搜索。
传感器DS18B20数字温度计的设计
机电工程系
课程设计报告
题目:
DS18B20数字温度计的设计
————————————————————————
专业:
机电一体化
班级:
学号:
姓名:
指导老师:
目录
一、绪论………………………………………………………3
二、对课程设计的分析…………………………………………3
2.1总体设计框图…………………………………………3
2.2.1主控制器………………………………………4
2.2.2显示电路…………………………………………4
2.2.3温度传感器…………………………………………4
三、系统电路图………………………………………………8
四、系统的软件设计……………………………………………8
4.1主程序……………………………………………………9
4.2读出温度子程序…………………………………………10
4.3温度转换命令子程序…………………………………………10
4.4显示温度子程序…………………………………………11
五、结论与体会………………………………………………11
六、课程设计过程中遇到的主要问题以及解决办法……………11
七、附件……………………………………………………12
7.1keil源程序…………………………………………………12
7.2proteus仿真图………………………………………………17
7.3实物照片………………………………………………17
一、绪论
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否认的,其中数字温度计就是一个典型的例子,但是人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用单片机STC89C52RC,测温传感器使用DS18B20,用七段LED数码管显示。
二、对本课程设计的分析
2.1总体设计框图
温度计电路设计总体设计方框图如1图所示,主控制器采用单片机STC89C52RC,温度传感器采用DS18B20,用3个LED共阴数码管显示温度数据。
图1总体设计框图
2.2.1主控制器
单片机STC89C52RC是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
此实验采用12MHZ晶振。
工作电压:
5.5V~3.3V(5V单片机)。
2.2.2显示电路
显示电路采用3位共阴LED数码管,从P0口输出接10K排阻再连接74HC573八进制锁存器连接到数码管直接显示,读数方便。
2.2.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可以根据实际要求通过简单的编程实现9~12位的数字值读数方式,DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚通信;
●多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
●无需外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机工耗;
●温度可以设置9或12位数字;
●用户可定义报警设置,报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因为发热而烧坏,但不能正常工作;
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。
图2DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位s=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
表1DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
表2 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
三、系统电路图
51单片机最小系统
四、系统的软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。
。
主程序流程图
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如下所示:
读温度子程序
4.3温度转换命令子程序
温度转换流程图
4.4显示温度子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图:
显示温度流程图
五、结论与体会
经过将近三周的单片机课程设计,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计还是挺有意义的,高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
六、课程设计过程中遇到的主要问题以及解决办法
这次课程设计的确遇到很多问题,开始对于温度传感器一概不了解,通过图书馆找书,上网等不断的找资料,DS18B20有了了解。
还有在写完程序后载入板中亮度不一,经过老师和同学的帮助发现是消隐问题,当时仿真也不能用,不断的找问题,从这个过程中学到了很多东西,程序有些语句先后问题也对结果有很大的影响。
七、附件
7.1keil源程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P2^2;//定义引脚
uinttemp;//variableoftemperature温度变量
ucharflag1;//signoftheresultpositiveornegative
sbitdula=P2^6;//DU
sbitwela=P2^7;//WE
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点数字编码
unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点数字编码
voiddelay(uintcount)//delay延时子函数
{
uinti;
while(count>0)
{
i=200;
while(i>0)
i--;
count--;
}
}
//功能:
初始化,波特率9600,方式1//
voidInit_Com(void)
{
TMOD=0x20;//设置定时器1为模式2
PCON=0x00;//电源控制寄存器单片机复位初值
SCON=0x50;//0101000SM0=0,SM1=1选择方式1,REN=1开始接收串口
TH1=0xFd;
TL1=0xFd;
TR1=1;//启动定时/计数器timer1
}
voiddsreset(void)//sendresetandinitializationcommandDS18B20初始化(复位)
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//readabit读一位
{
uinti;
bitdat;
DS=0;i++;//i++fordelay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//readabytedate读一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtmpwritebyte(uchardat)//writeabytetods18b20向ds18b20写入字节数据
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)//分8次循环分别写入各个二进制位
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1写入二进制1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//write0写入二进制0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//DS18B20beginchange发送温度转换命令
{
dsreset();//ds18b20复位
delay
(1);
tmpwritebyte(0xcc);//addressalldriversonbus写“跳过ROM”指令
tmpwritebyte(0x44);//initiatesasingletemperatureconversion写“启动转换”指令发送温度转换命令
}
uinttmp()//getthetemperature获得温度
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);//写“跳过ROM”指令
tmpwritebyte(0xbe);//写“读数据”指令发送读取数据命令
a=tmpread();//连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8;//twobytecomposeaintvariable
temp=temp|a;//两个字节合成一个整型变量
tt=temp*0.0625;//得到真实十进制温度值,因为DS18B20可精确到0.0625度,所以读回数据的最低位代表的是0.0625度
temp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
returntemp;//返回温度值
}
voiddisplay(uinttemp)//显示程序
{
ucharA1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
/*dula=1;//xiaoying
dula=0;
P0=0x00;*/
wela=0;
P0=0x7e;
wela=1;
wela=0;
P0=0x00;//显示百位
dula=1;
dula=0;
delay
(1);
dula=1;//xiaoying
dula=0;
P0=0x00;
/*dula=1;
dula=0;
P0=0x00;*/
wela=0;
P0=0x7d;
wela=1;
wela=0;
P0=table[A1];//显示十位
dula=1;
dula=0;
delay
(1);
dula=1;//xiaoying
dula=0;
P0=0x00;
/*dula=1;
dula=0;
P0=0x00;*/
wela=0;
P0=0x7b;
wela=1;
wela=0;
P0=table[A2]+0x80;//显示个位
dula=1;
dula=0;
delay
(1);
dula=1;//xiaoying
dula=0;
P0=0x00;
dula=1;
dula=0;
P0=0x00;
wela=0;
P0=0x77;
wela=1;
wela=0;
//显示个位
P0=table[A3];
dula=1;
dula=0;
delay
(1);
}
voidmain()//主程序
{
uchara;
Init_Com();
do
{
tmpchange();
//delay(200);
for(a=10;a>0;a--)
{display(tmp());
}
}while
(1);
}
/*{
temp=123;
while
(1)
{display(temp);
}
}*/
7.2proteus仿真图
7.3实物照片
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 传感器 DS18B20 数字 温度计 设计