《嵌入式系统课程设计》
摘 要
想要实现的系统是基于 STM32 的温度采集与控制系统,能够采用 DS18B20 这个温度传
感器进行温度的感知,利用 STM32 开发板输出实时的温度设置出上下限温度,可以通过蜂
鸣器以及 LED 灯在超出温度上下值进行报警。风扇的转速随温度的变化而变化,温度控制
占空比,占空比改变转速:温度越高,风扇转动越快;温度越低风扇转动越慢。在这里,我
们除了正常完成利用电容按键控制采样周期外,还利用了 GUI 进行了触摸屏控制采样周期、
温度阈值以及占空比。
关键词:STM32,DS18B20,温度阈值,GUI
《嵌入式系统课程设计》
基于 STM32 的温度采集与控制系统
一、系统功能需求
所要实现的系统是基于 STM32 的温度采集与控制系统。由于 DS18B20
是常用的温度传感器,所以能够通过 DS18B20 可以实现温度的感知,并利
用 STM32 开发板输出实时的温度,设置出阈值,能够在温度过高或过低时
进行报警,同时实现风扇的转动,温度越高,占空比越大就能够使风扇转速
越快。
二、设计思路
1、通过 DS18B20 实现温度的采集;
2、利用 STM32 实现程序的编译,进行温度数值的显示;
3、利用电容按键改变采样周期;
4、当温度过高或者过低时实现报警功能;
5、改变 PWM 值可以改变风扇转速;
6、实现触摸屏,能够利用触摸屏实现采样周期、温度阈值已及 PWM 改变占空
比的控制。
《嵌入式系统课程设计》
三、整体结构及各部分功能说明
1、整体结构
结构实现过程:温度通过18B20 采集并读出,之后利用Keil5 编译程序通过STM32
显示在 LCD 液晶显示屏上,利用 LED 的亮灭和蜂鸣器的报警来
感知温度的超温和低温。温度如果过高,LED 红灯亮,蜂鸣器
报警,占空比增大,风扇加快转速来进行散热。当按下电容按键
时,改变采样周期。
2、各部分功能说明
(1) 18B20:常用的温度传感器,进行温度的采集。测温范围-55℃~+125℃。可以
直接读出被测温度值,而且采用 3 线制与 STM32 开发板相连,减少
了外部硬件电路。 面对着扁平的那一面,左负右正,接反会导致立
刻发热。接反也是导致传感器总是显示 85℃的原因。正负接好后显
示 85℃后正常显示数值。
(2)电容按键:改变采样周期,每按一次按键,周期就会增加 1s,增加到 5s 后,
再按下电容按键周期就会变为 1s 再重新开始循环。
(3)Keil5: Keil 包括 C 编译器、宏汇编、链接器、库管理和一个功能强大的仿真
调试器等在内的完整开发方案,通过一个集成开发环境将这些部分
组合在一起。一款专业的 IDE 集成开发环境,以 C 语言为基础能够
《嵌入式系统课程设计》
进行所有程序的编译,达到编程者所有想要的目的;
(4)LCD 液晶:显示温度,采样周期以及 PWM 值;
(5)STM32:基于专门为要求高性能、低成本、低功耗的嵌入式应用专门设计
的 ARM Cortex-M3 内核。
(6)LED:温度在 29~33℃时不亮,温度高于 33℃时亮红灯,温度低于 29℃时
亮蓝灯;
(7)蜂鸣器:当温度在 29~33℃时不进行报警,温度高于 33℃或者低于 29℃时
进行报警;
(8)风扇驱动:风扇在 26℃时占空比为 50%,即高电平频率为 500HZ,之后温
度每升高 1℃,占空比提高 5%。
3、实现功能图片
(1)低温报警(低于 29℃)亮蓝灯,占空比为 60%
(2)高温报警(高于 33℃)亮红灯,占空比为 85%
《嵌入式系统课程设计》
四、硬件电路
1、电路设计
2、所用器件及功能说明
(1)所用器件型号及个数
器件 电阻 二极管 三极管 排针 导线 风扇 电压转换器
个数
型号 1KΩ IN4007
S8050 —— —— ——
若干 若干
1
12V
1
1
1
1
(2)器件功能说明
1) 电阻:与三极管基极串联的电阻起到分压保护作用,与三极管并联的电阻起
到分流保护作用,避免电流过大烧坏三极管
2)二极管:进行分流作用防止电扇所在电路电流过大烧坏风扇从而保护风扇电路
3)三极管:由于 STM32 输出的电压信号太过微弱,所以连接一个三极管进行电
压放大能够使风扇接收到 STM32 发来的信号,避免出现信号过小风
扇无法接受到信号从而无法降温的情况
4)排针:进行各部分的连接
5)风扇:在温度过高时进行散热
6)电压转换器:将 220V 的交流电压转换成 12V 的直流电压进行输出
《嵌入式系统课程设计》
五、程序流程图及核心代码
1、主程序流程图
PWM
占空比
Y
Y
Y
LED 不亮 BEEP 不
LED 亮红灯 BEEP
LED 亮蓝灯 BEEP
开始
初始化
温度采集
2933
te>29
LCD 显示
结束
Y
按键按下
N
N
Loop=25*t?
Y
N
t++
显示
t+1
Y
t>5?
Y
t=1
N
2、核心代码
int temp,temp2,sum=25,t=1,loop=0;
while( DS18B20_Init() )
DS18B20_ReadId ( ucDs18b20Id
for ( uc = 0; uc < 8; uc ++ )
LED1(ON);LED2(ON);LED3(ON);
for(;;)
);
《嵌入式系统课程设计》
{
temp_value = DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
//温度读取
//占空比中高电平的计算
temp=((int)temp_value-26)*50+500;
TIM_SetCompare1(TIM3, temp); //占空比的输出
temp2=temp/10;
if ( TPAD_Scan ( 0 ) )
{sum+=25;t++; }
else
{
//控制周期循环时间
//电容按键按下
if(sum<=loop)
{
temp_value = DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
printf ( "\r\n 环境测量温度:%.1f\r\n",
temp_value);
sprintf ( cStr1, "%.1f", temp_value );
LCD_DisplayStr(50, 10, (unsigned char*)cStr1, RED);
loop=0;}
//周期大于五
if(t>5)
{sum=25;t=1;}
loop++;
if(temp_value<33.0f&temp_value>29.0f)
//周期从 1 开始
//从此往下开始进入温度报警
{ LED1(ON);LED2(ON);LED3(ON);macBEEP( OFF);}
if(temp_value>33.0f)
{LED3( OFF );macBEEP( ON); }
if(temp_value<29.0f)
{ LED2( OFF );macBEEP( ON);}
}
sprintf ( cStr2,"%d",
t);sprintf ( cStr3,"%d",temp2);
六、拓展
用触屏,Gui 界面实现触屏调试的功能