DS18B20-STM32温度读取

command

在这里插入图片描述

data

在这里插入图片描述
高地位组合即为温度数据

1. 初始化时钟

在这里插入图片描述

void Init_DS18B20(void) 
{
	 
  char  CY = 1;
    while (CY)
    {
		DQ_OUT();
	  DQ_SET_H(); 
	  delay_us(20); 
        DQ_SET_L();                     //送出低电平复位信号
        delay_us(360);              //延时至少480us
        delay_us(240);
        DQ_SET_H();                    //释放数据线
        delay_us(50);               //等待60us
        DQ_IN();
		CY = DQ_READ();                    //检测存在脉冲
 
		 delay_us(240); 
    } 
} 

特别注意读写字节数据顺序由低到高,不可弄错

2.主机写入数据

在这里插入图片描述


void WriteOneChar(unsigned char dat) 
{ 
	DQ_OUT();
  unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  for(i=0;i<8;i++) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 
  {
   DQ_SET_L(); //在开始另一个写周期前必须有1us以上的高电平恢复期。 
   delay_us(1); 
	  if(dat&0x01)
  {
	  DQ_SET_H();
//	  delay_us(1); 
  }
  else
	  DQ_SET_L(); 
  
  delay_us(60); 
 
   DQ_SET_H();
//  delay_us(1); 
  
   dat>>=1;
  } 
 
} 

3.读时序

在这里插入图片描述

char ReadOneChar()  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0; 
for (i=0;i<8;i++) //一个字节有8位 
{ 
	DQ_OUT(); 
 DQ_SET_L();  //低起始
 dat>>=1; 
//DQ_SET_H();
DQ_IN();
 if(DQ_READ()==1) 
 dat|=0x80; 
 delay_us(45);
// 	DQ_OUT(); 
 DQ_SET_H();
 
} 
return(dat);
 
} 

读取温度数据

char  ReadTemperature(void) 
{

unsigned char tempL=0; //设全局变量
unsigned char tempH=0; 
unsigned int TEMPZ;//测量到的温度的整数部分
 
  Init_DS18B20(); //初始化
//	while(chack_ds18b20())
//	{
//	printf("err");
//	}
 WriteOneChar(0xcc); //跳过读序列号的操作
 WriteOneChar(0x44); //启动温度转换
//	chack_ds18b20(); 
  Init_DS18B20(); //初始化
 WriteOneChar(0xcc); //跳过读序列号的操作 
 WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) 
 tempL=ReadOneChar(); //读出温度的低位LSB
 tempH=ReadOneChar(); //读出温度的高位MSB 
 
 	  TEMPZ= ((tempH<<4)|(tempL>>4)); 
	 if(TEMPZ>=128)
	 {
	 TEMPZ=~TEMPZ+1; 
	 }		  
		return  TEMPZ;

}

感谢大佬的分享
https://blog.csdn.net/weixin_47457689/article/details/124081703

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值