【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)

单片机型号:STM32F103

源码下载链接(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

现要求完成温度采集并在串口或液晶屏上显示。我们这里使用DS18B20实现,它的一些特性大家可以网上搜搜,资料很多。

18B20的两个时序图很重要,程序的完成就是按照时序图完成的。

复位的时序图:

读写0/1的时序图:

ROM命令
总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样, 1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?

在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。 DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少。
我们这里只讲一条总线上只接一个器件的指令和程序。
              Skip ROM(跳过 ROM): 0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。

RAM 存储器操作指令

              Read Scratchpad(读暂存寄存器): 0xBE
              DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
              Convert Temperature(启动温度转换): 0x44
              当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。

 

电路图设计:

接线表设计:

模块(18B20)STM32的IO口功能设置
GNDGND-
VCC3.3V-
TDQPA6输入输出模式需要来回切换
-PA9TX PA9
-PA10RX PA10

标准库实现温度采集:

代码:

/****************************************
函数名称:void mode_output(void)
函数参数:无参
函数返回值:无
函数功能:输出模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_output(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
  
  	/* Configure Ports */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/****************************************
函数名称:void mode_input(void)
函数参数:无参
函数返回值:无
函数功能:输入模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_input(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
  
  	/* Configure Ports */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/****************************************
函数名称:void ds18b20_rst(void)
函数参数:无参
函数返回值:无
函数功能:复位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_rst(void)
{
  mode_output();                //输出模式
  GPIO_ResetBits(GPIOA,GPIO_Pin_6);              //拉低DQ引脚
  delay_us(600);         //延时480-960us
  GPIO_SetBits(GPIOA,GPIO_Pin_6);              //拉高DQ引脚  
  mode_input();
  while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6));         //等待器件应答(器件拉低),约15-60us后
  while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6));        //应答脉冲出现后,等待器件拉高,约60-240us后
}

/****************************************
函数名称:void ds18b20_write_zero(void)
函数参数:无参
函数返回值:无
函数功能:写0位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_zero(void)
{
  mode_output();                    //输出模式
  GPIO_ResetBits(GPIOA,GPIO_Pin_6);                   //拉低引脚 
  delay_us(80);              //延时60-120us
  GPIO_SetBits(GPIOA,GPIO_Pin_6);                  //拉高引脚
  delay_us(2);
} 

/****************************************
函数名称:void ds18b20_write_one(void)
函数参数:无参
函数返回值:无
函数功能:写1位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_one(void)
{
  mode_output();                           //输出模式
  GPIO_ResetBits(GPIOA,GPIO_Pin_6);
  delay_us(2);
  GPIO_SetBits(GPIOA,GPIO_Pin_6);
  delay_us(80);
} 

/****************************************
函数名称:void ds18b20_read_bit(void)
函数参数:无参
函数返回值:无
函数功能:读1位数据
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_bit(void)
{
  unsigned char data;
  mode_output();
  GPIO_ResetBits(GPIOA,GPIO_Pin_6);
  delay_us(2);
  GPIO_SetBits(GPIOA,GPIO_Pin_6);;
  mode_input();
  delay_us(5);
  if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
    data=1;
  else
    data=0;
  delay_us(500);  
  return data;
}

/****************************************
函数名称:void ds18b20_write_byte(void)
函数参数:无参
函数返回值:无
函数功能:写一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_byte(unsigned char data)
{
  unsigned char i,testb;
  mode_output();
  for(i=0;i<8;i++)
  {
    testb=data&0x01;                 //从低位开始写
    data>>=1;
    if(testb)
      ds18b20_write_one();
    else
      ds18b20_write_zero();
  }
}

/****************************************
函数名称:unsigned char ds18b20_read_byte(void)
函数参数:无参
函数返回值:无
函数功能:读一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_byte(void)
{
  unsigned char i,j,data=0;
  for(i=0;i<8;i++)
  {
    j=ds18b20_read_bit();
    data=(j<<7)|(data>>1);      //从低位开始读
  }
  return data;
}

/****************************************
函数名称:void ds18b20_start(void)
函数参数:无参
函数返回值:无
函数功能:开始转换
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_start(void)
{                                                                  
   ds18b20_rst();              
   ds18b20_write_byte(0xcc);   // 跳过ROM
   ds18b20_write_byte(0x44);   //温度转换
}

/****************************************
函数名称:void ds18b20_init(void)
函数参数:无参
函数返回值:无
函数功能:初始化
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_init(void)
{
  gpio_init();     //此引脚需根据相应的单片机进行配置
  ds18b20_rst();
} 

/****************************************
函数名称:short get_tempetature(void)
函数参数:无参
函数返回值:无
函数功能:获取温度
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
short get_tempetature(void)
{
   unsigned char TL,TH;
   short tem;
   ds18b20_start();           //开始转换
   delay_ms(700);             //等待转换完成
   ds18b20_init();    
   ds18b20_write_byte(0xcc);   //跳过ROM
   ds18b20_write_byte(0xbe);   //读取暂存寄存器    
   TL=ds18b20_read_byte();     //低八位 
   TH=ds18b20_read_byte();     //高八位,注意前五位为符号位只有全为0的时候温度是正的      
   tem=TH;                      //获得高八位
   tem<<=8;   
   tem+=TL;                     //获得底八位
   return tem;    
}

 

 

实现效果:

 

HAL库实现温度采集:

实现效果:

 

需要的可以给我留言,我发给大家。

源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

  • 7
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值