不用开发板学习STM32
温度传感器
DS18B20实验
1
实验环境介绍
• 实验环境
本次实验是通过Proteus+MDK一起模拟完成的。Proteus模拟实际电路,MDK编译代码。Proteus版本是8.13,MDK版本是5.21。需要注意的是,Proteus需要安装8.8以上版本,器件库里面要支持STM32F103R8。
• 实验目的
1.读取DS18B20的数值转换成温度,正负值都能读取;
2.OLED12864屏幕显示当前温度,上限阈值,下限阈值;
3.可通过按键调节温度上下限阈值;
4.温度超过范围红色LED亮起报警,在范围内绿色LED亮起。
2
硬件电路
Proteus电路
• 主控:
STM32F103R8(之前用的是C6,但是觉得IO少了点改成了R8,本质上只有Flash和SRAM大小的区别,所以没有必要纠结)
• 时钟:
没有用外部晶振,因为Proteus只支持一种时钟树,所以这里采用内部晶振,做实验够了,倍频后是48M。
• 复位电路:
复位电路直接去掉了,因为不是实际电路,在仿真环境中感觉作用不大,还占地方。
• IO说明:
OLED的I2C通信SCL-PB12,SDA-PB13;
DS18B20的1-wrie的IO-PA11;
RED-LED-PB0,GREEN-LED-PB1;
串口用来调试PA9和PA10;
上限设置按键-PC0,下限设置按键PC1。
3
代码概述
MDK代码目录结构
• 代码目录概述:
APP文件夹:主要包含应用函数的.C文件。
BSP文件夹:主要包含底层硬件驱动的.C文件。
MDK-ARM文件夹:主要包含STM32的启动的.S文件。
StdPeriph_Driver文件夹:主要包含ST官方提供的标准外设驱动.C文件(不是HAL库哦)。
CMSIS文件夹:系统内核配置文件,标准库自带的。
• 代码内容概述:
↓↓↓ 主要贴一下DS18B20的代码:
↓↓↓复位函数,reset ds18b20
DS18B20_IO_OUT_Pin_11(); //SET PA11 OUTPUT
DS18B20_DQ_OUT_Pin_11(0); //拉低PA11
Delay_DS18B20_1us(750); //延时750us
DS18B20_DQ_OUT_Pin_11(1); //拉高PA11
Delay_DS18B20_1us(15); //15US
↓↓↓ 检测函数,检测总线上有没有 ds18b20:
u8 retry=0;
DS18B20_IO_IN_Pin_11();//SET PA0 INPUT
while (DS18B20_DQ_IN_Pin_11&&retry<200)
{
retry++;
Delay_DS18B20_1us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN_Pin_11&&retry<240)
{
retry++;
Delay_DS18B20_1us(1);
};
if(retry>=240)return 1;
return 0;
↓↓↓ 读数值函数,读ds18b20返回的温度:
↓↓↓读1bit
u8 data;
DS18B20_IO_OUT_Pin_11();//SET PA0 OUTPUT
DS18B20_DQ_OUT_Pin_11(0);
Delay_DS18B20_1us(2);
DS18B20_DQ_OUT_Pin_11(1);
DS18B20_IO_IN_Pin_11();//SET PA0 INPUT
Delay_DS18B20_1us(12);
if(DS18B20_DQ_IN_Pin_11)data=1;
else data=0;
Delay_DS18B20_1us(50);
return data;
↓↓↓读1byte
u8 i,j,dat;
dat=0;
1;i<=8;i++) =
{
j=DS18B20_Read_Bit_Pin_11();
dat=(j<<7)|(dat>>1);
}
return dat;
↓↓↓写1byte
u8 j;
u8 testb;
DS18B20_IO_OUT_Pin_11();//SET PA0 OUTPUT;
1;j<=8;j++) =
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
Write 1
DS18B20_DQ_OUT_Pin_11(1);
}
else
{
Write 0
DS18B20_DQ_OUT_Pin_11(1);
}
}
↓↓↓ 更详细代码及工程文件,公众号回复关键字就能获取!!
4
实验结果展示
实验实际效果
实验实际效果
开机经过初始化以后,显示欢迎界面以及当前的温度,默认上限温度是10℃,下限温度是-10℃;
按下上下限设置温度设置按键后,界面切换到设置按键,按一下上限+1,下限-1。