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口,
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DB18B20ForStm32.h
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
main.c
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);
}
相关文章推荐
- 74HC595 for STM32 源代码【worldsing笔记】
- 74HC595 for STM32 源代码【worldsing笔记】
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- Keil uCos 2.52 stm32 【worldsing笔记】
- 如何使用Keil仿真环境查看CPU类型字长?【worldsing笔记】
- 射频识别技术漫谈(9)——动物标签HDX【worldsing笔记】
- 射频识别技术漫谈(12)——三次相互认证【worldsing笔记】
- emWin显示文本字符-【worldsing笔记】
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- stm32 时钟配置——外部时钟倍频、内部时钟倍频 【worldsing笔记】
- FreeModbus Slave For AVR源代码 精简版2 【worldsing 笔记】
- 射频识别技术漫谈(10)——识别号的格式变化【worldsing笔记】
- Altium Designer导出部分元件过滤不焊接的元件【worldsing笔记】
- emWin(ucGui)数值显示例程 -【worldsing笔记】
- uCos 之 TaskIdle() 注意事项【worldsing笔记】
- 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】
- STM32 SysTick定时器应用【worldsing笔记】
- MFRCC522 SPI无法通讯【worldsing笔记】
- 超级MINI STLINK V2 官方固件自动升级 ST-Link 【worldsing 笔记】
- 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】