基于STM32的 DS18b20 驱动程序.docx
《基于STM32的 DS18b20 驱动程序.docx》由会员分享,可在线阅读,更多相关《基于STM32的 DS18b20 驱动程序.docx(9页珍藏版)》请在冰豆网上搜索。
基于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;//清空计数器
}
//=================================================================//
/*写得一般,希望大家能给点建议!
*/