ds18b20程序

2022-07-30

第一篇:ds18b20程序

DS18B20学习总结

及其高精度温度测量的实现

1.1 DS18B20简介

DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器. 主要由三个数据部件组成:64的激光ROM,温度灵敏原件,非易失性温度告警触发器TH和TL。 封装如图一:

图一 1.

2DS18B20的特点:

1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

2. DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温。 3. DS18B20在使用中不需要任何外围元件。

4. 测温范围-55℃~+125℃,固有测温分辨率0.5℃。 5. 测量结果以9位数字量方式串行传送。

内部结构框图如图二所示。

图二

2.1 访问温度计的协议:

(一)初始化

(二)ROM操作命令

(三)存贮器操作命令

(四)处理/数据

由热敏原件中晶振特性计算出所测的温度。 注意:复位操作如下图三

图三 必需要给DS18B20输入脉冲激活其复位功能。

DS18B20的驱动程序:

/*************************此部分为18B20的驱动程序*************************************/

#include #include sbit D18B20=P3^7; sbit error=P3^4; #define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/ void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr); //单字节写入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void); bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节 unsigned char idata id_buff[8];

unsigned char idata crc_data; unsigned char code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

void GetTemp() {

if(TIM==100)

{ TIM=0;

TemperatuerResult();

每隔 1000ms 读取温度。

void TemperatuerResult(void) {

p = id_buff;

ReadID();

//先确定是第几个DS18B20

Config18b20(); //配置DS18B20的报警温度和分辨度

Init18b20 ();

//复位)

WriteByte(0xcc);

//skip rom

WriteByte(0x44);

//Temperature convert

Init18b20 ();

//复位)

WriteByte(0xcc);

//skip rom

WriteByte(0xbe);

//read Temperature

p = temp_buff;

GemTemp(); //读取温度

}

void GemTemp (void) {

read_bytes (9);

if (CRC(9)==0) //校验正确

{

Temperature = temp_buff[1]*0x100 + temp_buff[0]; //

Temperature *= 0.0625;

Temperature /= 16;

TempDelay(1);

} } *Function:CRC校验 *parameter: *Return: *Modify: *************************************************************/ unsigned char CRC (unsigned char j) {

unsigned char idata i,crc_data=0;

for(i=0;i

crc_data = CrcTable[crc_data^temp_buff[i]];

return (crc_data); }

/************************************************************ *Function:向18B20写入一个字节 *parameter: *Return: *Modify:

void WriteByte (unsigned char idata wr) //单字节写入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //

5 _nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************ *Function:读18B20的一个字节 *parameter: *Return: *Modify: *************************************************************/ unsigned char ReadByte (void)

//读取单字节

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); } /************************************************************ *Function:读18B20 *parameter: *Return: *Modify: *************************************************************/ void read_bytes (unsigned char idata j) {

unsigned char idata i;

for(i=0;i

{

*p = ReadByte();

p++;

} } /************************************************************ *Function:延时处理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {

while(us--); } /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);

//delay 530 uS//80

_nop_();

D18B20=1;

TempDelay(14);

//delay 100 uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

{flag = 1; error=0; }

//detect 1820 success!

else

{flag = 0; error=1; }

//detect 1820 fail!

TempDelay(20);

//20

_nop_();

_nop_();

D18B20 = 1; }

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

向18B20写入一个字节 *parameter: *Return: *Modify: *************************************************************/ void WriteByte (unsigned char idata wr) //单字节写入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //5

_nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

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

读18B20的一个字节

*/ unsigned char ReadByte (void)

//读取单字节 {

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); }

/************************************************************ 3.1.2

SPI数据线配置。

/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/

#include #include

#define NOP()

_nop_()

/* 定义空指令 */ #define _Nop() _nop_()

/*?定义空指令*/ void HC595SendData(unsigned int SendVal);

//SPI IO sbit

MOSIO =P1^5; sbit

R_CLK =P1^6; sbit

S_CLK =P1^7; sbit

IN_PL =P3^4;

//74HC165 shift load

把数据加载到锁存器中 sbit

IN_Dat=P3^5;

//74HC165 output

数据移出 sbit

OE

=P3^6;

/********************************************************************************************************* ** 函数名称: HC595SendData ** 功能描述: 向SPI总线发送数据

*********************************************************************************************************/ void HC595SendData(unsigned int SendVal) {

unsigned char i;

for(i=0;i<16;i++)

{

if((SendVal<

else MOSIO=0;

S_CLK=0;

NOP();

NOP();

S_CLK=1;

}

R_CLK=0; //set dataline low

NOP();

NOP();

R_CLK=1; //片选

OE=0; }

3.1.

3试验数码管上显示温度

#include extern GetTemp();

//声明引用外部函数 extern unsigned int idata Temperature;

// 声明引用外部变量 void delay(unsigned int i);

sbit

LS138A=P2^2;

//管脚定义 sbit

LS138B=P2^3; sbit

LS138C=P2^4;

//此表为 LED 的字模, 共阴数码管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; void system_Ini() {

TMOD|= 0x11;

TH1 = 0xD8;

//10

TL1 = 0xF0;

IE = 0x8A;

TR1 = 1 main() { unsigned char i;

system_Ini();

while(1)

{

GetTemp();

/********以下将读18b20的数据送到LED数码管显示*************/

LedNumVal=Temperature;

//把实际温度送到LedNumVal变量中

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100];

LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[3]=Disp_Tab[LedNumVal%10];

//个位

for(i=0; i<4; i++)

{

P0 = LedOut[i] ;

switch(i)

{

//138译码

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

}

delay(100);

}

P0 = 0;

} }

//延时程序

void delay(unsigned int i) {

char j;

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

for(j = 200; j > 0; j--); } 4.1 讨论DS18B20的自动报警功能实现。

DS18B20只是一个测温元件,所谓的报警功能要通过程序由单片机来实现。

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,头2个字节包含测得的温度信息,第3和第4字节TH(报警温度上限)和TL(报警温度下限)的拷贝。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。第

6、

7、8字节保留未用。要实现报警,完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较(当然要自己编程序)。若T>TH或T

第二篇:DS18B20温度传感器设计报告

传感器课程设计

专 业: 计算机控制技术

---数字温度计

年 级: 2011 级 姓 名: 樊 益 明

学 号: 20113042

指导教师: 刘 德 春

阿坝师专电子信息工程系

1. 引 言

1.1. 设计意义

在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持。其缺点如下:

● 硬件电路复杂; ● 软件调试复杂; ● 制作成本高。

本数字温度计设计采用美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20作为检测元件,测温范围为-55~125℃,最高分辨率可达0.0625℃。

DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的热点。

2 设计要求

2.1基本要求 1) 用LCD12232实现实时温度显示温度和自己的学号。 2) 采用LED数码管直接读显示。 2.2扩展功能

温度报警,能任意设定温度范围实现铃声报警;

33.1单片机89C52模块

单片机89C52是本设计中的控制核心,是一个40管脚的集成芯片构成。引脚部分:单片机引脚基本电路部分与普通设计无异,40脚接Vcc+5V,20脚接地。X1,X2两脚接12MHZ的晶振,可得单片机机器周期为1微秒。RST脚外延一个RST复位键,一端通过10K电阻接Vcc,一端通过10K电阻接地。AT89S52是一种低功耗、高性能的8位CMOS微控制器,具有8K的可编程Flash 存储器。使

资料准备 用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O 口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。P 0口接一个470的上拉电阻。P0口0~8脚接4位共阳数码管的段选,P2口0~4脚接4位共阳数码管的位选,P3.7接DS18B20采集信号。

3.2 DS18B20简介

DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一线总线”数字化温度传感器 同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。 DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。3.3 温度传感器的工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值,即为所测温度。

3.4 DS18B20中的温度传感器对温度的测量

高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在 高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。

温度数据值格式

下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125℃的数字输出为07D0H,

实际温度=07D0H*0.0625=2000*0.0625=125℃。

例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算), 实际温度=370H*0.0625=880*0.0625=55℃。

可见其中低四位为小数位。

DS18B20温度与表示值对应表

3.5 DS18B20的内部结构

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下:

DQ为数字信号输入/输出端;

GND为电源地;

VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

1) 64位的ROM 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

2) DS18B20温度传感器的存储器

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第

六、

七、八个字节用于内部计算。第九个字节是冗余检验字节。

3.6 DS18B20的时序

由于DS18B20采用的是单总线协议方式,即在一根数据线实现数据的双向传输,而对89C51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

1) DS18B20的复位时序

2)DS18B20的读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

3) DS18B20的写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

4系统框架设计如下图所示:

按照系统设计功能的要求数字温度计总体电路结构框图如下图所示

5硬件设计

温度计采用AT89C51单片机作为微处理器,温度计系统的外围接口电路由晶振、LCD显示电路、复位电路、温度检测电路、LCD驱动电路。

温度计的工作过程是:初始化其接收需要检测的温度,并一直处于检测状态,并将检测到的温度值读取,并转化为十进制数值,通过LCD显示出来,再显示温度,方便用户来读数使用记录数据。

温度计系统的的硬件电路图如下图所示。

DS18B20测温和学号显示

6系统程序的设计

6.1主程序

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1s进行一次。

主程序流程图如图4.1.1所示。

初始化调用显示子程序1s到?YN初次上电?N读出温度值温度计算处理显示数据刷新Y发温度转换开始命令

主程序流程图

6.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。

读出温度子程序流程图如图4.2所示。

发DS18B20复位信号发跳过ROM命令CRC校验正确?发读取温度命令Y移入温度暂存器读取操作,CRC校验YNN结束9字节完?

6.3温度转换命令子程序

温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间大约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。 温度转换命令子程序图如图4.3所示。

发DS18B20复位uml发跳过ROM命令发温度转换开始命令

结束

6.4计算温度子程序

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值的正负判断。

计算温度子程序流程图如图4.4所示。

开始计算小数位温度BCD值温度零下?N计算整数位温度BCD值Y置“+”标志温度值补码置“—”标志结束

6.5显示数据刷新子程序

显示数据刷新子程序主要是对显示缓冲器中得显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。

显示数据刷新子程序流程图如图4.5所示。

7 设计总结

本设计利用89S51芯片控制温度传感器DS18B52,再辅之以部分外围电路实现对环境温度的控制,性能稳定,精度较高,而且扩展性很强。由于DS18B20支持单总线协议,我们可以将多个DS18B52并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B52通信,占用较少的微处理器的端口就可以实现多点测温监控系统。

我们在老师的指导下完成了基于DS18B20的数字温度计的设计和制作。在进行实验的过程中,我们了解并熟悉DS18B20、AT89C2051以及74LS244的工作原理和性能。并且通过温度计的制作,我们将电子技能实训课堂上学到的知识进行运用,并在实际操作中发现问题,解决问题,更加增加对知识的认识和理解。

第三篇:2011基于18B20温度传感器论文

基于单片机18B20的温度计设计

摘要:文章主要介绍有关18B20温度传感器的应用及有关注意事项,经典接线原理图。 1. 引言:

温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。对于我们普通的电子爱好者来说,DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。了解其工作原理和应用可以拓宽您对单片机开发的思路。

2. DS18B20的主要特征:  * 全数字温度转换及输出。  * 先进的单总线数据通信。  * 最高12位分辨率,精度可达土0.5摄氏度。  * 12位分辨率时的最大工作周期为750毫秒。  * 可选择寄生工作方式。  * 检测温度范围为–55°C ~+125°C (–67°F ~+257°F)  * 内置EEPROM,限温报警功能。  * 64位光刻ROM,内置产品序列号,方便多机挂接。  * 多样封装形式,适应不同硬件系统。 3. DS18B20引脚功能:

•GND 电压地 •DQ 单数据总线 •VDD 电源电压

4. DS18B20工作原理及应用:

DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。18B20共有三种形态的存储器资源,它们分别是:

ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。

5. 控制器对18B20操作流程:

1、 复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。

2、 存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。

3、 控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指

定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B20芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。ROM指令在下文有详细的介绍。

4、 控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。

5、 执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。数据的读写方法将有下文有详细介绍。 6. DS28B20芯片ROM指令表

Read ROM(读ROM)[33H] (方括号中的为16进制的命令字) Match ROM(指定匹配芯片)[55H] Skip ROM(跳跃ROM指令)[CCH] Search ROM(搜索芯片)[F0H] Alarm Search(报警芯片搜索)[ECH] 7. DS28B20芯片存储器操作指令表:

Write Scratchpad (向RAM中写数据)[4EH] Read Scratchpad (从RAM中读数据)[BEH] Copy Scratchpad (将RAM数据复制到EEPROM中)[48H] Convert T(温度转换)[44H] Recall EEPROM(将EEPROM中的报警值复制到RAM)[B8H] Read Power Supply(工作方式切换)[B4H] 8.写程序注意事项

DS18B20复位及应答关系

每一次通信之前必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。

DS18B20读写时间隙:

DS18B20的数据读写是通过时间隙处理位和命令字来确认信息交换的。 写时间隙:

写时间隙分为写“0”和写“1”,时序如图7。在写数据时间隙的前15uS总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在15~60uS,采样时间内如果控制器将总线拉高则表示写“1”,如果控制器将总线拉低则表示写“0”。每一位的发送都应该有一个至少15uS的低电平起始位,随后的数据“0”或“1”应该在45uS内完成。整个位的发送时间应该保持在60~120uS,否则不能保证通信的正常。 读时间隙:

读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少1uS的低电平,表示读时间的起始。随后在总线被释放后的15uS

中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起始信号。注意:必须在读间隙开始的15uS内读取数据位才可以保证通信的正确。 在通信时是以8位“0”或“1”为一个字节,字节的读或写是从高位开始的,即A7到A0.字节的读写顺序也是如图2自上而下的。

9.接线原理图:

本原理图采用四位数码管显示,低于100度时,首位不显示示例27.5,低于10度时示例为9.0,低于零度时示例为-3.7。

结束语:基于DS18B20温度测量温度准确,接线简单,易于控制,加以扩展可以应用到各种温度控制和监控场合。

参考文献:

DALLAS(达拉斯)公司生产的DS18B20温度传感器文献

程序:

#include

#define uchar unsigned char #define uint unsigned int

sbit sda=P1^7; sbit dian=P0^7;//小数点显示 uint tem;

uchar h; uchar code tabw[4]={0xf7,0xfb,0xfd,0xfe};//位选 uchar code tabs[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//数码管数据

//

0

4 5 6

8 9

- uchar code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //查表显示小数位 ,1/16=0.0625,即当读出数据为3时,3*0.0625=0.1875,读出数据为3时对应1,查表显示1,为4时显2 uchar data temp[2]={0};//高位数据与低位数据暂存 uchar data display[5]={0};//显示缓存

void delay(uchar t)//t为1时延时小于5us { while(t--); } void delay1()//4us {} void delays(uchar m)//1ms { uchar i,j; for(i=0;i

for(j=0;j<110;j++); } void reset()//初始化 { uchar x=1; while(x) {

while(x)

{

sda=1;

sda=0;

delay(50);//延时500us以上

sda=1;

delay(5);//等待15us-60us

x=sda;

}

delay(45);

x=~sda; }

sda=1; } void write_s(uchar temp)//写入一个字节 { uchar i; for(i=0;i<8;i++) {

sda=1;

sda=0;

delay1();

sda=temp&0x01;

delay(6);

temp=temp/2; } sda=1; delay(1); } uchar read_s()//读出一个字节的数据 { uchar m=0,i; for(i=0;i<8;i++) {

sda=1;

m>>=1;

sda=0;

delay1();

sda=1;

delay1();

if(sda)

m=m|0x80;

delay(6); } sda=1; return m; } uint read_1820()//读出温度 { reset(); delay(200); write_s(0xcc);//发送命令

write_s(0x44);//发送转换命令

reset(); delay(1); write_s(0xcc);

write_s(0xbe); temp[0]=read_s(); temp[1]=read_s(); tem=temp[1]; tem<<=8; tem|=temp[0]; return tem; } void scan_led()//数据显示—数码管 { uchar i; for(i=0;i<4;i++) {

P0=tabs[display[i]];

P1=tabw[i];

delays(7);

if(i==1)

dian=0;

P1=tabw[i];

delays(2); } } void convert_t(uint tem)//温度转换{ uchar n=0; if(tem>6348) {

tem=65536-tem;

n=1; } display[4]=tem&0x0f; display[0]=ditab[display[4]];

display[4]=tem>>4;

display[3]=display[4]/100;

display[1]=display[4]%100;

display[2]=display[1]/10;

display[1]=display[1]%10; if(!display[3]) {

display[3]=0x0a; } if(!display[2])

display[2]=0x0a; if(n)

// 取百位数据暂存

// 取后两位数据暂存// 取十位数据暂存

{

n=0;

display[3]=0x0b; } } void main() { delay(0); delay(0); delay(0); P0=0xff; P1=0xff; for(h=0;h<4;h++)//初始化为零

{

display[h]=0; } reset(); write_s(0xcc); write_s(0x44); for(h=0;h<100;h++)//显示0保持

scan_led(); while(1) {

convert_t(read_1820());//读出并处理

scan_led();//显示温度

} }

第四篇:B20体卫艺工作

1、 体育教学计划

2、 大课间体育活动记录

3、 大型文艺演出活动记录

4、 队列比赛规程

5、 队列比赛成绩

6、 队列比赛总结

7、 广播操比赛规程

8、 广播操比赛成绩

9、 越野赛比赛成绩

10、 元旦文艺演出活动记录

11、 拔河比赛规程及成绩

12、 校园舞比赛规程、成绩

13、 体育活动课记录

14、 体育备课笔记

15、 体育特长生活动记录

16、 音乐活动记录

17、 艺体特长生档案记录

18、 预防传染病制度

19、 预防传染病措施

20、 常见病、传染病记录

第五篇:3DS如何能玩DS游戏王汉化版

3DS如何玩NDS的游戏王汉化版游戏

日版或美版3ds玩以前的游戏王NDS汉化版游戏时会显示不出中文?那么该怎么办呢?

20秒搞定这个问题,进入蓝卡(别说没有),下移光标到游戏图标,按Y弹出对话框(上方小字File Information),继续按Y选择Settings,弹出Compatibility对话框(有三个选项,卖萌的),接着按R键,转到Features对话框,在最后一个选项Language中选择日本语,按A确定即可。

上一篇:小学英语教学随笔下一篇:招聘文员工作简历