文档库 最新最全的文档下载
当前位置:文档库 › 电风扇程序

电风扇程序

/**************************************************************************

========基于单片机的智能温控电风扇的设计========
1、 采用AT89S52单片机作为主控系统;
2、 用步进电机模拟风扇;
3、 当温度低于15度时风扇不转;
4、 当温度在15----24度之间时最慢;
5、 24----33度中档;
6、 33度最快;
7、 温度超过40报警;
*************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //温度传感器总线
sbit beep=P1^7; //蜂鸣器端口

sbit K3 = P3^0; //自动手动切换
sbit K1 = P3^2; //速度减
sbit K2 = P3^1; //速度加


sbit W0=P2^0; //
sbit W1=P2^1; //
sbit W2=P2^6; //
sbit W3=P2^3; //位选
sbit PIN=P0^7;

uchar warn;
bit flog=0;
uchar data temp_read[]={0x00,0x00};
uchar data display[]={0x00,0x00,0x00,0x00,0x00};
uchar code xiaoshu[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x07,0x07,0x08,0x08,0x09,0x09};//要显示的数据(0~9)

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};// 正转数组
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//0-9 s、 d 共阳数码管段选数据(编码)
uchar dispbuf[4]={0,0,0,0};// 0x76,0x3f,0x3f,0x4f
uchar dispcount;

uchar num; //速度档位变量
uint num1; //延时时间变量
uchar flag=0; //手动/自动标示位;
uchar temp_sum; //温度整合

/****************************************************************************
函数功能:延时子程序
函数功能:
入口参数:
出口参数:
****************************************************************************/
void delay(uint x)
{
while(--x);
}

/****************************************************************************
函数功能:延时子程序1
函数功能:用于速度调节
入口参数:
出口参数:
****************************************************************************/
void delay1(uint x)
{
uint k;
for(k=0;k}

/****************************************************************************
函数功能:延时子程序2
函数功能:用于按键消抖
入口参数:
出口参数:
****************************************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

/****************************************************************************
函数功能: 蜂鸣器控制
函数功能:
入口参数:
出口参数:
****************************************************************************/
void BEEP()
{
uchar i;
for (i=0;i<100;i++)
{
delay(60);
beep=!beep; //BEEP取反
}
beep=1; //关闭蜂鸣器
}

/****************************************************************************
函数功能:按键子

程序
入口参数:
出口参数:
****************************************************************************/
void key()
{
if(flag==1) //切换为手动模式时速度加减键才起作用
{
if(K1==0) //速度加
{
delayms(5);
if(K1==0)
{
while(!K1);
num++;
if(num>=3)
num=3;

}
}
if(K2==0) //速度减
{
delayms(5);
if(K2==0)
{
while(!K2);
if(num>0)
num--;
}
}
}
if(K3==0) //自动/手动转换
{
delayms(5);
if(K3==0)
{
while(!K3);
flag++;
if(flag==1)
num=0;
if(flag>=2)
flag=0;
}
}
switch(num)
{
case 0: num1=0; break;
case 1: num1=1000; break;
case 2: num1=400; break;
case 3: num1=150; break;
default:
break;
}
}


/****************************************************************************
函数功能: 18B20初始化
入口参数:
出口参数:
****************************************************************************/
uchar Init18b20()
{
DQ=1; //DQ复位
delay(8);

DQ=0;
delay(90);

DQ=1;
delay(8);

warn=DQ;
delay(100);
DQ=1;

return(warn);
}

/****************************************************************************
函数功能: 写数据到18B20
入口参数:
出口参数:
****************************************************************************/
void writeonechar(uchar dat)
{
uchar i=0;
for(;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);

DQ=1;
dat>>=1;
}
}
/****************************************************************************
函数功能: 读18B20的数据
入口参数:
出口参数:
****************************************************************************/
readonechar()
{
uchar i=0,dat=0;
for(;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;

if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/****************************************************************************
函数功能: 读温度
入口参数:
出口参数:
****************************************************************************/
void readtemp()
{
Init18b20();
if(warn==1)
{
BEEP();
flog=1;}
else
{
flog=0;
writeonechar(0xcc);
writeonechar(0x44);

Init18b20();
writeonechar(0xcc);
writeonechar(0xbe);

temp_read[0]=readonechar();
temp_read[1]=readonechar();
}
}

/****************************************************************************
函数功能: 显示
函数功能:
入口参数:
出口参数:
****************************************************************************/
void display1()
{
display[4]=(temp_read[0]&0x0f);//取低四位
display[0]=xiaoshu[display[4]];

display[4]=(((temp_read[0]&0xf0)>>4)|((temp_read[1]&0x0f)<<4));//把原数据高四位与低四位交换组成新的数
display[3]=display[4]/100;//取百位上的数字
display[1]=display[4]%100;//
display[2]=display[1]/10;
display[1]=disp

lay[1]%10;

temp_sum=display[2]*10+display[1];

if(!display[3])
{
display[3]=0x0a;
if(!display[2])
display[2]=0x0a;
}

if(flag==0)
{

dispbuf[0]=display[3];
dispbuf[1]=display[2];
dispbuf[2]=display[1];
dispbuf[3]=display[0];
}

if(flag==1)
{
dispbuf[0]=11;
dispbuf[1]=11;
dispbuf[2]=11;
dispbuf[3]=num;
}
}

/********************自动调速子函数************************************/
void tiaosu()
{
if(flag==0)
{ if(temp_sum<100)
{
if(temp_sum<15) //风扇停转
{
num=0;
beep=1;
}
else if(temp_sum<24) //风扇最慢
{
num=1;
beep=1;
}
else if(temp_sum<33) //中档
{
num=2;
beep=1;
}
else if(temp_sum<40) //最快
{
num=3;
beep=1;
}
else if(temp_sum<50) //风扇最快,蜂鸣器报警
{
num=3;
beep=0;
}
else
{
delay(10);
beep=1;
P2=0xff;
}
}
}
}

/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;

for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW[i]; //取数据 即给P1.0~P1.7管脚赋电平
delay1(num1); //调节转速
}
}

void main()
{
T2MOD=0x00; /*定时器2为工作模式) */
T2CON=0x04; /*定时器2为自动重装定时工作模式) TR2=1 */
RCAP2L=(65536-5000)%256; //给定时器T2装初值 定时5ms
RCAP2H=(65536-5000)/256;
TR2=1; //打开定时器中断1,2
ET2=1;
EA=1;

W0=1;//数码管位选
W1=1;//数码管位选
W2=1;//数码管位选
W3=1;//数码管位选
while(1)
{
readtemp();
if(flog==0)
{
display1();
}
else
P2=0xff;

key();
motor_ffw();
tiaosu();
}
}

void t1(void) interrupt 5 using 0
{
TF2=0; //T2定时器必须用软件清0
P0=dispcode[dispbuf[dispcount]]; //控制数码管 显示
if (dispcount==0)
{
W0=0;
W1=1;
W2=1;
W3=1;
}
if(dispcount==1)
{

W0=1;
W1=0;
W2=1;
W3=1;
}

if(dispcount==2)
{
if(flag!=1)
PIN=0;
W0=1;
W1=1;
W2=0;
W3=1;

}
if(dispcount==3)
{
if(flag!=1)
PIN=1;
W0=1;
W1=1;
W2=1;
W3=0;

}

dispcount++;
if(dispcount==4)
dispcount=0;
}

相关文档