城乡和住房建设部网站,营销宣传方式有哪些,上海建站seo,青海西宁网站建设公司文章目录前言一、DS18B20介绍二、单总线协议三、DS18B20引脚说明四、DS18B20程序编写1.DS18B20复位函数2.DS18B20存在检测3.DS18B20读取一个bit和一个byte函数4.DS18B20写一个字节函数5.开始温度转换函数6.DS18B20初始化函数7.DS18B20读取温度函数五、代码测试总结前言
本篇文…
文章目录前言一、DS18B20介绍二、单总线协议三、DS18B20引脚说明四、DS18B20程序编写1.DS18B20复位函数2.DS18B20存在检测3.DS18B20读取一个bit和一个byte函数4.DS18B20写一个字节函数5.开始温度转换函数6.DS18B20初始化函数7.DS18B20读取温度函数五、代码测试总结前言
本篇文章将带大家学习DS18B20的使用并将DS18B20显示到数码管中。
一、DS18B20介绍
DS18B20是一种数字温度传感器可直接将温度转换为数字信号输出。它是一种高精度、低功耗、单总线温度传感器具有以下特点
精度高DS18B20的温度测量精度为±0.5℃可满足大多数应用的需求。
低功耗DS18B20的工作电压范围为3V-5.5V工作电流仅为1mA非常适合应用于低功耗设备中。
单总线协议DS18B20采用单总线协议只需要一条数据线即可实现数据传输和电源供应简化了电路设计。
高精度DS18B20内置16位ADC可以在-55℃到125℃的温度范围内进行测量且具有高抗干扰性能。
体积小DS18B20的封装形式为TO-92、TO-92S、SOT-223等体积小巧方便集成到各种应用中。 DS18B20应用广泛可用于温度测量、温度控制、温度报警等各种场合。常见的应用包括室内温度控制、电子温度计、冰箱温度监测、工业自动化等。由于其低功耗、高精度、体积小等特点DS18B20在物联网等领域也得到了广泛应用。
二、单总线协议
单总线协议是一种串行通信协议它可以通过一根线实现数据传输和电源供应。在单总线协议中数据和时钟信号共用一根线因此只需要一条线就可以实现数据传输和设备控制简化了电路设计降低了成本。 在单总线协议中每个设备都有一个唯一的地址通过地址可以对设备进行选择。当主设备需要与从设备通信时它会向总线上发送一个请求信号同时指定通信的从设备地址。从设备接收到请求信号后会向总线上发送应答信号并在一段时间内提供数据。主设备在接收到应答信号后就可以接收从设备提供的数据。 在单总线协议中数据的传输速率较慢一般在几千位每秒到几十万位每秒之间。因此它主要应用于一些对通信速度要求不高的场合例如温度传感器、湿度传感器等。同时单总线协议具有低成本、低功耗、可靠性高等优点在物联网、家庭自动化等领域也得到了广泛的应用。 这里我们使用的DS18B20所使用的就是单总线协议。
三、DS18B20引脚说明
DS18B20只需要三个引脚即可读取温度数据。 接线方式 GND-----51单片机的GND VDD-----51单片机的电源引脚 DQ-------数据的读取和写入引脚
四、DS18B20程序编写
1.DS18B20复位函数 /*******************************************************************************
* 函 数 名 : ds18b20_reset
* 函数功能 : 复位DS18B20
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_reset(void)
{DS18B20_PORT0; //拉低DQdelay_10us(75); //拉低750usDS18B20_PORT1; //DQ1delay_10us(2); //20US
}2.DS18B20存在检测 首先需要等待一个低电平当等待到低电平后就等待一个高电平当同时满足这两个条件时就说明DS18B20是存在的。
/*******************************************************************************
* 函 数 名 : ds18b20_check
* 函数功能 : 检测DS18B20是否存在
* 输 入 : 无
* 输 出 : 1:未检测到DS18B20的存在0:存在
*******************************************************************************/
u8 ds18b20_check(void)
{u8 time_temp0;while(DS18B20_PORTtime_temp20) //等待DQ为低电平{time_temp;delay_10us(1); }if(time_temp20)return 1; //如果超时则强制返回1else time_temp0;while((!DS18B20_PORT)time_temp20) //等待DQ为高电平{time_temp;delay_10us(1);}if(time_temp20)return 1; //如果超时则强制返回1return 0;
}3.DS18B20读取一个bit和一个byte函数
DS18B20通过使用时间片来读出和写入DS18B20数据。详细介绍如下。 根据上面的讲解我们可以写出读一个bit的函数出来。 读取一个位函数
/*******************************************************************************
* 函 数 名 : ds18b20_read_bit
* 函数功能 : 从DS18B20读取一个位
* 输 入 : 无
* 输 出 : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)
{u8 dat0;DS18B20_PORT0;_nop_();_nop_();DS18B20_PORT1; _nop_();_nop_(); //该段时间不能过长必须在15us内读取数据if(DS18B20_PORT)dat1; //如果总线上为1则数据dat为1否则为0else dat0;delay_10us(5);return dat;
} 读取一个字节函数其实就是循环8次读取bit将8个bit组合成一个byte。 这里特别要注意的就是每次读取一位且先读低位再读高位。 读取一个字节函数
/*******************************************************************************
* 函 数 名 : ds18b20_read_byte
* 函数功能 : 从DS18B20读取一个字节
* 输 入 : 无
* 输 出 : 一个字节数据
*******************************************************************************/
u8 ds18b20_read_byte(void)
{u8 i0;u8 dat0;u8 temp0;for(i0;i8;i)//循环8次每次读取一位且先读低位再读高位{tempds18b20_read_bit();dat(temp7)|(dat1);}return dat;
}4.DS18B20写一个字节函数 /*******************************************************************************
* 函 数 名 : ds18b20_write_byte
* 函数功能 : 写一个字节到DS18B20
* 输 入 : dat要写入的字节
* 输 出 : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{u8 i0;u8 temp0;for(i0;i8;i)//循环8次每次写一位且先写低位再写高位{tempdat0x01;//选择低位准备写入dat1;//将次高位移到低位if(temp){DS18B20_PORT0;_nop_();_nop_();DS18B20_PORT1; delay_10us(6);}else{DS18B20_PORT0;delay_10us(6);DS18B20_PORT1;_nop_();_nop_(); } }
}5.开始温度转换函数 /*******************************************************************************
* 函 数 名 : ds18b20_start
* 函数功能 : 开始温度转换
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_start(void)
{ds18b20_reset();//复位ds18b20_check();//检查DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0x44);//转换命令
}6.DS18B20初始化函数
初始化是非常简单的我们只需要使用之前编写好的函数首先将DS18B20复位然后检查DS18B20是否存在。
/*******************************************************************************
* 函 数 名 : ds18b20_init
* 函数功能 : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输 入 : 无
* 输 出 : 1:不存在0:存在
*******************************************************************************/
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}7.DS18B20读取温度函数
在DS18B20中温度数据是以16位的方式存储的分为高8位和低8位。因此在读取温度数据时需要先读取低8位数据再读取高8位数据然后将它们合并为16位数据。 通过这里我们可以知道正温度的符号位和负温度的符号位是不相同的。所以下面我们需要判断读取出来的温度是正温度还是负温度。
/*******************************************************************************
* 函 数 名 : ds18b20_read_temperture
* 函数功能 : 从ds18b20得到温度值
* 输 入 : 无
* 输 出 : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{float temp;u8 dath0;u8 datl0;u16 value0;ds18b20_start();//开始转换ds18b20_reset();//复位ds18b20_check();//检测是否存在DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0xbe);//读存储器datlds18b20_read_byte();//低字节dathds18b20_read_byte();//高字节value(dath8)datl;//合并为16位数据if((value0xf800)0xf800)//判断符号位负温度{value(~value)1; //数据取反再加1tempvalue*(-0.0625);//乘以精度 }else //正温度{tempvalue*0.0625; }return temp;
}五、代码测试
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{ u8 i0;int temp_value;u8 temp_buf[5];ds18b20_init();//初始化DS18B20while(1){ i;if(i%500)//间隔一段时间读取温度值间隔时间要大于温度传感器转换温度时间temp_valueds18b20_read_temperture()*10;//保留温度值小数后一位if(temp_value0)//负温度{temp_value-temp_value;temp_buf[0]0x40;//显示负号 }elsetemp_buf[0]0x00;//不显示temp_buf[1]gsmg_code[temp_value/1000];//百位temp_buf[2]gsmg_code[temp_value%1000/100];//十位temp_buf[3]gsmg_code[temp_value%1000%100/10]|0x80;//个位小数点temp_buf[4]gsmg_code[temp_value%1000%100%10];//小数点后一位smg_display(temp_buf,4);}
}
总结
DS18B20的总结和驱动代码编写就到这里了希望大家下去自己能够多看数据手册多多总结经验。