DS18B20温度传感器 一、简介:
图示有字的一面,注意GND 和VCC不要接反。工作电压3.0v~5.5V,采集温度-55度到正125度,可编程温度9-12位,精度分别是0.5度,0.25度,0.125度0.0625度,默认都是12位,12位转换时间是750ms,9位是93.75ms,电压负压特性(不会因电源接反发热烧坏)。 二、电路连接: 接一个上拉电阻。 三、通信方式: 单总线通信: 单总线是一种具有一个总线主机和一个或若干个从机的系统。严格按照器件的时间要求进行复位,写命令,读写数据等。整个过程在一条线上进行。 四、DS18B20的内部结构: 64位光刻ROM,温度传感器,非易失性的温度报警触发器TH和TL,配置寄存器。出厂前ROM的排列是:开始8位产品类型标号(28H),接着48位是DS18B20全球唯一序列号,最后8位是前面56位的循环冗余校验码。 DS18B20存储器: Byte0和Byte1分别存储温度寄存器的低字节和高字节,这两个字节是只读的。我们一般只操作这两个字节。 五、DS18B20的指令: 命令有两种,一种ROM的指令,一种暂存器的指令。 六、操作时序: 分为4个步骤: 1. 复位:单片机发一个低电平给DS18B20,DS18B20返回一个低电平给单片机,完成唤醒握手。 2. 发送ROM命令 3. 发送暂存器指令 4. 发送数据或接受数据 单个温度测试代码: 多点测试:(两个) 步骤: 1. 先读出每个传感器的唯一ROM序列; - /*********************************
- * @函数名:DS18B20_Read_64Rom
- * @描 述:读64位的ROM 唯一标识
- * @说 明:
- * @参 数:*buffer 读出的8个字节的数据
- * @返回值:无
- *********************************/
- void DS18B20_Read_64Rom(uchar *buffer)
- {
- uchar i;
- DS18B20_Reset();//复位
- DS18B20_Write_Com(0x33);//读64位ROM
- for(i=0;i<8;i++) //读取64个字节
- buffer[i]=DS18B20_Read_Data();
- }
复制代码2. 用两个数组存读出来的序列号: 3.写入ROm序列号,并启动转换温度: - /*********************************
- * @函数名:DS18B20_Write_Rom
- * @描 述:写64ROM
- * @说 明:发送匹配ROM命令 0x55再写入8字节的ROM
- * @参 数:*buffer 要发送的存放ROM的数组
- * @返回值:无
- *********************************/
- void DS18B20_Write_Rom(uchar *buffer)
- {
- uchar i;
- DS18B20_Write_Com(0x55); //ROM匹配
- for(i = 0;i < 8;i++)
- DS18B20_Write_Com(buffer[i]); //写入8个字节的ROM
- }
- /*********************************
- * @函数名:DS18B20_Handle
- * @描 述:温度处理
- * @说 明:1. 复位 2.发送ROM命令 3.发送暂存器指令 读RAM 4.数据
- * @参 数:无
- * @返回值:无
- *********************************/
- void DS18B20_Handle(uchar *buffer)
- {
- uchar xdata value_High,value_Low;
- float num;//保存小数
- DS18B20_Reset();//复位
- //DS18B20_Write_Com(0xcc);//发送指令CCH,跳过ROM操作
- //DS18B20_Write_Com(0x33);//读64位ROM
- DS18B20_Write_Rom(buffer); //匹配ROM 并写入64ROM
- DS18B20_Write_Com(0x44);//发送指令44H,启动温度转换
- Delay10us();
- DS18B20_Reset();//复位
- DS18B20_Write_Rom(buffer); //匹配ROM 并写入64ROM
- DS18B20_Write_Com(0xbe);//发送指令BEH,读取9字节RAM数据的前两个数据
- Delay10us();
- value_Low=DS18B20_Read_Data();//先读低字节Byte0
- value_High=DS18B20_Read_Data();//高字节Byte1
- value_High<<=4;//整数的高3位
- value_High+=(value_Low&0xf0)>>4;//整数的低4位
- DS18B20_Buffer[0]=value_High;//整数
- num=(value_Low&0x0f)*0.0625;//小数
- DS18B20_Buffer[1]=(uchar)(num*100);//小数
- }
复制代码其他的都和单个测试是一样的。 测试结果: 另外附上主函数: - /*********************************
- * @函数名:main
- * @描 述:main函数,程序入口
- * @说 明:
- * @参 数:无
- * @返回值:无
- *********************************/
- void main()
- {
- //uchar a[8];//存放读出来的ROM
- Uart1_Init();//串口初始化
- Send_String("多点温度测试:\n");
- while(1)
- {
- DS18B20_Handle(DS18B20_Rom1);
- printf("温度1:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印温度
- putchar_End();//换行
- // DS18B20_Read_64Rom(a);
- // Send_String(a);
- Delay1000ms();
- DS18B20_Handle(DS18B20_Rom2);
- printf("温度2:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印温度
- Delay1000ms();
- putchar_End();//换行
- }
- }
-
复制代码DS18B20程序和资料:
DS18B20.zip
(4.21 MB, 下载次数: 113)
|