您的位置:首页 > 编程语言

DS18B20 for STM32 源代码 【worldsing笔记】

2013-09-07 16:50 761 查看
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃。主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,再读出温度转换值。本程序仅挂接一个芯片,使用默认的12位转换精度,外接供电电源,读取的温度值高位字节送WDMSB单元,低位字节送WDLSB单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值.本例VCC用3.3V供电,将DQ连接结到stm32的PA1口,


DS18B20STM32源代码下载
DB18B20ForStm32.c
#include"ds18b20.h"
#defineEnableINT()
#defineDisableINT()

#defineDS_PORTGPIOA//DS18B20连接口
#defineDS_DQIOGPIO_Pin_1//GPIOA1

#defineDS_RCC_PORTRCC_APB2Periph_GPIOA

#defineDS_PRECISION0x7f//精度配置寄存器1f=9位;3f=10位;5f=11位;7f=12位;
#defineDS_AlarmTH0x64
#defineDS_AlarmTL0x8a
#defineDS_CONVERT_TICK1000

#defineResetDQ()GPIO_ResetBits(DS_PORT,DS_DQIO)
#defineSetDQ()GPIO_SetBits(DS_PORT,DS_DQIO)
#defineGetDQ()GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)

voidDelay_us(u32Nus)
{
SysTick->LOAD=Nus*9;//时间加载
SysTick->CTRL|=0x01;//开始倒数
while(!(SysTick->CTRL&(1<<16)));//等待时间到达
SysTick->CTRL=0X00000000;//关闭计数器
SysTick->VAL=0X00000000;//清空计数器
}

unsignedcharResetDS18B20(void)
{
unsignedcharresport;
SetDQ();
Delay_us(50);

ResetDQ();
Delay_us(500);//500us(该时间的时间范围可以从480到960微秒)
SetDQ();
Delay_us(40);//40us
//resport=GetDQ();
while(GetDQ());
Delay_us(500);//500us
SetDQ();
returnresport;
}

voidDS18B20WriteByte(unsignedcharDat)
{
unsignedchari;
for(i=8;i>0;i--)
{
ResetDQ();//在15u内送数到数据线上,DS18B20在15-60u读数
Delay_us(5);//5us
if(Dat&0x01)
SetDQ();
else
ResetDQ();
Delay_us(65);//65us
SetDQ();
Delay_us(2);//连续两位间应大于1us
Dat>>=1;
}
}

unsignedcharDS18B20ReadByte(void)
{
unsignedchari,Dat;
SetDQ();
Delay_us(5);
for(i=8;i>0;i--)
{
Dat>>=1;
ResetDQ();//从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后
Delay_us(5);//5us
SetDQ();
Delay_us(5);//5us
if(GetDQ())
Dat|=0x80;
else
Dat&=0x7f;
Delay_us(65);//65us
SetDQ();
}
returnDat;
}

voidReadRom(unsignedchar*Read_Addr)
{
unsignedchari;

DS18B20WriteByte(ReadROM);

for(i=8;i>0;i--)
{
*Read_Addr=DS18B20ReadByte();
Read_Addr++;
}
}

voidDS18B20Init(unsignedcharPrecision,unsignedcharAlarmTH,unsignedcharAlarmTL)
{
DisableINT();
ResetDS18B20();
DS18B20WriteByte(SkipROM);
DS18B20WriteByte(WriteScratchpad);
DS18B20WriteByte(AlarmTL);
DS18B20WriteByte(AlarmTH);
DS18B20WriteByte(Precision);

ResetDS18B20();
DS18B20WriteByte(SkipROM);
DS18B20WriteByte(CopyScratchpad);
EnableINT();

while(!GetDQ());//等待复制完成///////////
}

voidDS18B20StartConvert(void)
{
DisableINT();
ResetDS18B20();
DS18B20WriteByte(SkipROM);
DS18B20WriteByte(StartConvert);
EnableINT();
}

voidDS18B20_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(DS_RCC_PORT,ENABLE);

GPIO_InitStructure.GPIO_Pin=DS_DQIO;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//2M时钟速度
GPIO_Init(DS_PORT,&GPIO_InitStructure);
}

voidds18b20_init(void)
{
DS18B20_Configuration();
DS18B20Init(DS_PRECISION,DS_AlarmTH,DS_AlarmTL);
DS18B20StartConvert();
}

floatds18b20_read(void)
{
unsignedcharDL,DH;
unsignedshortTemperatureData;
floatTemperature;

DisableINT();
DS18B20StartConvert();
ResetDS18B20();
DS18B20WriteByte(SkipROM);
DS18B20WriteByte(ReadScratchpad);
DL=DS18B20ReadByte();
DH=DS18B20ReadByte();
EnableINT();

TemperatureData=DH;
TemperatureData<<=8;
TemperatureData|=DL;

Temperature=(float)((float)TemperatureData*0.0625);//分辨率为0.0625度

returnTemperature;
}


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

DB18B20ForStm32.h

#ifndef__DS18B20_H__
#define__DS18B20_H__

#include"stm32f10x.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_gpio.h"

#defineSkipROM0xCC//跳过ROM
#defineSearchROM0xF0//搜索ROM
#defineReadROM0x33//读ROM
#defineMatchROM0x55//匹配ROM
#defineAlarmROM0xEC//告警ROM

#defineStartConvert0x44//开始温度转换,在温度转换期间总线上输出0,转换结束后输出1
#defineReadScratchpad0xBE//读暂存器的9个字节
#defineWriteScratchpad0x4E//写暂存器的温度告警TH和TL
#defineCopyScratchpad0x48//将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1
#defineRecallEEPROM0xB8//将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1
#defineReadPower0xB4//读电源的供电方式:0为寄生电源供电;1为外部电源供电

voidds18b20_init(void);
floatds18b20_read(void);
//unsignedshortds18b20_read(void);

#endif


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

main.c

//如何使用?

intmain(void)
{
floatt;
ds18b20_init();
t=ds18b20_read();
printf("温度=%05.1f",t);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: