DS18B20温度转化

程序设计流程:

复位 写入命令字 : 0xcc (跳过ROM指令), 0x44(开始温度转换)

跳过命令字:因为DS18b20是单总线设备,而单总线可以挂载很多的设备,ROM是用来存放设备的id号。

延时700~900ms 等待温度转换完成

复位 写入命令字: 0xcc(跳过ROM指令),0xbe(读取高速暂存器,一共有9个字节)

读取高速暂存器的0字节和1字节(即LSB和MSB)获得温度数据

复位,读取操作结束。

整合数据: 将LSB和MSB整合为1个16位的数据

判断数据符号 为正还是为负 :数据为带符号的16位补码形式

16位 高5位符号位,低中间7位整数部分,低4位小数部分

高5位为0 正数 高5位为1 负数 DS18B20分辨率0.0625

正数直接乘以0.0625 负数取反+1乘以0.0625

注意上电复位的时候为0x50,+85摄氏度

注意的问题; 底层驱动函数的延时时间和单片机的时钟是否一致,直接影响能否产生应答

数据接收定义的数据类型:例如温度产生的是16位的数据,就不能定义为char 型数据

再等待读取温度的时候,数码管也要显示,

具体步骤:

创建工程,首先要将底层驱动函数放入到创建的文件夹目录下

设置位选函数,设置数码管一位显示函数,设置数码管扫描函数(扫描函数的延时为int类型500),为了消隐,除了打开要显示的函数外,还要将其他的数码管关闭

然后是 读取DS18B20函数(初始化有三次,第一次打开温度读取,第二次打开缓存器,第三次关闭)缓存器中读取数据是先读取的低位数据(数据读取类型是char8位),然后定义全局变量(int型16位),

接收数据: 首先先接收高位的数据,然后右移8位接收低位的数据(或上低位数据) 数据一共有16位,

只要整数 向右移动4位, 如果要小数,右移4位后*10,然后低位数据与上 0x0f 再*0.625(分辨率为0.0625,为的是避免浮点数的操作) 然后再将又移的数据和低位数据相加  

右移后乘以10,因为整型变量,乘以10后相加便不用操作浮点数了。方便快捷 直接相加后第四位最前面的一位用带小数点的数显示

#include <STC15F2K60S2.H>
#include "onewire.h"
unsigned char code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

unsigned char code SMG_IsDot[10] = {0x40,0x79,0x24,
	0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int dat=0;
void smgdelay(unsigned int i)
{
	while(i--);
	
}
void select138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2=(0x1f&P2)|0x80;
		break;
		case 5:
			P2=(0x1f&P2)|0xa0;
		break;
		case 6:
			P2=(0x1f&P2)|0xc0;
		break;
		case 7:
			P2=(0x1f&P2)|0xe0;
		break;
		case 0:
			P2=(0x1f&P2)|0x00;
		break;
	
	}
}
void smgshow_bite(unsigned char date,unsigned char pos)
{ 	
	select138(6);
	P0=0x01<<pos;
	select138(7);
	P0=date;

}
void smgshowall()
{ 	
	select138(6);
	P0=0xff;
	select138(7);
	P0=0xff;

}
void smgshow()
{
	smgshow_bite(SMG_NoDot[dat%10],7);
	smgdelay(500);
	smgshow_bite(SMG_NoDot[(dat%100)/10],6);
	smgdelay(500);
	smgshow_bite(0xff,5);
	smgdelay(500);
	smgshow_bite(0xff,4);
	smgdelay(500);
	smgshow_bite(0xff,3);
	smgdelay(500);
	smgshow_bite(0xff,2);
	smgdelay(500);
	smgshow_bite(0xff,1);
	smgdelay(500);
	smgshow_bite(0xff,0);
	smgdelay(500);
	smgshowall();	
	
}
void delay(unsigned int i)
{
	while(i--)
	{
	smgshow();
	}
}
void temputer()
{
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(100);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	init_ds18b20();
	dat=MSB;
	dat<<=8;
	dat=dat|LSB;
	
	dat=dat>>4;
//	if((dat&0xf800)==0x0000)
//	{
//		dat>>=4;
//		dat=dat*10;
//		dat=dat+(LSB&0x0f)*0.625;
//	
//	}
}


void main()
{
	while(1)
	{
	temputer();
	smgshow();
	
	}

}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DS18B20是一种数字温度传感器,它采用单总线接口进行通信。要进行温度转换,您可以按照以下步骤进行操作: 1.发送启动转换命令:在总线上发送0x44命令,此命令告诉传感器开始进行温度转换。 2.等待转换完成:转换时间取决于您设置的分辨率(9位、10位、11位或12位),一般为不到1秒到750毫秒不等。您可以使用计时器或延迟函数等待转换完成。 3.读取温度值:将转换结果从传感器读取到您的控制器中。发送读取命令0xBE,然后从传感器读取温度值。 4.将温度值转换为实际温度:根据DS18B20的数据手册中的公式将读取到的温度值转换为实际温度。公式为:Temperature=(MSB<<8 | LSB)*0.0625。 下面是一个简单的示例代码,可供您参考: ``` #include <OneWire.h> // DS18B20的引脚 #define ONE_WIRE_BUS 2 // 初始化OneWire对象 OneWire ds(ONE_WIRE_BUS); void setup() { Serial.begin(9600); } void loop() { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; // 搜索DS18B20传感器 if (!ds.search(addr)) { Serial.println("No more addresses."); ds.reset_search(); delay(250); return; } // 验证地址是否有效 if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } // 判断传感器类型 switch (addr[0]) { case 0x10: Serial.println("DS18S20"); type_s = 1; break; case 0x28: Serial.println("DS18B20"); type_s = 0; break; case 0x22: Serial.println("DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } // 向传感器发送启动转换命令 ds.reset(); ds.select(addr); ds.write(0x44, 1); // 等待转换完成 present = ds.reset(); ds.select(addr); ds.write(0xBE); // 读取温度值 for (i = 0; i < 9; i++) { data[i] = ds.read(); } // 将温度值转换为实际温度 int16_t raw = (data[1] << 8) | data[0]; float celsius = (float)raw / 16.0; Serial.print("Temperature: "); Serial.print(celsius); Serial.println("C"); delay(1000); } ``` 注意:在使用DS18B20传感器时,您需要引入OneWire库。您可以在Arduino IDE的“工具”菜单中选择“库管理器”,然后搜索“OneWire”进行安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值