DS18B20的利用.docx
《DS18B20的利用.docx》由会员分享,可在线阅读,更多相关《DS18B20的利用.docx(16页珍藏版)》请在冰豆网上搜索。
DS18B20的利用
《单片机原理及应用课程设计》报告——18B20温度传感器的数码管显示设计
专业:
电子信息科学与技术
班级:
姓名:
学号:
指导教师:
2011年4月20日
1.课程设计目的
1.1巩固和加深对单片机原理和接口技术知识的理解;
1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;
1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;
1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;
1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求
2.1利用18B20温度传感器与单片机结合来测试当前的温度,并显示到数码管,显示的温度精确到0.1。
(实际可精确到0.0625)
2.2温度显示时采用后4位数码管,前三位为温度值,最后一位为字母C。
2.3温度的测量范围为-55℃~125℃。
3.硬件设计
3.1设计思想
用美国DALLAS公司生产的DS18B20温度传感器与STC89C52RC单片机进行通信,来测试当前的温度,并把测试的温度显示到共阴极数码管的后四位。
3.2主要元器件介绍
(1)温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强。
DS18B20的主要特征:
全数字温度转换及输出。
先进的单总线数据通信。
最高12位分辨率,精度可达土0.5摄氏度。
12位分辨率时的最大工作周期为750毫秒。
可选择寄生工作方式。
检测温度范围为–55°C~+125°C(–67°F~+257°F)
内置EEPROM,限温报警功能。
64位光刻ROM,内置产品序列号,方便多机挂接。
多样封装形式,适应不同硬件系统。
DS18B20引脚功能:
·GND电压地·DQ单数据总线·VDD电源电压·NC空引脚
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。
18B20共有三种形态的存储器资源,它们分别是:
ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。
数据在出产时设置不由用户更改。
DS18B20共64位ROM。
RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。
在上电复位时其值将被刷新。
第5个字节则是用户第3个EEPROM的镜像。
第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。
第9个字节为前8个字节的CRC码。
EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
(2)STC89C82RC单片机一块。
(3)共阴极8位数码管一个。
(4)杜邦线若干。
3.3.功能电路介绍
(1)18b20电路图
(2)8共阴极数码管电路图。
(3)一位数码管引脚图
4.软件设计
4.1设计思想:
在这次温度传感器的课程设计中,只需把DS18B20接到单片机的一个固定I/O口上,利用控制器通过总线对DS18B20进行操作。
需要进行的操作有:
a.复位:
复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。
当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。
b.检测存在脉冲:
在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。
至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。
c.控制器发送ROM指令:
由于本课程设计只需用一个DS18B20,所以可以直接跳过ROM指令,也就是执行一条“跳过指令”。
d.控制器发送存储操作指令:
在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。
操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。
存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。
e.执行或数据读写:
一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。
如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。
如执行数据读写指令则需要严格遵循18B20的读写时序来操作。
4.2软件流程图:
A.DS18B20复位流程图:
B.写字节流程图:
C.读字节流程图:
D.数码管显示流程图:
E.主函数流程图:
4.3源程序:
#include
sbitdat=P3^7;
sbitled=P3^6;
inti;
unsignedcharcodetable_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0,0x39};
unsignedcharcodetable_w[]={0xf7,0xfb,0xfd,0xfe};
voiddelay(unsignedchari)
{
while(--i);
}
voiddelay1(unsignedchart)
{
t++;
while(--t)
{
delay(245);
delay(241);
}
}
voidInit18b20()
{
dat=0;
delay(200);
delay(100);
dat=1;
delay(50);
if(dat==0)led=0;
delay(50);
dat=1;
}
voidWriteByte(unsignedcharbuf)
{
unsignedchari;
for(i=0;i<8;i++)
{
dat=0;
dat=buf&0x01;
buf=buf>>1;
delay(30);
dat=1;
}
delay(5);
}
unsignedcharReadByte(void)
{
unsignedcharbuf=0,i;
for(i=8;i>0;i--)
{
dat=0;
buf=buf>>1;
dat=1;
delay(7);
if(dat)
buf=buf|0x80;
dat=1;
}
return(buf);
}
unsignedintrd_t()
{
unsignedinta,b,t;
Init18b20();
WriteByte(0xcc);
WriteByte(0x44);
delay1(10);
Init18b20();
WriteByte(0xcc);
WriteByte(0xbe);
a=ReadByte();
b=ReadByte();
b=b<<8;
t=a+b;
P2=a;
returnt;
}
voiddeal_t(unsignedchara[],unsignedinthc)
{
unsignedintzhen,i;
zhen=hc>>4;
a[0]=zhen/10;
a[1]=zhen%10;
i=(hc-(zhen<<4))*10000/16;
a[2]=i/1000;
a[3]=12;
}
voidshow(unsignedcharwd[])
{
inti;
for(i=0;i<4;i++)
{P1=table_w[i];
P0=table_d[wd[i]];
if(i==1)
P0=P0|0x80;
delay1
(2);
}
}
voidmain()
{
unsignedintr_t;
unsignedcharwd[4];;
while
(1)
{
r_t=rd_t();
deal_t(wd,r_t);
show(wd);
}
}
5.调试运行
5.1写完复位函数后,用一个了led灯的暗灭来判别是否复位成功。
5.2写完读取温度函数后,没有立即写显示函数,而是先确认能不能成功读取温度的数据。
此处我把函数中的16位温度的低8位赋给P2口,把P2口与8位led灯相连。
若用手触摸温度传感器,则温度发生变化,led灯也会不规则地闪烁。
而最初并没有像预期的那样闪烁,经过调试后发现读字节函数中的延时时间控制的不是很好,经过修改之后,才能够正确地读取温度。
5.3此开发板数码管的位选是用P22,P23,P24通过译码器来进行的,而实验时发现P22端口坏了,猜测是与地短接。
因此我就用P0口的8位来直接进行位选。
5.4第一次调试成功后,发现数码管显示的温度很暗,然后我缩短了一点扫描的间隔,之后发现数码管显示的数字稍微亮了点。
6.设计心得体会:
通过此次课程设计,我对DS18B20这块芯片有所了解,利用单总线就能进行如此复杂的数据通信,这让我非常吃惊。
由于是初次接触DS18B20这块芯片,所以实验起来遇到了很多问题,比如时序问题,由于是单总线,所以时序就显得比较复杂,而且要求非常严谨,导致我多次因为函数中延时大小的问题而导致复位和后来读取温度的失败。
经过多次改正后,我领悟到时序就是芯片的灵魂。
想要一次写完程序并且成功运行几乎是不可能的,当你一口气写玩整个程序,回头再来找出程序中的错误是很难道额。
所以,通过这次实验,我学会了一步一步地写程序,保证每个写出来的子函数都正确,这样可以避免最后回头找错误的繁琐,比如在本实验中,我写完复位函数就进行检测,看复位是否成功,假如不成功,就重新审查函数,直到复位成功,还有写玩读取温度的子函数后,并没有立刻写显示函数,而是想办法检测此时读取温度是否成功。
假如不成功的话,即使后面的显示函数写正确,也不能够正确地显示温度。
DS18B20具有超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强等众多优点。
如此一个小小的芯片,就有这么多的内容,这使得我对单片机的世界充满了好奇,今后一定要研究更多的芯片,更好地学习单片机。
参考书目:
[1]肖金球.单片机原理与接口技术.[M].北京:
清华大学出版社,2004.12
[2]郭天祥.新概念51单片机C语言教程——入门、提高、开发、拓展.电子工业出版社2009.1
[3]赖麒文8051单片机C语言彻底应用北京:
科学出版社2002