STM32单片机智能温控风扇设计简介

发布者:玉米哥哥最新更新时间:2023-09-13 来源: elecfans关键字:STM32  单片机  智能温控风扇 手机看文章 扫描二维码
随时随地手机看文章

一、功能简介


本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、按键、蜂鸣器、L298N电机驱动模块直流电机、DS18B20温度传感器等。



系统功能:


系统运行后,LCD1602显示传感器检测的温度值;默认以自动模式运行,若按下K4键切换为手动模式,此时可以通过K1和K2控制风扇加减速,风扇档位共5档(0-5)。当再次按下K4键切换为自动模式;自动模式下,实时检测温度值,当温度高于上限且在2C范围内,以3档运行。当温度高于上限且在4C范围内,以4档运行。当温度高于上限且在6C范围内,以5挡运行。当温度高于上限且超过6C范围,以5档运行且蜂鸣器报警。若温度在上下限范围内,风扇以2档运行。若温度低于下限,风扇停止。可通过K3键进入阈值设置,K1和K2调节。


主要功能如下:


(1)温度检测与LCD显示;


(2)超上限温度越高风扇越快;


(3)低下限风扇停止;


(4)温度阈值设置;


(5)超限报警。


二、软件设计


//系统初始界面显示


void sys_open_show(void)


{


lcd1602_clear();


lcd1602_show_string(0,0,"Tp: C");


lcd1602_show_string(14,0,"Au");


lcd1602_show_string(0,1,"TL: C");


lcd1602_show_string(10,1,"TH: C");


}


//系统数据获取


void sys_data_get(void)


{


static u8 i=0;


while(1)


{


//温度获取


i++;


if(i%1==0)


{


TIM_Cmd(TIM3,DISABLE);//关闭定时器


sys_ctrl.temp=DS18B20_GetTemperture()*10;


TIM_Cmd(TIM3,ENABLE);//打开定时器


}


break;


}


}


//系统数据显示


void sys_data_show(void)


{


u8 buf[5];


while(1)


{


//温度显示


buf[0]=sys_ctrl.temp/100+0x30;


buf[1]=sys_ctrl.temp%100/10+0x30;


buf[2]='.';


buf[3]=sys_ctrl.temp%100%10+0x30;


buf[4]='�';


lcd1602_show_string(3,0,buf);


//温度阈值显示


lcd1602_show_nums(3,1,sys_ctrl.templ,2,0);


lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);


//阈值闪烁指示


switch(sys_ctrl.mode)


{


case 1://温度下限


lcd1602_show_string(3,1," ");


delay_ms(50);


lcd1602_show_nums(3,1,sys_ctrl.templ,2,0);


break;

case 2://温度上限


lcd1602_show_string(13,1," ");


delay_ms(50);


lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);


break;

}


//档位显示


lcd1602_show_nums(10,0,sys_ctrl.gear,1,0);


//手动状态显示


if(sys_ctrl.auto_flag)lcd1602_show_string(14,0,"SD");


else lcd1602_show_string(14,0,"Au");


break;


}


}


//系统数据设置


void sys_data_set(void)


{


u8 key=0;


key=KEY_Scan(0);


//自动手动模式设置


if(key==KEY4_PRESS)


{


sys_ctrl.auto_flag=!sys_ctrl.auto_flag;


}


//阈值模式设置


else if(key==KEY3_PRESS)


{


sys_ctrl.mode++;


if(sys_ctrl.mode>2)sys_ctrl.mode=0;


}


//阈值设置模式下,K1和K2加减


if(sys_ctrl.mode!=0)


{


//加


if(key==KEY1_PRESS)


{


switch(sys_ctrl.mode)


{


case 1://温度下限


 sys_ctrl.templ++;


 if(sys_ctrl.templ >99)sys_ctrl.templ=0;


 break;


case 2://温度上限


 sys_ctrl.temph++;


 if(sys_ctrl.temph >99)sys_ctrl.temph=0;


 break;

}


}


//减


else if(key==KEY2_PRESS)


{


switch(sys_ctrl.mode)


{


case 1://温度下限


 sys_ctrl.templ--;


 if(sys_ctrl.templ< 0)sys_ctrl.templ=99;


 break;


case 2://温度上限


 sys_ctrl.temph++;


 if(sys_ctrl.temph< 0)sys_ctrl.temph=99;


 break;

}


}


}


//手动模式下,档位调节


if(sys_ctrl.auto_flag==1)


{


//加速


if(key==KEY1_PRESS)


{


sys_ctrl.gear++;


if(sys_ctrl.gear>5)sys_ctrl.gear=5;


}


//减速


else if(key==KEY2_PRESS)


{


sys_ctrl.gear--;


if(sys_ctrl.gear<0)sys_ctrl.gear=0;


}


}


}


//系统功能控制


void sys_fun_ctrl(void)


{


//手动模式下,速度控制


if(sys_ctrl.auto_flag==1)


{


pwm_set_duty(sys_ctrl.gear*20);//占空比


}


//自动模式下,速度控制


else


{


//如果温度高于上限,温度越高,风扇越快


if(sys_ctrl.temp>=sys_ctrl.temph*10)


{


if(sys_ctrl.temp>=sys_ctrl.temph10 && sys_ctrl.temp10+20)


sys_ctrl.gear=3;

else if(sys_ctrl.temp>=sys_ctrl.temph10+20 && sys_ctrl.temp10+40)**


sys_ctrl.gear=4;

else if(sys_ctrl.temp>=sys_ctrl.temph*10+40)


{


sys_ctrl.gear=5;


//高于设定值则蜂鸣器报警


if(sys_ctrl.temp >=sys_ctrl.temph*10+60) 


{


 beep_alarm(100,20);


}

}


}


//如果温度低于下限,风扇停止


else if(sys_ctrl.temp<=sys_ctrl.templ*10)


sys_ctrl.gear=0;


//温度在阈值范围内,风扇以固定速度运行


else


sys_ctrl.gear=2;


pwm_set_duty(sys_ctrl.gear*20);//占空比


}


}


//应用控制系统


void appdemo_show(void)


{


u8 i=10;


sys_parm_init();//系统参数初始化


KEY_Init();


BEEP_Init();


DS18B20_Init();


lcd1602_init();//LCD1602初始化


//读取温度数据,等待稳定


while(i--)


{


sys_ctrl.temp=DS18B20_GetTemperture();


delay_ms(100);


}


dc_motor_init();


pwm_init(100-1,800-1);//初始时,PWM占空比为0


pwm_set_duty(0);


dc_motor_dir_ctrl(0);


sys_open_show();//系统初始界面显示


while(1)


{


sys_data_get();//系统数据获取


sys_data_show();//系统数据显示


sys_data_set();//系统数据设置


sys_fun_ctrl();//系统功能控制


}


}

三、实验现象

图片

图片

图片


关键字:STM32  单片机  智能温控风扇 引用地址:STM32单片机智能温控风扇设计简介

上一篇:ACM32F303对比STM32F103差异说明
下一篇:STM32CubeMx入门教程(10):Fatfs文件系统的应用

推荐阅读最新更新时间:2024-11-03 10:36

新一代车载信息系统平台用微控制器和OS
近日,NEC与NEC电子联合完成了新一代车载信息系统平台主干部分--微控制器与操作系统(OS)--的开发。 在新一代车载信息系统平台上,通过管理车辆控制系统及车体系统的联动控制的控制类OS(实时)以及管理导航仪、音响等与外部通信的信息类OS(多媒体)与微控制器协同作业,可以更轻松的通过丰富的用户界面为用户提供与地图、道路信息联动的车辆控制以及基于车辆运行状况记录的远程故障诊断等服务。 为缩短设计周期、确保设计资源的可延续性,同时为了帮助用户在修改及应用时更加简单,此次面向新一代车载信息系统平台所开发的微控制器和OS采用了统一架构。新一代微控制器、OS的主要特征如下: 1.新一代微控制器 新一代微控制器是在ARM公司和NEC集团共
[新品]
51单片机实验3:led流水灯
开发板led模块电路图如下: 循环左/右移函数头文件为 intrins.h #include reg52.h #include intrins.h #define uc unsigned char void delay(uc n) { uc i,j; for(i=1;i =n;i++) for(j=110;j =1;j--); } void main() { P2=0xFE; while(1) { delay(200); p2=_crol_(P2,1); delay(200); } }
[单片机]
51<font color='red'>单片机</font>实验3:led流水灯
STM32编程之软件模拟IIC对24C02存储器读写操作
1、主程序 #include stm32f10x_conf.h #include led.h #include key.h #include usart.h #include lcd.h #include 24cxx.h #include myiic.h #include delay.h u8 tabel = write data is:0 1 2 3 4 5 6 7 8 9 ; /* 程序功能:STM32实现24C02读写操作 当按下KEY1时,向24C02写入数组中的数据; 当按下KEY2时,从24C02中读出数据到数组。 用LCD液晶显示操作过程; 用串口显示写入和读
[单片机]
基于单片机的红外收发
红外的收发图解: 红外接收电路 接收端默认是高电平 /* 检测脉冲宽度 最长脉宽为5ms 返回值:t,代表脉宽为t*20us(t=1~250); */ u8 Pulse_Width_Check(void) { u8 t=0; while(RDATA) { t++;delay_us(20); if(t==250)return t; //超时溢出 } return t; } 红外发送电路: 协议 遥控载波的频率为38KHz(系统引导码高电平9ms,低电平4.5ms;系统码16位,数据码16位,共32位;数据0用 高电平0.56ms+
[单片机]
51单片机系列连载4—中断
今天介绍51单片机中比较重要的一个环节 中断,所谓中断,就是CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。从应用角度上看,基本后续的很多内容都会用到中断,那就先简单说一下中断。 首先,中断响应条件。 有三点:中断源有中断请求、此中断源的中断允许位为1、CPU开中断(即EA=1)。 以上三条同时满足时,CPU才有可能响应中断。在此基础上,下面从三个不同的中断进行介绍。 第一,定时器/计数器中断锁存寄存器TCON。如下图所示:
[单片机]
微控制器增加PWM/模拟通道的方法
   微控制器是将微型计算机的主要部分集成在一个芯片上的单芯片微型计算机。在片上PWM(脉冲宽度调制)资源方面,低成本的8位单片微控制器是很吝啬的。设计人员在采用PWM资源时,经常被迫要牺牲一个捕捉/比较通道或定时器通道,因为PWM通道要共用相同的片上资源。很多基于微控制器的独立电气设备都不会使用同步串行端口。因此,可以用微控制器的波特率发生器和并/串转换器部分来生成位模式,构成一个256位的PWM形式。然后用RC滤波器过滤这个PWM输出,提取出一个模拟信号。同步通信没有异步通信的起始位和停止位,因此位模式可以产生出长周期的高电平或低电平。        图1,可以用片上未用的同步串行端口产生PWM信号,并将其转换为
[电源管理]
为<font color='red'>微控制器</font>增加PWM/模拟通道的方法
c8051f330系列单片机AD转换
c8051f330系列单片机AD转换. 作者 lml198694 日期 2008-7-21 10:53:00 2 推荐 根据最近自己学习的C8051F330单片机.写了一个关于AD转换的程序,但是在调试的时候,总是发现其精度没有我想象中的高,不知道是不是因为自己所用的万用表不准,还是因为我的基准电压不够,其测试的结果总是比用万用表测试的相差那么0.1V左右.想了好久了,就是没有解决的了啊.我想大概是因为万用表的精度还不过的原因应该是主要原因.呵呵.还是再调试.............. 主要是将数据通过串口传到上位机上来显示. 其基本的代码如下: #i nclude c8051f330.h typedef un
[单片机]
STM32 定时器中断配置心得【自用】
1.IO配置 略 2.TIM配置 void TIM2_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period =359999; TIM_TimeBaseStructure.TIM_Prescaler = 99; TIM_TimeBas
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved