赞
踩
DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。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 使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
(1) 可用数据线供电,电压范围:3.0~5.5V;
(2) 测温范围:-55+125℃,在-10+85℃时精度为±0.5℃;
(3) 可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、0.125℃和 0.0625℃;
(4) 12 位分辨率时最多在 750ms 内把温度值转换为数字;
(5) 负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20 内部结构主要由四部分组成:64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。DS18B20 的管脚排列如图所示。 ,内部结构图如下图所示。
经过单线接口访问DS18B20的协议如下:
初始化;
ROM操作命令;
存储器操作命令;
处理/数据;
Zigbee 很容易建立起无线传感网,低成本是我们研究zigbee 的目的。
硬件:PC 机一台 ;ZB2530(底板、核心板、仿真器、USB 线、OLCD) 一套 DS18B20 一个
软件:win7 系统,IAR 8.20 集成开发环境、串口助手
实验中用到了串口和P0_7,相关寄存器如下:
位 | 名称 | 复位 | R/W | 描述 |
7:6 | - | 0 | R0 | 保留 |
5 | OVFIF | 0 | R/W0 | 定时器1计数器溢出中断标志。当计数器在自由运行或按模计数模式下达到最终计数值时设置,当在正/倒计数模式下达到零时倒计数。写1没有影响。 |
4 | CH4IF | 0 | R/W0 | 定时器1通道4中断标志,当通道4中断条件发生时设置,写1没有影响。 |
3 | CH3IF | 0 | R/W0 | 定时器1通道3中断标志,当通道3中断条件发生时设置,写1没有影响。 |
2 | CH2IF | 0 | R/W0 | 定时器1通道2中断标志,当通道2中断条件发生时设置,写1没有影响。 |
1 | CH1IF | 0 | R/W0 | 定时器1通道1中断标志,当通道1中断条件发生时设置,写1没有影响。 |
0 | CH0IF | 0 | R/W0 | 定时器1通道0中断标志,当通道0中断条件发生时设置,写1没有影响。 |
U0DBUF | USART 0接收/发送数据缓存 |
/**Includes*********************************************************************/ #include <iocc2530.h> #include <stdio.h> #include <string.h> #include "ds18b20.h" #include "LCD.h" /**宏定义***********************************************************************/ //定义数据类型 typedef unsigned char uchar; typedef unsigned int uint; #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0]) #define FLOAT_TEMP 1 //输出更高精度时打开此注释 /**函数声明*********************************************************************/ void InitCLK(); void InitUart(); void UartSendString(char *Data, int len); /**全局变量*********************************************************************/ extern void Delay_ms(unsigned int k);//外部函数ms的声明 /** * @brief 主函数 * @param None * @retval None */ void main() { char str[9]="DS18B20:"; char strTemp[30]; float fTemp; InitCLK(); //设置系统时钟源 InitUart(); //串口初始化 P0SEL &= 0x7f; //DS18B20的io口初始化 LCD_Init(); //oled 初始化 LCD_CLS(); //屏全亮 LCD_welcome(); while(1) { memset(strTemp, 0, ARRAY_SIZE(strTemp)); //厂家提供的程序温度值不带小数,Ds18B20本身是支持1位小数位的,修改后使其支持,精度更高 #if defined(FLOAT_TEMP) fTemp = floatReadDs18B20(); //温度读取函数 带1位小数位 sprintf(strTemp, "%s%.01f", str, fTemp); //将浮点数转成字符串 UartSendString(strTemp, strlen(strTemp)); //通过串口发送温度值到电脑显示 #else ucTemp = ReadDs18B20(); //温度读取函数 //strTemp[0] = ucTemp/10+48; //取出十位数 //strTemp[1] = ucTemp%10+48; //取出个位数 sprintf(strTemp, "%s%d%d", str, ucTemp/10, ucTemp%10); UartSendString(strTemp, strlen(strTemp)); //通过串口发送温度值到电脑显示 #endif LCD_P8x16Str(0, 5, (unsigned char*)strTemp); UartSendString("\r\n", 2); // 回车换行 Delay_ms(1000); //延时函数使用定时器方式 } } /** * @brief 设置系统时钟源 * @param None * @retval None */ void InitCLK() { CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ } /** * @brief 串口初始化函数 * @param None * @retval None */ void InitUart() { PERCFG = 0x00; //位置1 P0口 P0SEL = 0x0c; //P0用作串口 P2DIR &= ~0xc0; //P0优先作为UART0 U0CSR |= 0x80; //串口设置为UART方式 U0GCR |= 11; U0BAUD |= 216; //波特率设为115200 U0CSR |= 0x40; //UART接收器使能 UTX0IF = 0; //UART0 TX中断标志初始置位0 } /** * @brief 串口发送函数 * @param Data:发送缓冲区 len:发送长度 * @retval None */ void UartSendString(char *Data, int len) { uint i; for(i=0; i<len; i++) { U0DBUF = *Data++; while(UTX0IF == 0); UTX0IF = 0; } }
串口显示的温度如下图,用手摸着18B20 发现温度明显在变化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。