智能温控风扇设计(基于51系列单片机)


实现功能:

1.检测与人距离自动开启风扇
2.随温度升高自动调节风扇转速
3.在液晶屏上显示当前环境温度
4.显示当前电机转速
5.根据按键调节设定温度值(可选)

所用元器件:

1.普中科技HC6800——EM3 V2.2开发板(STC89C52)
2.温度传感器DS18B20(开发板上接口,连接P3.7)
3.液晶显示LCD1602(开发板上接口,data连接P0口,E=P2.7,RW=P2.5,RS=P2.6)
4.德飞来直流电机模块(直流电机、电机控制芯片L9110S)
5.电机驱动芯片(开发板上步进电机驱动芯片,或使用L298N[需要外接供电])

整体程序框图

部分重要代码及详细注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*******************************************************************************
* 函 数 名 : Time0
* 函数功能 : 定时器0的中断函数,负责根据温度调节转速
*******************************************************************************/
void Time0(void) interrupt 1
{
TH0 = 0xF0; //重新赋初值
TL0 = 0x00;
timer0++;
if(22>Temperature_0 && Temperature_0>=20){pwm_set=0;}
else if(25>Temperature_0 && Temperature_0>=22){pwm_set=2;}
else if(28>Temperature_0 && Temperature_0>=25){pwm_set=4;}
else if(32>Temperature_0 && Temperature_0>=28){pwm_set=8;}
else if(Temperature_0>=32){pwm_set=10;}
else{pwm_set = 0;}
if(timer0>100) //PWM周期为100*初值填充数ms
{
timer0=0;
}
if(timer0 <pwm_set*10) //改变占空比
{
PWM=1;
}
else
{
PWM=0;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*******************************************************************************
* 函 数 名 : Time2
* 函数功能 : 设置定时器T2中断函数,定时读取温度设置温度初值和转速
*******************************************************************************/
void Time2(void) interrupt 5
{
int flag =0;
float x=0;
TF2 = 0;
TH2 = 0x3C; //设置定时时间,0.05s
TL2 = 0xB0;
flag++;
if(flag=10){//10次中断读取一次,0.5s读取一次
flag = 0;
num = TH1;
num <<= 8;
num |= TL1;
x = num*30;//电机模块上转盘有4个缺口,转速是每分钟转速。2x60/4=30。
num = x;
TL1 = 0;
TH1 = 0;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main(void)
{ TimeConfig(); //初始化T0和T1
Time2Config(); //初始化T2
LcdInit(); //初始化LCD1602
LcdWriteCom(0x8B); //写地址 80表示初始地址
while(F0==1){ //用红外控制是否开启,不用时可以直接置为1。
void Key_Check(); //键盘扫描程序,可以删除
EA = 0; //在液晶显示之前,先关闭所有中断,防止液晶显示时中断打断导致显示出现异常
Temperature_0 = Ds18b20ReadTemp();
TChange(); //温度转换,防止零下温度显示为+
EA = 1;
LcdDisplay(Temperature_0);
Delay500ms(); //10*1ms刷一次

最终成果

视频就不展示了,太紧张说的语无伦次。

文章作者: 鹤望兰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹤望兰 !
  目录