ds18b20传感器驱动代码及一点笔记

关于温度处理函数的一些笔记:
从ds18b20读取到的值带有4位小数,二进制0.0001在十进制中为0.0625,二进制在运算中自动转换成十进制乘以0.0625。再乘以10或100是为了防止数值过小,在浮点类型转换为整数类型时精度丢失,后面取整取余的时候再调整回来就好了。+0.5是为了四舍五入,计算机小数是直接舍弃的。
关于温度负值的处理"取反后加一"和"减一后取反"结果是相同的。

  • 取反后加一:原码=补码的补码
  • 减一后取反:补码的逆运算
//基于51单片机
sbit DQ = P1^1;
int Ds18b20_Init()  //ds18b20初始化
{
	DQ = 0;
	Delay10us(65);
	DQ = 1;
	Delay10us(7);
	if(DQ==1){
		return 1;//初始化成功
	}
	else{
		return 0;//初始化失败
	}
}

void Ds18b20_Write_Cmd(unsigned char dat)//向ds18b20写一个字节的命令
{
	unsigned int i,j;
	for(j=0;j<8;j++)
	{
		DQ = 0;
		i++;
		DQ = dat & 0x01;
		i = 6;
		Delay10us(7);
		DQ = 1;
		dat >>= 1;
	}
}

unsigned char Ds18b20_Read_Date() //从ds18b20读取一个字节的命令
{
	unsigned char date,mid_date;
	unsigned int i,j;
	for(j=0;j<8;j++)
	{
		DQ = 0;
		i++;
		DQ = 1;
		i++;
		i++;
		mid_date = DQ;
		date = (date >> 1)|(mid_date << 7);
		i = 4;
		while(i--);
	}
	return date;
}

void ds18b20_begina()//ds18b20开始温度测量
{
	Ds18b20_Init();
	DelayMs(1);
	Ds18b20_Write_Cmd(0xcc);
	Ds18b20_Write_Cmd(0x44);
	DelayMs(1000);
}

unsigned int datepros(int temp_2) //温度数据处理函数
{
	float temp_float;
	if(temp_2<0)
	{
    Lcd1602_write_cmd(0x80+0x45);
		Lcd1602_write_date('-');
		temp_2=temp_2-1;
		temp_2=~temp_2;
		temp_float=temp_2;
		temp_2=temp_float*0.0625*10+0.5;
	}
	else
	{
    Lcd1602_write_cmd(0x80+0x45);
		Lcd1602_write_date('+');
		temp_float=temp_2;
		temp_2=temp_float*0.0625*10+0.5;
	}
	temp_1=temp_2/10;
	return temp_2;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值