//=========================DS18b20.c================================//
#include
"stm32f10x_lib.h"
#include
"18b20.h"
#include
"delay.h"
/******************************************
函数名称:GPIO_DQ_Out_Mode
功 能:设置DQ引脚为开漏输出模式
参 数:无
返回值 :无
*******************************************/
void
GPIO_DQ_Out_Mode(void)
{
GPIO_InitTypeDef GPIO_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引脚为浮空输入模式
参 数:无
返回值 :无
*******************************************/
void
GPIO_DQ_Input_Mode(void)
{
GPIO_InitTypeDef GPIO_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
功 能:发送复位脉冲
参 数:无
返回值 :无
*******************************************/
void
Tx_ResetPulse(void)
{
GPIO_DQ_Out_Mode() ;
DQ_Write_0() ; //复位脉冲
Delay_Nus(500) ; //至少保持480us
DQ_Write_1() ; //加速上升沿速度
Delay_Nus(1) ;
}
/******************************************
函数名称:Write_OneByte_ToDS18b20
功 能:写一个字节到DS18b20
参 数:无
返回值 :无
*******************************************/
void
Write_OneByte_ToDS18b20(unsigned char data)
{
unsigned char i ;
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读一个字节
参 数:无
返回值 :读出的数据
*******************************************/
unsigned char
Read_OneByte_FromDS18b20(void)
{
unsigned char i ,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() ;
return data ;
}
/******************************************
函数名称:Read_Temperature
功 能:读取温度信息
参 数:*sign - 保存符号(零上或零下)
*integer - 保存整数部分
*decimal - 保存小数部分
返回值 :无
*******************************************/
unsigned int
Read_Temperature(void)
{
unsigned int a=0;
unsigned int b=0;
unsigned int t;
//volatile unsigned char c=0;
//volatile unsigned char d=0;
//volatile unsigned char e=0;
//
unsigned int tmp ;
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位
a=a>>4; //低位右移4位,舍弃小数部分
b=b<<4; //高位左移5位,舍弃符号位
t=a|b;
return(t); //返回角度的値
}
/******************************************
函数名称:DS18B20_Init
功 能:初始化DS18b20
参 数:无
返回值 :无
*******************************************/
void
DS18B20_Init(void)
{
Tx_ResetPulse();
}
输出是用数码管输出,输出没问题,就是18b20没有工作,无法得到问题,不知道程序有什么问题 |