硬件构成:单片机+最小系统+数码管显示模块+74HC573数码管驱动模块+温度采集模块+风扇驱动模块+按键模块
1.采用DS18B20温度传感器测温,74HC573驱动数码管,数码管显示温度和风扇的档位;
2.三个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整;
3.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(风扇50%转速转动),当温度超过上限时,全速转动。
仿真原理图如下
制作出来的实物图如下:
温控风扇元件清单
1) 7*9万用板
2) 风扇
3) STC89C51单片机
4) 74hc573
5) 40脚IC座
6) 20脚IC座
7) 0.36四位一体共阴数码管
8) 10k电阻*2
9) 1k电阻*2
10) 103排阻
11) DS18B20
12) 10uf电容
13) 11.0592M晶振
14) 30pf瓷片电容*2
15) 9012三极管
16) 2p排针
17) 按键*3
18) DC电源接口
19) 自锁开关
20) 导线若干
21) 焊锡若干
22) 电源线或电池盒+DC电源插头
单片机源程序如下:
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^6;
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7; //数码管的位选端
sbit dp=P0^7;
sbit fm=P3^7;
sbit key_shezhi=P1^5;
sbit key_jia=P1^6;
sbit key_jian=P1^7;
uchar flag_0;
uint t_max=250,t_max_1=300;
uint count=0;
int wendu,t;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************/
void pro()
{
if(key_shezhi==0)
{
delay(10);
if(key_shezhi==0)
{
flag_0++;
if(flag_0>=3)
flag_0=0;
while(!key_shezhi) ;
}
}
}
/**********************************/
uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40
};
uchar code table1[]={
0x38,0x76
};
uint temp,mm;uchar i;float f_temp;
/*******************************************************
温度函数
*******************************************************/
void dsreset(void) //下边是温度获取子程序
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读一位
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void) //获取温度
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat) //写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //温度转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp() /获取温度
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
/***********************************/
void display0()
{
P0=0x00;
w1=0;
P0=0x00;
delay(2);
w1=1;
P0=0x00;
w2=0;
P0=table[wendu/100];
delay(2);
w2=1;
P0=0x00;
w3=0;
P0=table[wendu%100/10];
dp=1;
delay(2);
w3=1;
P0=0x00;
w4=0;
P0=table[wendu%10];
delay(2);
w4=1;
}
/***************************************/
void baojing()
{
count++;
if(count>=3)
count=0;
if(wendu>=t_max&&wendu
{
if(count<2) //只有三分之二的时间会给风扇供电
fm=0;
else
fm=1;
}
else if(wendu>=t_max_1) //高于设定的最高温度, 全速转动
{
fm=0;
}
else //高于设定的次级温度,缓慢转动
{
fm=1;
}
}
/**************************************/
/**************************************/
void display1()
{
P0=0x00;
w1=0;
P0=table1[0];
delay(2);
w1=1;
P0=0x00;
w2=
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』