举例
void DS18B20_in()
{
GPIO_InitTypeDef gpio =
{
GPIO_Pin_11,
GPIO_Speed_50MHz,
GPIO_Mode_IPD
};
GPIO_Init(GPIOG, &gpio);
}
void DS18B20_out()
{
GPIO_InitTypeDef gpio =
{
GPIO_Pin_11,
GPIO_Speed_50MHz,
GPIO_Mode_Out_PP
};
GPIO_Init(GPIOG, &gpio);
}
u8 DS18B20_check()
{
u8 flag = 0;
DS18B20_in();
while(ds18b20_in == 1)
{
flag++;
if(flag > 100)
{
return 1;
}
delay_us(1); //一次循环1us
}
flag = 0;
while(ds18b20_in == 0)
{
flag++;
if(flag > 240)
{
return 1;
}
delay_us(1);
}
return 0;
}
u8 DS18B20_reset()
{
DS18B20_out();
ds18b20_out = 0;
delay_us(500);
ds18b20_out = 1;
delay_us(1);
return DS18B20_check();
}
u8 DS18B20_init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
return DS18B20_reset();
}
u8 DS18B20_read_bit()
{
DS18B20_out();
ds18b20_out = 0;
delay_us(1);
ds18b20_out = 1; //释放总线
delay_us(1);
DS18B20_out();
delay_us(15);
return ds18b20_in;
}
u8 DS18B20_read()
{
u8 i = 0;
u8 r, tmp;
for(i = 0; i < 8; i++)
{
tmp = DS18B20_read_bit();
r = (tmp << 7 | r >> 1);
delay_us(45);
ds18b20_out = 1;
delay_us(1);
}
return r;
}
void DS18B20_write(u8 d)
{
u8 i = 0;
u8 tmp = 0;
DS18B20_out();
for(i = 0; i < 8; i++)
{
tmp = d & 0x01;
d >>= 1;
ds18b20_out = 0;
delay_us(1);
if(tmp == 0)
{
delay_us(60);
}
else
{
ds18b20_out = 1;
delay_us(60);
}
ds18b20_out = 1;
delay_us(1);
}
}
void DS18B20_ChangeTemp()
{
DS18B20_write(0xcc); //忽略ROM
DS18B20_write(0x44); //温度转换
return;
}
void DS18B20_ReadTemp()
{
DS18B20_write(0xcc);
DS18B20_write(0xbe); //读取RAM
return;
}
u16 readTemp()
{
int temp = 0;
u8 tmph = 0, tmpl = 0;
DS18B20_reset(); //必须的
DS18B20_ChangeTemp();
DS18B20_reset(); //必须的
DS18B20_ReadTemp();
tmpl = DS18B20_read(); //低字节
tmph = DS18B20_read(); //高字节
temp = tmph;
temp <<= 8;
temp |= tmpl;
return temp;
}
int main(void)
{
while(DS18B20_init() != 0)
{
printf("DS18B20_init failed.\n");
delay_ms(500);
}
while(1)
{
led1 = ~led1;
r = readTemp();
if((r & 0xf800) == 0xf800)
{
r = (~r) + 1;
temp = r * (-0.0625);
}
else
{
temp = r * 0.0625;
}
printf("temp %.2f\n", temp);
delay_ms(1000);
}
}
关键字:stm32 ds18b20 温度传感器
引用地址:
stm32 ds18b20 温度传感器
推荐阅读最新更新时间:2024-03-16 16:21
stm32的IAP升级小概率跑飞问题
用IAP技术进行单片机的自动升级,官方有源码,一般根据需求修改。 比如,因为我们的产品遍布各处,不可能让施工人员一个个去按按键触发升级,所以串口命令触发升级的方式明显更符合实际。以及Ymodem兼容性不好的原因,我们也换成了自己的协议。 做了大半个月,出现了一个怪象。 IAP下载升级包,100%时跳转APP,APP显示软件版本号,这是正常流程。 但是我们还有个异常和强度测试,在升级的各个阶段不停地拔电复位,看最终是否能升级成功。 同事反应,有时下载100%了,APP没显示版本号,而是又去从0%重新升级了,不停循环,但是重新上电后就一次性升级跳转成功了。一天测试数百次只会出现一次,是小概率事件。复现时,我留意了现象,是APP没正常运
[单片机]
STM32学习笔记(一)---基础知识
常识 1.所有芯片的引脚顺序都是逆序排列的 2.芯片主要由内核和片上外设组成。 存储器映射 存储器本身不具有地址,给存储器分配地址的过程就称为存储器映射。 给存储器再分配一个地址的过程就叫做存储器重映射。 寄存器映射 设计片上外设时,以四个字节为一个单元,共32bit,每个单元对应不同的功能,我们控制这些单元就可以驱动外设工作。 根据每个单元的功能不同,以功能为名给这个内存单元起别名,这个别名就是寄存器。 给已经分配好地址的有特定功能的内存单元取别名的过程就叫做寄存器映射 例子: GPIOF端口的输出数据寄存器ODR的内存地址为0x4002 1414(ODR寄存器32位,低16位有效,控制16个IO端口
[单片机]
DS18B20测试程序
#include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char /************DS18B20**********/ sbit DQ=P3^7; uchar temph=0,templ=0; uint t=0; float tt=0; void delay_b20(uint z)//ds18b20延时 { while(z--); } void b20_reset(void)//ds18b20复位 { uchar ready=0; DQ=1; delay_b20(8); DQ=0;
[单片机]
单片机入门学习八 STM32单片机学习五 时钟系统
单片机学习除了了解该篇 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础 中的基础外,我们还需要有时钟的概念,本篇将记录 stm32的时钟系统。 1、STM32时钟介绍 下面这幅图时stm32的时钟系统框图 1)蓝底框表示 时钟源,即: ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。(WDG看门狗 使用该时钟源) ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。(RTC实时时钟 使用该时钟源) ⑤PLL为锁相环
[单片机]
STM32 FMSC使用理解
看了很长时间 FMSC资料 都说的模糊的。 其实很简单: fsmc就是为了扩展内存的,如我们在 STM32 芯片外添加一个sram芯片,那么我们只需要把 sram芯片的地址线和数据线和 STM32 连接后,然后将内核规定的地址数赋给sram的地址,那么我们就可以通过内核规定的地址去访问sram芯片了
[单片机]
stm32专题二十五:基本定时器原理
STM32F103系列的定时器: 定时器功能:定时、输入比较、输出捕获、互补输出; 定时器分类:基本定时器、通用定时器、高级定时器; 定时器资源:高级定时器(2个)TIM1 和 TIM8;通用定时器(4个)TIM2 / 3 / 4 / 5;基本定时器(2个)TIM6 和 TIM7; 定时器功能表: 基本定时器功能简介: 计数器16bit,只能向上计数,只有TIM6和TIM7; 没有外部的GPIO,是内部资源,只能用来定时; 时钟来自PCLK1,为72M,可实现1~65536分频; 基本定时器的结构框图: 1 时钟源(72M): 2 控制器 控制器用于控制定时器的:复位、使能、计数、触发DAC,涉及到的寄存器为:CR
[单片机]
STM32学习—外部中断EXTI
外部中断配置步骤 要使用外部中断我们就需要先配置它,通常都需经过这几步: (EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中) (1)使能IO口时钟,配置IO口模式为输入 (2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_
[单片机]
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]