⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 智能风扇程序.c

📁 智能风扇的设计
💻 C
字号:
#include <intrins.h>
#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int
uchar code table[]="    Set 000     ";
uchar code table1[]="Speed 000 T:00.0";
uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar count,num;
long int sudu;
uchar bai,shi,ge,qian,gaowei,diwei;
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag,flag;//温度正负标志
uchar s1num,s2num,s4num,s5num,s8num;
uchar fengsu;
uchar ziran1,ziran2,ziran3;
uchar setspeed;
sbit rs=P2^0;//液晶显示
sbit lcden=P2^1;//液晶功能
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit s1=P1^0;//全速按钮
sbit s2=P1^1;//停止按钮
sbit s3=P1^2;//半速按钮
sbit s4=P1^3;//自然风按钮
sbit s5=P1^4;//速度功能按钮
sbit s6=P1^5;//风扇速度设置按钮——加
sbit s7=P1^6;//风扇速度设置按钮——减
sbit s8=P1^7;//智能按钮
sbit zhishi0=P3^1;//速度设置指示灯
sbit zhishi1=P2^2;//全速指示灯
sbit zhishi2=P2^3;//停止指示灯
sbit zhishi3=P2^4;//半速指示灯
sbit zhishi4=P2^5;//自然风指示灯
sbit zhishi5=P2^6;//智能方式指示灯
sbit zhishi6=P2^7;//声光报警灯
sbit kongzhikou=P3^0;//继电器输出口
void write_com(uchar com);
void write_sfm(uchar add,uchar date);
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
/****蜂鸣器响应频率延时程序****/
void delaybaojing(uint m)
{
	uint x,y;
	for(x=m;x>0;x--)
		for(y=50;y>0;y--);
}
/****自然风延时程序****/
void delayziranfeng(uint n)
{
	uint x,y;
	for(x=n;x>0;x--)
	{
		if(s1&&s2&&s3&&s4&&s5&&s6&&s7&&s8!=0)
			for(y=110;y>0;y--);	 
		else
		{
			s4num=0;
			s8num=0;
		}
	}
}
/**************各个按键的功能函数****************/
void s1_function()
{
	if(s1num==1&&s2&&s3&&s4&&!s5num&&s6&&s7&&s8&&s5)
	{
		s1num=0;
		zhishi1=0;
		zhishi2=1;
		zhishi3=1;
		zhishi4=1;
		zhishi5=1;
		kongzhikou=1;
	}
	setspeed=0;
}


void s2_function()
{
	while(s2num==1&&s3&&s4&&s5&&s8)
	{
		s2num=0;
		zhishi0=1;
		zhishi1=1;
		zhishi2=0;
		zhishi3=1;
		zhishi4=1;
		zhishi5=1;
		kongzhikou=0;
	}
	setspeed=0;
}

void s3_function()
{
	setspeed=0;
	while(s3&&s2&&s1&&s4&&!s5num&&s6&&s7&&s8&&s5)
	{
		zhishi1=1;
		zhishi2=1;
		zhishi3=0;
		zhishi4=1;
		zhishi5=1;
		kongzhikou=1;
		delay(50);
		kongzhikou=0;
		delay(50);
	}
	
}
void s4_function()
{
	setspeed=0;
	while(s4&&s2&&s3&&s1&&!s5num&&s6&&s7&&s8&&s5)
	{
		zhishi1=1;
		zhishi2=1;
		zhishi3=1;
		zhishi4=0;
		zhishi5=1;
		 for(ziran1=2;ziran1>0;ziran1--)
		 {
			 kongzhikou=1;
			 delayziranfeng(1000);
			 kongzhikou=0;
			 delayziranfeng(3000);
		 }
		 for(ziran2=2;ziran2>0;ziran2--)
		{
		 	kongzhikou=1;
			delayziranfeng(2000);
			kongzhikou=0;
			delayziranfeng(2000);
		}
		for(ziran3=2;ziran3>0;ziran3--)
		{
			kongzhikou=1;
			delayziranfeng(3000);
			kongzhikou=0;
			delayziranfeng(1000);
	    }
		
	}
	
}
void s8_function()
{
	while(s8num==1&&s2&&s3&&s4&&!s5num&&s6&&s7&&s1&&s5)
	{
		zhishi1=1;
		zhishi2=1;
		zhishi3=1;
		zhishi4=1;
		zhishi5=0;
		while(tvalue<=200&&s1&&s2&&s3&&s4&&s5)
		{
			kongzhikou=0;
		}
		while(tvalue>200&&tvalue<=250&&s1&&s2&&s3&&s4&&s5)
		{
			 for(ziran1=2;ziran1>0;ziran1--)
			 {
				 kongzhikou=1;
				 delayziranfeng(1000);
				 kongzhikou=0;
				 delayziranfeng(3000);
			 }
			 for(ziran2=2;ziran2>0;ziran2--)
			 {
				 kongzhikou=1;
				 delayziranfeng(2000);
				 kongzhikou=0;
				 delayziranfeng(2000);
			 }
			 for(ziran3=2;ziran3>0;ziran3--)
			 {
				 kongzhikou=1;
				 delayziranfeng(3000);
				 kongzhikou=0;
				 delayziranfeng(1000);
			 }
		}
		while(tvalue>250&&tvalue<=330&&s1&&s2&&s3&&s4&&s5)
		{
			kongzhikou=1;
			delay(50);
			kongzhikou=0;
			delay(50);
		}
		while(tvalue>330&&tvalue<=400&&s1&&s2&&s3&&s4&&s5)
		{
			kongzhikou=1;
		}
		while(tvalue>400&&s1&&s2&&s3&&s4&&s5)
		{
			kongzhikou=0;
			zhishi6=0;
			delaybaojing(2);
			zhishi6=1;
			delaybaojing(2);
		}
	}
	s8num=0;
	setspeed=0;
}
void keyscan()
{
	if(s1==0)	
	{
		delay(5);
		if(s1==0)
		{	s1num++;
			while(!s1);
			s1_function();
		}
	}
	if(s2==0)	
	{
		delay(5);
		if(s2==0)
		{	s2num++;
			while(!s2);
			s2_function();
		}
	}
	if(s3==0)	
	{
		delay(5);
		if(s3==0)
		{	
			while(!s3);
			s3_function();
			
		}
	}
	if(s4==0)//自然风的运行,必须由外部中断来完成,扫描方式无法完成功能的随意转换,内部函数执行时间太长	
	{
		delay(5);
		if(s4==0)
		{
			while(!s4);
			s4_function();
		}
	}
	if(s8==0)	
	{
		delay(5);
		if(s8==0)
		{	s8num++;
			while(!s8);
			s8_function();
		}
	}
}
void dingshiqi()
{
	TMOD=0x51;	
	TH0=(65536-41000)/256;
	TL0=(65536-41000)%256;
	EA=1;
	ET0=1;
	TR0=1;
	TH1=0;
	TL1=0;
	ET1=0;
	TR1=1;
} 
void write_com(uchar com)
{
	rs=0;
	lcden=0;
	P0=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void write_date(uchar date)
{
	rs=1;
	lcden=0;
	P0=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void init()
{
	uchar num;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	for(num=0;num<16;num++)
		{
			write_date(table[num]);
			delay(5);
		}
	write_com(0x80+0x40);
	for(num=0;num<16;num++)
		{
			write_date(table1[num]);
			delay(5);
		}
}//液晶初始化程序
void dusu()
{	
	gaowei=TH1;
	diwei=TL1;
	TH1=0;
	TL1=0;
	TR1=1;
}
void xiesu()
{
	sudu=(gaowei/16)*16*16*16+(gaowei%16)*16*16+(diwei/16)*16+diwei%16;
	bai=sudu%1000/100;
	write_com(0x80+0x40+6);
	write_date(table2[bai]);
	delay(2);
	shi=sudu%1000%100/10;
	write_com(0x80+0x40+7);
	write_date(table2[shi]);
	delay(2);
	ge=sudu%10;
	write_com(0x80+0x40+8);
	write_date(table2[ge]);
	delay(2);
	write_com(0x80+0x40+9);
	write_date(' ');
	delay(2);
}
/***显示设置速度用函数***/
void write_sfm(uchar add,uchar date)
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+add);
	write_date(0x30+shi);
	write_date(0x30+ge);
}
void tiaosu()
{
	kongzhikou=1;
	delay(50+fengsu);
	kongzhikou=0;
	delay(50-fengsu);
}
void shesu()
{
	kongzhikou=1;
	delay(fengsu);
	kongzhikou=0;
	delay(100-fengsu);
}

void keyscan1()
{
	flag=0;
	if(s5==0)	
	{
		delay(5);
		if(s5==0)
		{	s5num++;
			while(!s5);
			if(s5num==1)
			{
				zhishi0=0;
				zhishi1=1;
				zhishi2=1;
				zhishi3=1;
				zhishi4=1;
				zhishi5=1;
				write_com(0x80+9);
				flag=0;
			}
		}
			if(s5num==2)
			{
				zhishi0=1;
				zhishi1=1;
				zhishi2=1;
				zhishi3=1;
				zhishi4=1;
				zhishi5=1;
				s5num=0;
				flag=1;
			}
	}
	if(s5num==0)
	{
		if(s6==0&&s1&&s2&&s3&&s4&&s5&&s7&&s8)
		{
			delay(5);
			if(s6==0)
			{
				while(!s6);
				fengsu++;
				if(fengsu>=50)
					fengsu=50;	  				
				while(s6&&s2&&s1&&s3&&s4&&s8&&s5&&s7)	
				tiaosu();
			}
		}
		if(s7==0&&s1&&s2&&s3&&s4&&s5&&s6&&s8)
		{
			delay(5);
			if(s7==0)
			{
				while(!s7);
				fengsu--;
				if(fengsu<=-50)
				{	fengsu=-50;	 	}
				while(s6&&s2&&s1&&s3&&s4&&s8&&s5&&s7)
				tiaosu();
			}				
		}
		while(s5num==0&&s1&&s2&&s3&&s4&&s5&&s6&&s7&&s8&&flag)
		{
			fengsu=setspeed*5;
			shesu();
		}
	}
	
	if(s5num!=0)
	{
		if(s6==0)
		{
			delay(5);
			if(s6==0)
			{
				while(!s6);
				if(s5num==1)
				{
					setspeed++;
					if(setspeed==21)
						setspeed=0;
					write_sfm(9,setspeed);
					write_com(0x80+9);
				}
			}
		}
		if(s7==0)
		{
			delay(5);
			if(s7==0)
			{
				while(!s7);
				if(s5num==1)
				{
					setspeed--;
					if(setspeed==-1)
						setspeed=20;
					write_sfm(9,setspeed);
					write_com(0x80+9);
				}
			}
		}
	}
}

/**/
void delay_18B20(unsigned int i)//延时1微秒
{
   while(i--);
}

void ds1820rst()/*ds1820复位*/
{ 
	unsigned char x=0;
	DQ = 1;          //DQ复位
	delay_18B20(4); //延时
	DQ = 0;          //DQ拉低
	delay_18B20(100); //精确延时大于480us
	DQ = 1;          //拉高
	delay_18B20(40); 
} 

uchar ds1820rd()/*读数据*/
{ 
	unsigned char i=0;
	unsigned char dat = 0;
	for (i=8;i>0;i--)
	{   DQ = 0; //给脉冲信号
	    dat>>=1;
	    DQ = 1; //给脉冲信号
	    if(DQ)
	    dat|=0x80;
	    delay_18B20(10);
	}
   return(dat);
}

void ds1820wr(uchar wdata)/*写数据*/
{
	unsigned char i=0;
    for (i=8; i>0; i--)
	   { DQ = 0;
	     DQ = wdata&0x01;
	     delay_18B20(10);
	     DQ = 1;
	     wdata>>=1;
	   }
}
read_temp()/*读取温度值并转换*/
{
	uchar a,b;
	ds1820rst();    
	ds1820wr(0xcc);//*跳过读序列号*/
	ds1820wr(0x44);//*启动温度转换*/
	ds1820rst();    
	ds1820wr(0xcc);//*跳过读序列号*/ 
	ds1820wr(0xbe);//*读取温度*/ 
	a=ds1820rd();
	b=ds1820rd();
	tvalue=b;
	tvalue<<=8;
	tvalue=tvalue|a;
	    if(tvalue<0x0fff)
	   		tflag=0;
	    else
	   {
	   		tvalue=~tvalue+1;
			tflag=1;
	   }
	tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
	return(tvalue);
}

/*******************************************************************/
void ds1820disp()//温度值显示
{ 
     disdata[1]=tvalue%1000/100+0x30;//十位数
     disdata[2]=tvalue%100/10+0x30;//个位数
     disdata[3]=tvalue%10+0x30;//小数位
     write_com(0xc0+10);
     write_date('T');//显示符号位
     write_com(0xc0+11);
     write_date(':');//显示百位
     write_com(0xc0+12);
     write_date(disdata[1]);//显示十位 
     write_com(0xc0+13);
     write_date(disdata[2]);//显示个位 
     write_com(0xc0+14);
     write_date(0x2e);//显示小数点 
     write_com(0xc0+15);
     write_date(disdata[3]);//显示小数位
}

void main()
{
	kongzhikou=0;
	init();
	dingshiqi();
	dusu();
	xiesu();
	read_temp();//读取温度
	ds1820disp();//显示
	while(1)
	{	keyscan();
		keyscan1();	
	 }
}
void timer0() interrupt 1
{

	TH0=(65536-41000)/256;
	TL0=(65536-41000)%256;
	count++;
	if(count==20)
	{	
		count=0;
		TR1=0;
		dusu();
		xiesu();	
		read_temp();//读取温度
    	ds1820disp();//显示
		write_sfm(9,setspeed);
	}		
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -