基于STM32的 DS18b20 驱动程序.docx

上传人:b****3 文档编号:3887626 上传时间:2022-11-26 格式:DOCX 页数:9 大小:16.54KB
下载 相关 举报
基于STM32的 DS18b20 驱动程序.docx_第1页
第1页 / 共9页
基于STM32的 DS18b20 驱动程序.docx_第2页
第2页 / 共9页
基于STM32的 DS18b20 驱动程序.docx_第3页
第3页 / 共9页
基于STM32的 DS18b20 驱动程序.docx_第4页
第4页 / 共9页
基于STM32的 DS18b20 驱动程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

基于STM32的 DS18b20 驱动程序.docx

《基于STM32的 DS18b20 驱动程序.docx》由会员分享,可在线阅读,更多相关《基于STM32的 DS18b20 驱动程序.docx(9页珍藏版)》请在冰豆网上搜索。

基于STM32的 DS18b20 驱动程序.docx

基于STM32的DS18b20驱动程序

基于STM32的DS18b20驱动程序

//=========================DS18b20.h=========================//

/*-----------------------------------------------

DS18b20驱动程序

------------------------------------------------*/

#ifndef__DS18B20_H

#define__DS18B20_H

typedefenum{FAILED=0,PASSED=!

FAILED}TestStatus;

#defineDQ_GPIOGPIOD

#defineDQ_GPIO_PinGPIO_Pin_5

//REGISTERCOMMANDS

#defineREGISTER_9_BITS0x1F

#defineREGISTER_10_BITS0x3F

#defineREGISTER_11_BITS0x5F

#defineREGISTER_12_BIT20x7F

//ROMCOMMANDS

#defineROM_Search_Cmd0xF0

#defineROM_Read_Cmd0x33

#defineROM_Match_Cmd0x55

#defineROM_Skip_Cmd0xCC

#defineROM_AlarmSearch_Cmd0xEC//DS18b20FUNCTIONCOMMANDS

#defineConvert_T0x44#defineWrite_Scratchpad0x4E

#defineRead_Scratchpad0xBE

#defineCopy_Scratchpad0x48

#defineRecall_EEPROM0x88

#defineRead_PowerSupply0x84

#defineDQ_Write_1()GPIO_SetBits(DQ_GPIO,DQ_GPIO_Pin)//写1#defineDQ_Write_0()GPIO_ResetBits(DQ_GPIO,DQ_GPIO_Pin)//写0#defineDQ_ReadBit()GPIO_ReadInputDataBit(DQ_GPIO,DQ_GPIO_Pin)//读DQ上的值

externvoidGPIO_DQ_Out_Mode(void);//DQ输出模式

externvoidGPIO_DQ_Input_Mode(void);//DQ输入模式

externvoidTx_ResetPulse(void);//发送复位脉冲

externvoidRx_PresencePulse(void);//接受应答信号

externvoidWrite_OneByte_ToDS18b20(unsignedchardata);//写一个字节到18b20externunsignedcharRead_OneByte_FromDS18b20(void);//从18b20读一个字节externvoidRead_Temperature(unsignedchar*sign,unsignedchar*interger,

unsignedint*decimal);//读温度

//写配置参数TH,TL和初始化配置寄存器

externvoidWrite_EEPROM(unsignedcharTh,unsignedcharTl,unsignedchar

Register_Con);

voidDS18B20_Init(void);//初始化

#endif/*DS18B20*/

//=================================================================//

//=========================DS18b20.c================================//

#include"stm32f10x_lib.h"

#include"DS18b20.h"

#include"SysTick_Delay.h"

/******************************************函数名称:

GPIO_DQ_Out_Mode

功能:

设置DQ引脚为开漏输出模式

参数:

返回值:

*******************************************/voidGPIO_DQ_Out_Mode(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=DQ_GPIO_Pin;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出

GPIO_Init(DQ_GPIO,&GPIO_InitStructure);}

/******************************************函数名称:

GPIO_DQ_Input_Mode

功能:

设置DQ引脚为浮空输入模式

参数:

返回值:

*******************************************/voidGPIO_DQ_Input_Mode(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=DQ_GPIO_Pin;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(DQ_GPIO,&GPIO_InitStructure);}

/******************************************函数名称:

Tx_ResetPulse

功能:

发送复位脉冲

参数:

返回值:

*******************************************/voidTx_ResetPulse(void)

{

GPIO_DQ_Out_Mode();

DQ_Write_0();//复位脉冲

Delay_Nus(500);//至少保持480us

DQ_Write_1();//加速上升沿速度

Delay_Nus

(1);

}

/******************************************函数名称:

Rx_PresencePulse

功能:

接受应答信号

参数:

返回值:

*******************************************/voidRx_PresencePulse(void)

{

GPIO_DQ_Input_Mode();

while(DQ_ReadBit());//等待DS18b20应答

while(DQ_ReadBit()==0);//DS18b20将总线拉低60~240us,然后总线由上拉电阻拉高

Delay_Nus(300);

GPIO_DQ_Out_Mode();//接受完成,主机重新控制总线

}

/******************************************函数名称:

Write_OneByte_ToDS18b20

功能:

写一个字节到DS18b20

参数:

返回值:

*******************************************/voidWrite_OneByte_ToDS18b20(unsignedchardata){

unsignedchari;

GPIO_DQ_Out_Mode();

for(i=0;i<8;i++)

{

if(data&0x01)//低位在前

{

//写1

DQ_Write_0();//写时间空隙总是从总线的低电平开始

Delay_Nus(8);//15us内拉高

DQ_Write_1();

Delay_Nus(80);//整个写1时隙不低于60us

}

else

{

//写0

DQ_Write_0();

Delay_Nus(110);//保持在60us到120us之间

DQ_Write_1();

Delay_Nus(5);

}

data>>=1;

}

}

/******************************************

函数名称:

Read_OneByte_FromDS18b20功能:

从DS18b20读一个字节

参数:

返回值:

读出的数据

*******************************************/

unsignedcharRead_OneByte_FromDS18b20(void)

{

unsignedchari,data=0;

for(i=0;i<8;i++)

{

GPIO_DQ_Out_Mode();

data>>=1;

DQ_Write_0();

Delay_Nus

(2);

GPIO_DQ_Input_Mode();

Delay_Nus

(1);

if(DQ_ReadBit())

{

data|=0x80;

}

Delay_Nus(70);//等待这一位数据完成传输

}

GPIO_DQ_Out_Mode();

returndata;

}

/******************************************函数名称:

Read_Temperature

功能:

读取温度信息

参数:

*sign-保存符号(零上或零下)

*integer-保存整数部分

*decimal-保存小数部分

返回值:

*******************************************/voidRead_Temperature(unsignedchar*sign,

unsignedchar*interger,

unsignedint*decimal){

unsignedchara=0;

unsignedcharb=0;

//volatileunsignedcharc=0;

//volatileunsignedchard=0;

//volatileunsignedchare=0;

unsignedinttmp;

DS18B20_Init();

Write_OneByte_ToDS18b20(ROM_Read_Cmd);

DS18B20_Init();

Write_OneByte_ToDS18b20(ROM_Skip_Cmd);//跳过读序列号操作

Write_OneByte_ToDS18b20(Convert_T);//启动温度转换

Delay_Nms(780);//等待DS18b20转换完成

DS18B20_Init();

Write_OneByte_ToDS18b20(ROM_Skip_Cmd);

Write_OneByte_ToDS18b20(Read_Scratchpad);//读取寄存器内容(可以从寄存器0读到寄存器8)

a=Read_OneByte_FromDS18b20();//温度低8位

b=Read_OneByte_FromDS18b20();//温度高8位

//c=Read_OneByte_FromDS18B20();//TH

//d=Read_OneByte_FromDS18B20();//TL

//e=Read_OneByte_FromDS18B20();//ConfigurationRegister

Tx_ResetPulse();//中断数据读取

tmp=(b<<8)|a;

if(b&0xF0)

{

*sign=1;//符号部分

tmp=~tmp+1;

}

else

{

sign=0;

}

*interger=(tmp>>4)&0x00FF;//整数部分

*decimal=(tmp&0x000F)*625;//小数部分

}

/******************************************函数名称:

Write_EEPROM

功能:

写配置参数

参数:

Th-报警温度上限

Tl-报警温度下限

Register_Con-控制寄存器的值

返回值:

读出的数据

*******************************************/voidWrite_EEPROM(unsignedcharTh,unsignedcharTl,unsignedcharRegister_Con)

{

DS18B20_Init();

Write_OneByte_ToDS18b20(ROM_Skip_Cmd);

Write_OneByte_ToDS18b20(Write_Scratchpad);

Write_OneByte_ToDS18b20(Th);//Th=7F

Write_OneByte_ToDS18b20(Tl);//Tl=FF最高位符号位

Write_OneByte_ToDS18b20(Register_Con);//12位模式

Delay_Nms(700);

DS18B20_Init();

Write_OneByte_ToDS18b20(ROM_Skip_Cmd);

Write_OneByte_ToDS18b20(Copy_Scratchpad);//将寄存器的配置值写入EEPROM

Delay_Nms(300);

}

/******************************************函数名称:

DS18B20_Init

功能:

初始化DS18b20

参数:

返回值:

*******************************************/voidDS18B20_Init(void)

{

Tx_ResetPulse();

Rx_PresencePulse();

}

//=================================================================//

//========================要用到的其他文件============================////===========================Systick_Delay.h==========================//

/*--------------------------------------------------

利用SysTick进行精确定时

---------------------------------------------------*/#ifndef__SYSTICKDELAY_H

#define__SYSTICKDELAY_H

#include"stm32f10x_lib.h"

externvoidDelay_Nms(u16Nms);

externvoidDelay_Nus(u32Nus);

#endif/*SYSTICKDELAY_H*/

//=================================================================//

//=========================Systick_Delay.c============================//

#include"stm32f10x_lib.h"

#include"SysTick_Delay.h"

//延时Nms

//注意Nms的范围

//Nms<=0xffffff*8/SYSCLK

//对72M条件下,Nms<=1864

voidDelay_Nms(u16Nms)

{

SysTick->LOAD=(u32)Nms*9000;//给重装载寄存器赋值,9000时,将产生1ms的时基

SysTick->CTRL|=0x01;//开始倒数

while(!

(SysTick->CTRL&(1<<16)));//等待时间到达

SysTick->CTRL=0X00000000;//关闭计数器

SysTick->VAL=0X00000000;//清空计数器

}

//延时us

voidDelay_Nus(u32Nus)

{

SysTick->LOAD=Nus*9;//时间加载

SysTick->CTRL|=0x01;//开始倒数

while(!

(SysTick->CTRL&(1<<16)));//等待时间到达

SysTick->CTRL=0X00000000;//关闭计数器

SysTick->VAL=0X00000000;//清空计数器

}

//=================================================================//

/*写得一般,希望大家能给点建议!

*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1