STM32 DS18B20实验
项目介绍
使用STM32与DS18B20进行连接,并通过串口函数将数据传送到PC机进行显示。
知识点
- 1、DS18B20是一种单总线的温度传感器。现场温度直接通过单总线以数字方式进行传输。
- 2、每一个DS18B20均具有一个唯一的64位的ROM序列号,这个唯一的序列号可以保证在单总线上挂载多个DS18B20设备。
- 3、DS18B20具有9字节的RAM,其中0,1字节用于暂存温度信息,后三位为EERAM用于存储配置信息。
- 4、DS18B20经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
- 5、DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位–>SKIP ROM命令( 0XCC)–>发开始转换命令( 0X44) –>延时–>复位–>发送 SKIP ROM 命令( 0XCC)–>发读存储器命令( 0XBE) –>连续读出两个字节数据(即温度)–>结束
- 6、单总线是DALLAS公司推出的外围串行扩展总线。单总线只用一根数据输出/输入线DQ,既传输数据位,又传输时间同步信号,而且数据是双向的。
部分代码
- 1、这部分代码为对DS18B20的主要操作。包括了初始化,读写数据。
#include "ds18b20.h"
/*******************************************************************************
* 函 数 名 : ds18b20_init
* 函数功能 : IO端口时钟初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : DQININT
* 函数功能 : 输入配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DQININT() //输入配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : DQOUTINT
* 函数功能 : 输出配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DQOUTINT() //输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=dq;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : ds18b20init
* 函数功能 : DS18B20初始化时序
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20init()
{
DQOUTINT();//输出
ds18b20_dq_L;
delay_us(480);//延时480微妙
ds18b20_dq_H;
delay_us(480);//延时480微妙
}
/*******************************************************************************
* 函 数 名 : ds18b20wr
* 函数功能 : DS18B20写数据时序
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void ds18b20wr(u8 dat)
{
u8 i=0;
DQOUTINT();//输出
for(i=0;i<8;i++)
{
ds18b20_dq_L; //拉低
delay_us(15);//延时15微妙
if((dat&0x01)==1)
{
ds18b20_dq_H;
}
else
{
ds18b20_dq_L;
}
delay_us(60);//延时60微妙
ds18b20_dq_H;
dat>>=1;//准备下一位数据的发送
}
}
/*******************************************************************************
* 函 数 名 : DS18b20rd
* 函数功能 : DS18B20读数据时序
* 输 入 : 无
* 输 出 : value
*******************************************************************************/
u8 DS18b20rd()
{
u8 i=0,value=0;
for(i=0;i<8;i++)
{
value>>=1;
DQOUTINT();//输出
ds18b20_dq_L; //拉低
delay_us(4);//延时4微妙
ds18b20_dq_H;
delay_us(10);//延时10微妙
DQININT(); //输入配置
if(GPIO_ReadInputDataBit(GPIO_ds18b20,dq)==1)
{
value|=0x80;//读数据 从低位开始
}
delay_us(45);//延时45微妙
}
return value;
}
/*******************************************************************************
* 函 数 名 : readtemp
* 函数功能 : DS18B2温度寄存器配置,温度读取
* 输 入 : 无
* 输 出 : value
*******************************************************************************/
double readtemp() //读取温度内需要复位的
{
u16 temp;
u8 a,b;
double value;
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0x44); //发送温度转换指令
delay_ms(800);
ds18b20init(); //初始化
ds18b20wr(0xcc); //发送忽略ROM指令
ds18b20wr(0xbe); //发读暂存器指令
a=DS18b20rd(); //温度的低八位
b=DS18b20rd(); //温度的高八位
temp=b;
temp=(temp<<8)+a;
if((temp&0xf800)==0xf800)
{
temp=(~temp)+1;
value=temp*(-0.0625);
}
else
{
value=temp*0.0625;
}
return value;
}