51单片机DS18B20温度传感器的初始化、读写函数的编写

DS18B20有三个引脚,其中两个引脚接入电源。单片机通过对第三个引脚进行高低电平的输入和输出实现数据的传输。
下面是DS18B20常用的指令表,第三个引脚在接收到相应的数据后能够制做出对应的响应。

代码功能
33H读取rom编码
55H发出指令并发送64位ROM编码,访问传感器总线上的编码
0F0H识别总线上搭载传感器的个数
0CCH忽略ROM地址,直接向DS18B20发温度变换指令
0ECH执行后只有温度超过设定值域才做出相应
44H启动传感器进行温度转换,结果存入RAM
0BEH读取RAM中9个字节的内容
4EH发出向内部RAM的3、4字节写上、下限温度数据指令,之后传送两个字节的数据
48H将RAM中第3、4字节的内容复制到总线上
0B8H将总线中的内容恢复到总线中
0B4H设置供电方式。‘0’寄生供电,‘1’外接电源供电
控制温度传感器总共只需要三步:传感器初始化、读取数据以及写入数据(写入数据相当于单片机的控制指令,读取数据则是完成对上位机的响应)
传感器数据初始化
①数据线拉到低电平
②延时480微秒
③数据线拉到高电平
④延时等待80微秒(初始化成功时在15~60微秒时间内产生一个由传感器返回的低电平,由初始化判断该传感器是否存在)
⑤若单片机读取到上一步反馈的低电平数据,则延时480微秒。
传感器初始化函数(DS18B20表示传感器连接到51单片机上的引脚)
uchar Ds18b20Init()       //初始化。成功返回1,不成功返回0.
 {
	uchar i;
	DS18B20 = 0;		     //将总线拉低480微秒~960微秒
	i = 70;	 
	while(i--);			 //延时642微秒
	DS18B20 = 1;			 //拉高总线,等待后续反馈
	i = 0;
	while(DS18B20)	    //等待DS18B20拉低总线
	{ 
		Delay1ms(1);      //定义的延迟1ms的延迟函数
		i++;
		if(i>5)           //等待5ms以上
		{
			return 0;      //初始化失败
		}
	}
	return 1;             //初始化成功
}

读取传感器数据
① 将数据线拉低
② 延时1微秒
③ 将数据拉高,释放总线读取数据
④ 延时10微秒
⑤ 读取数据线状态得到一个状态位
⑥ 延时45微秒
通过上述方法重复读取位,达到读取字节的目的。
传感器数据读取函数

uchar Ds18b20ReadByte() //通过读取8次状态位达到读取字节的目的
{
	uchar byte, bi;
	uint i, j;	
	for(j=8; j>0; j--)
	{
		DS18B20 = 0;		//先将总线拉低
		i++;
		DS18B20 = 1;		//然后释放总线
		i++;
		i++;				//延时6微秒等待数据稳定
		bi = DS18B20;	   //读取数据,从最低位开始读取
		byte = (byte >> 1) | (bi << 7);	//从最低位开始记录,将byte依次右移					  
		i = 4;				//读取完之后等待48微秒再接着读取下一个数
		while(i--);
	}				
	return byte;         //将读取完的字节保存
}

传感器写数据
① 总线置低电平
② 延时15微秒
③ 发送一位数据
④ 延时60微秒
⑤ 总线置高电平
⑥ 发送完毕后总线置高电平
传感器写函数

void Ds18b20WriteByte(uchar dat)//函数通过循环写8个位实现写一个字节
{
	uint i, j;
	for(j=0; j<8; j++)
	{
		DS18B20 = 0;	     	//每写入一位数据之前先把总线拉低
		i++;
		DSPORT = dat & 0x01;   //然后写入一个数据,从最低位开始
		i=6; 
		while(i--);             //延时68微秒
		DS18B20 = 1; //释放总线,给总线1微秒恢复时间才能接着写入下一位			dat >>= 1;
	}
}

在完成了上面的函数之后就能够对温度传感器写入数据和读取其中的数据,通过写特定的指令来完成特定的操作。

传感器读取温度函数

int Ds18b20ReadTemp()  //读取的温度有两个字节,分别用tml和tmh存储两个字节
{
	int temp = 0;
	uchar tmh, tml;
	Ds18b20Init();						//传感器初始化
	Delay1ms(1);						//延时1微秒
	Ds18b20WriteByte(0xcc);			//跳过读取序列号操作		 
	Ds18b20WriteByte(0x44);			//温度转换指令		
	//完成温度转换功能
	Ds18b20Init();						//传感器初始化
	Delay1ms(1);						
	Ds18b20WriteByte(0xcc);	 		//跳过读取序列号操作
	Ds18b20WriteByte(0xbe);			//发送读取温度指令
	//然后等待转换完后发送读取温度命令
	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
	tmh = Ds18b20ReadByte();		//再读高字节
	temp = tmh;			//先存高字节,后面通过移位存储低字节
	temp <<= 8;
	temp |= tml;
	return temp;
}

  • 18
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
51单片机ds18b20温度传感器和1602液晶显示屏连接起来,实现温度的监测并显示在屏幕上。 首先,我们需要将ds18b20温度传感器51单片机进行连接。ds18b20温度传感器是一种数字温度传感器,使用单总线协议与单片机进行通信。我们将ds18b20温度传感器的VCC引脚连接到5V电源,GND引脚连接到地,而DQ(数据引脚)连接到51单片机的任意IO口。 然后,我们需要将1602液晶显示屏与51单片机进行连接。连接时,VCC引脚连接到5V电源,GND引脚连接到地,而RS、RW、E、D4、D5、D6、D7分别连接到51单片机的相应IO口。此外,还需要将1602液晶显示屏的V0引脚通过一个可调电位器连接到地,以调节显示屏的对比度。 接下来,我们需要编写51单片机的程序来读取ds18b20温度传感器的数据并将其显示在1602液晶显示屏上。通过使用相应的单总线协议来读取ds18b20温度传感器的数据,然后使用LCD1602液晶显示屏的驱动程序来将数据显示在屏幕上。 具体步骤包括初始化液晶显示屏、初始化ds18b20温度传感器、进行温度读取并保存在变量中,最后将温度数据转化为ASCII码并利用液晶显示屏驱动程序将其显示在1602液晶显示屏上。 通过以上的连接和程序编写,我们可以实现51单片机ds18b20温度传感器在1602显示的功能。这样,我们就可以通过屏幕上的数字来实时监测环境的温度了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值