基于51单片机的教室智能照明控制系统设计

1、具体功能:

(1)使用4个LED灯模拟教室的照明灯,在符合条件开启时,人数小于10人亮一个灯,10-20人亮二个灯,20-30人亮三个灯,大于30人则全亮四个灯;
(2)教室使用两个红外对管来检测是否有人进入并进行人数统计,人数可以统计到二位数99人,并实时将人数显示到液晶屏LCD上,液晶屏同时显示实时日期/时间/星期;
(3)利用光敏电阻检测教室的光线强弱;
(4)系统分自动/手动模式,可以通过按键切换模式,并有LED指示当前所在模式,在自动模式下,可以设定定时时间段,在定时时间段内,当教室有人(人数大于0)的情况下,如果光线暗弱则自动打开照明灯,照明灯点亮个数根据人数而定,不在定时时间段或者教室无人的情况下,关闭所有照明灯,另外在手动模式下,可以通过手动开关控制照明灯的亮灭,人数统计部分仍然生效;

2、硬件电路图:

用51单片机STC89C52、时钟芯片DS1302、液晶屏LCD1602、光敏电阻、红外对管、设计一个教室智能照明控制系统。电路图:

3、部分代码

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar time_data[7];
uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //Êý¾ÝµÄµØÖ·
uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};

uchar code table1[]="C: 00|2000/00/00";
uchar code table2[]="T: 00|00:00:00 0";
uchar code table3[]="                ";			 //ÇåÆÁÄÚÈÝ
uchar code table4[]="  Set Real Time ";
uchar code table5[]="  Set Open Time ";
uchar code table6[]="   Start Time:  ";
uchar code table7[]="    00:00:00    ";
uchar code table8[]="    End Time:   ";
uchar code table9[]="Date: 2000/00/00";
uchar code table0[]="Time: 00:00:00 0";

bit Adjust;			  //µ÷½Ú±ê־룬=1±íʾ½øÈëµ÷½Úģʽ£¬=0ÊÇÕý³£Ä£Ê½
bit Auto_flg;		  //×Ô¶¯Ä£Ê½±ê־룬=1±íʾÊÖ¶¯Ä£Ê½£¬=0ÊÇ×Ô¶¯Ä£Ê½
sbit rs=P1^0;		  //LCD1602
sbit rw=P1^1; 		  //LCD1602
sbit e=P1^2;		  //LCD1602
sbit sck=P2^5;		  //ʱÖӶ˿Ú
sbit io=P2^6;		  //ʱÖӶ˿Ú
sbit rst=P2^7;		  //ʱÖӶ˿Ú
sbit SELT =P1^6;	  //Ñ¡Ôñ¼ü
sbit ENTER=P1^7;	  //È·Èϼü
sbit UP   =P3^0;	  //¼Ó¼ü
sbit DOWN =P3^1;	  //¼õ¼ü
sbit MODE =P3^2;	  //Çл»°´¼ü½Ó¿Ú
sbit SWITCH=P3^3;	  //ÊÖ¶¯¿ª¹Ø
sbit AUTO_LED=P1^3;	  //×Ô¶¯Ä£Ê½µÆ½Ó¿Ú
sbit HAND_LED=P1^4;	  //ÊÖ¶¯µÆ½Ó¿Ú
sbit LAMP1=P3^4;	  //µÆ½Ó¿Ú
sbit LAMP2=P3^5;	  //µÆ½Ó¿Ú
sbit LAMP3=P3^6;	  //µÆ½Ó¿Ú
sbit LAMP4=P3^7;	  //µÆ½Ó¿Ú
sbit LIGHT1=P2^0;	  //¹âÏß¼ì²â¶Ë¿Ú
sbit IN1=P2^2;
sbit OUT1=P2^1;
sbit DQ=P1^5;		  //ζÈÊý¾Ý¿Ú
uchar Select_num;	  //Ñ¡Ôñ°´¼ü°´Ï´ÎÊý
uchar Enter_num;	  //È·ÈÏ°´¼ü°´Ï´ÎÊý
uchar Switch_num;	  //ÊÖ¶¯¿ª¹Ø°´¼ü°´Ï´ÎÊý
float Year,Month,Day,Hour,Minute,Second;			//ʱ¼äÉèÖÃÖµ
uchar Week;		
float Hour_H,Minute_H,Second_H;  					//ÉèÖÿªÊ¼Ê±¼ä
float Hour_L,Minute_L,Second_L;  					//ÉèÖýáÊøʱ¼ä
int Value1;											//ÈËÊý
uchar IN1_flag=0;
uchar OUT1_flag=0;
uint Count;           //T0¶¨Ê±Æ÷ÖжϼÆÊý´ÎÊý
uchar Miao;

int temperature;									//È«¾Ö±äÁ¿ ζÈ

void read_rtc();

/**************************************************LCD1602ÏÔʾ*******************************************************************/
void delay1(uint z)			  //ÑÓʱº¯Êý
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=10;y>0;y--);
}

void write_com(uchar com)			 //дָÁÊý
{
	rw=0;
	delay1(5);
	rs=0;
	delay1(5);
	e=1;
	delay1(5);
	P0=com;
	delay1(5);
	e=0;
	delay1(5);	
}

void write_date(uchar date)			//дÊý¾Ýº¯Êý
{									
	rw=0;
	delay1(5);
	rs=1;
	delay1(5);
	e=1;
	delay1(5);
	P0=date;
	delay1(5);
	e=0;
	delay1(5);	
}

void init()						    //³õʼ»¯º¯Êý
{	
	uchar num;
	Year=17;
	Month=1;
	Day=1;
	Hour=15;
	Minute=30;
	Second=50;
	Week=1;
	Hour_H=22;
	Minute_H=0;
	Second_H=0;
	Hour_L=18;
	Minute_L=0;
	Second_L=0;
	e=0;						    // ʱÐò±íe³õʼΪ0
	write_com(0x38);		        //ÉèÖÃ16*2ÏÔʾ£¬5*7µãÕó£¬8λÊý¾Ý½Ó¿Ú
	write_com(0x0c);				//ÉèÖùâ±ê
	write_com(0x06);				//¹â±ê×Ô¶¯¼Ó1,¹â±êÊäÈ뷽ʽ
	write_com(0x01);				//ÇåÆÁ
	write_com(0x80);				//ÉèÖóõʼÏÔʾλÖÃ
	for(num=0;num<16;num++)
	{
		write_date(table1[num]);
		delay1(5);
	}
	write_com(0x80+0x40);
	for(num=0;num<16;num++)
	{
		write_date(table2[num]);
		delay1(5);
	}					  
}

void SetTime_dispaly(uchar add,uchar dat)	 //µÚÒ»¸ö£º²ÎÊýµÄµØÖ·£¬µÚ¶þ¸ö£º²ÎÊýµÄÄÚÈÝ
{
	uchar shi,ge;
	shi=dat/10;							//°ÑʮλÌáÈ¡³öÀ´
	ge=dat%10;							//°Ñ¸öλÌáÈ¡³öÀ´
	write_com(add);			   	 		//ҪдµÄµØÖ·
	write_date(0x30+shi);				//ʮλµÄÄÚÈÝ   1602×Ö·û¿â
	write_date(0x30+ge);				//¸öλµÄÄÚÈÝ   1602×Ö·û¿â
}

void Week_dispaly(uchar add,uchar dat)	//µÚÒ»¸ö£º²ÎÊýµÄµØÖ·£¬µÚ¶þ¸ö£º²ÎÊýµÄÄÚÈÝ
{
	write_com(add);						//ҪдµÄµØÖ·
	write_date(0x30+dat);				//ʮλµÄÄÚÈÝ   1602×Ö·û¿â
}
void Date_dispaly(uchar add,uchar dat)	 //µÚÒ»¸ö£º²ÎÊýµÄµØÖ·£¬µÚ¶þ¸ö£º²ÎÊýµÄÄÚÈÝ
{
	uchar shi,ge;
	shi=dat/16;							//°ÑʮλÌáÈ¡³öÀ´
	ge=dat%16;							//°Ñ¸öλÌáÈ¡³öÀ´
	write_com(add+3);			   	 	//ҪдµÄµØÖ·
	write_date(0x30+shi);				//ʮλµÄÄÚÈÝ   1602×Ö·û¿â
	write_date(0x30+ge);				//¸öλµÄÄÚÈÝ   1602×Ö·û¿â				   
}

void LCD_Clean(uchar i)					//Òº¾§ÆÁÇå³ýÏÔʾ
{
	uchar num;
	if(i==1)
	{
		write_com(0x80);				//ÉèÖóõʼÏÔʾλÖÃ
		for(num=0;num<16;num++)			//ÏÔʾµÚÒ»ÐÐÄÚÈÝ
		{
			write_date(table3[num]);
			delay1(1);
		}
	}
	if(i==2)
	{
		write_com(0x80+0x40);
		for(num=0;num<16;num++)			//ÏÔʾµÚ¶þÐÐÄÚÈÝ
		{
			write_date(table3[num]);
			delay1(1);
		}
	}
}

void LCD_Display_String(unsigned char line,unsigned char *string)
{ 										//Òº¾§ÆÁÏÔʾÄÚÈÝ£¬°ÑÒªÏÔʾµÄÄÚÈÝдµ½¶ÔÓ¦µÄλÖÃ
	unsigned char i;
	unsigned char address=0;
	if(line==1)
	{
		address=0x80;	 				//0X80ÊǵÚ1ÐеĵÚ1¸öλÖà  ,0x81µÚ2λ
	}
	else if(line==2)
	{
		address=0x80+0x40;  			//0X80+0x40ÊǵÚ2ÐеĵÚ1¸öλÖà  ,0X80+0x40+1ÊǵÚ2ÐеÚ2λ
	}
	
	for(i=0;i<16;i++)
	{
		write_com(address);
		write_date(string[i]);
		address++;
	} 
}
/**********************************DS1302ʱÖÓ***************************************/
void Time_Display(void)
{
	read_rtc();
	Date_dispaly(0x80+0x40+9,time_data[6]);  //ÏÔʾÃë
	Date_dispaly(0x80+0x40+6,time_data[5]);	 //ÏÔʾ·Ö
	Date_dispaly(0x80+0x40+3,time_data[4]);	 //ÏÔʾʱ
	Date_dispaly(0x80+11,time_data[3]);		 //ÏÔʾÈÕ
	Date_dispaly(0x80+8,time_data[2]);		 //ÏÔʾÔÂ
	Week_dispaly(0x80+0x40+15,time_data[1]); //ÏÔʾÖÜ
	Date_dispaly(0x80+5,time_data[0]);		 //ÏÔʾÄê
					   //	Year/10*16+Year%10
	Hour=time_data[4]/16*10+time_data[4]%16;;
	Minute=time_data[5]/16*10+time_data[5]%16;;
	Second=time_data[6]/16*10+time_data[6]%16;;
}


void write_ds1302_byte(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		sck=0;
		io=dat&0x01;					   //×¼±¸Êý¾Ý,´Ó×îµÍλ¿ªÊ¼
		dat=dat>>1;
		sck=1;
	}
}

void write_ds1302(uchar add,uchar dat)
{
	rst=0;
	_nop_();  						//CPUÔ­µØ̤²½
	sck=0;
	_nop_();
	rst=1;
	_nop_();
	write_ds1302_byte(add);		    //´«µØÖ·
	write_ds1302_byte(dat);		    //´«Êý¾Ý
	rst=0;     						//²»ÊÜÆäËûÓ°Ïì
	_nop_();
	io=1;						   //ÊÍ·Å
	sck=1;
}

uchar read_ds1302(uchar add)
{
	uchar i,value;
	rst=0;
	_nop_();  //CPUÔ­µØ̤²½
	sck=0;
	_nop_();
	rst=1;
	_nop_();
	write_ds1302_byte(add);
	for(i=0;i<8;i++)
	{
		value=value>>1;
		sck=0;
		if(io)
		value=value|0x80;
		sck=1;
	}
	rst=0;
	_nop_();
	sck=0;
	_nop_();
	sck=1;
	io=1;
	return value;
}

void set_rtc()			          //ÉèÖÃʱ¼ä
{
	uchar i,j;
	for(i=0;i<7;i++)			 //ת»»BCDÂë
	{
		j=time_data[i]/10;
		time_data[i]=time_data[i]%10;
		time_data[i]=time_data[i]+j*16;
	}
	write_ds1302(0x8e,0x00);	  //È¥³ýд±£»¤
	for(i=0;i<7;i++)
	{
		write_ds1302(write_add[i],time_data[i]);
	}
	write_ds1302(0x8e,0x80);      //¼Óд±£»¤
}

void read_rtc()
{
	uchar i;
	for(i=0;i<7;i++)
	{
		time_data[i]=read_ds1302(read_add[i]);	//×îÖÕ¶Á³öÀ´µÄÊý 16½øÖÆ
	}
}

/*************************************************°´¼ü****************************************************************/
void Keyscan(void)
{
	if(SELT==0)
	{
		delay1(2);
		if(SELT==0)
		{
			while(!SELT);
			Select_num++;					//Ñ¡Ôñ¼ü°´ÏÂÒ»´Î
			Adjust=1;						//½øÈëµ÷½Úģʽ			
		}
		if(Select_num==1)
		{
			LCD_Clean(1);
			LCD_Clean(2);
			LCD_Display_String(1,table4);
			LCD_Display_String(2,table5);
			write_com(0x80+0);				//д >>
			write_date(0x3e);
			write_com(0x80+1);				//д >>
			write_date(0x3e);
			Enter_num=0;
		}
		if(Select_num==2)
		{
			LCD_Clean(1);
			LCD_Clean(2);
			LCD_Display_String(1,table4);
			LCD_Display_String(2,table5);
			write_com(0x80+0x40+0);				//д >>
			write_date(0x3e);
			write_com(0x80+0x40+1);				//д >>
			write_date(0x3e);
			Enter_num=0;
		}
		if(Select_num==3)
		{
			LCD_Clean(1);
			LCD_Clean(2);
			LCD_Display_String(1,table1);
			LCD_Display_String(2,table2);
			Select_num=0;
			Enter_num=0;					
			Adjust=0;
		}
		write_com(0x0c);									//¹â±ê²»ÔÙÉÁ˸
		Enter_num=0;
	}
	
	if(ENTER==0)
	{
		delay1(2);
		if(ENTER==0)
		{
			while(!ENTER);
			Enter_num++;
		}
		if(Select_num==1)					//ÉèÖÃʵʱʱ¼ä
		{
			if(Enter_num==1)
			{
				LCD_Clean(1);
				LCD_Clean(2);
				LCD_Display_String(1,table9);
				LCD_Display_String(2,table0);
				SetTime_dispaly(0x80+8,Year);
				SetTime_dispaly(0x80+11,Month);
				SetTime_dispaly(0x80+14,Day);
				SetTime_dispaly(0x80+0x40+6,Hour);
				SetTime_dispaly(0x80+0x40+9,Minute);
				SetTime_dispaly(0x80+0x40+12,Second);
				Week_dispaly(0x80+0x40+15,Week);
				write_com(0x80+8);			//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÄêµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==2)
			{
				write_com(0x80+11);			//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÔµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==3)
			{
				write_com(0x80+14);			//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÈÕµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==4)
			{
				write_com(0x80+0x40+6);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚʱµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==5)
			{
				write_com(0x80+0x40+9);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚ·ÖµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==6)
			{
				write_com(0x80+0x40+12);	//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÃëµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==7)
			{
				write_com(0x80+0x40+15);	//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÐÇÆÚµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==8)
			{
				Enter_num=0;
				write_com(0x0c);			//¹â±ê²»ÔÙÉÁ˸
				LCD_Clean(1);
				LCD_Clean(2);
				LCD_Display_String(1,table1);
				LCD_Display_String(2,table2);
				time_data[0]=Year;///10*16+Year%10;
				time_data[1]=Week;///10*16+Week%10;
				time_data[2]=Month;///10*16+Month%10;
				time_data[3]=Day;///10*16+Day%10;
				time_data[4]=Hour;///10*16+Hour%10;
				time_data[5]=Minute;///10*16+Minute%10;
				time_data[6]=Second;///10*16+Second%10;
				set_rtc();					 //ÉèÖÃʱ¼ä
				Select_num=0;
				Adjust=0;
			}
		}

		if(Select_num==2)					//ÉèÖÿª¹ØËøʱ¼ä
		{
			if(Enter_num==1)
			{
				LCD_Clean(1);
				LCD_Clean(2);
				LCD_Display_String(1,table6);
				LCD_Display_String(2,table7);
				SetTime_dispaly(0x80+0x40+4,Hour_L);
				SetTime_dispaly(0x80+0x40+7,Minute_L);
				SetTime_dispaly(0x80+0x40+10,Second_L);
				write_com(0x80+0x40+4);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚʱµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==2)
			{
				write_com(0x80+0x40+7);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚ·ÖµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==3)
			{
				write_com(0x80+0x40+10);	//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÃëµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==4)
			{
				write_com(0x0c);			//¹â±ê²»ÔÙÉÁ˸
				LCD_Clean(1);
				LCD_Clean(2);
				LCD_Display_String(1,table8);
				LCD_Display_String(2,table7);	
				SetTime_dispaly(0x80+0x40+4,Hour_H);
				SetTime_dispaly(0x80+0x40+7,Minute_H);
				SetTime_dispaly(0x80+0x40+10,Second_H);
				write_com(0x80+0x40+4);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚʱµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==5)
			{
				write_com(0x80+0x40+7);		//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚ·ÖµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}
			if(Enter_num==6)
			{
				write_com(0x80+0x40+10);	//¹â±êÉÁ˸µØÖ·£¬Í£ÁôÔÚÃëµÄλÖÃÉÏ					
				write_com(0x0f);			//¹â±êÉÁ˸
			}		
			if(Enter_num==7)
			{
				Enter_num=0;
				write_com(0x0c);			//¹â±ê²»ÔÙÉÁ˸
				LCD_Clean(1);
				LCD_Clean(2);
				LCD_Display_String(1,table1);
				LCD_Display_String(2,table2);
				Select_num=0;
				Adjust=0;
			}
		}

	}
	if(UP==0)
	{
		delay1(2);
		if(UP==0)
		{
			while(!UP);
			if(Select_num==1)
			{
				if(Enter_num==1)
				{
					Year++;
					if(Year>99)
					Year=0;
					SetTime_dispaly(0x80+8,Year);
					write_com(0x80+8);								
					write_com(0x0f);			
				}
				if(Enter_num==2)
				{
					Month++;
					if(Month>12)
					Month=1;
					SetTime_dispaly(0x80+11,Month);
					write_com(0x80+11);								
					write_com(0x0f);							  
				}
				if(Enter_num==3)
				{
					Day++;
					if(Day>31)
					Day=1;
					SetTime_dispaly(0x80+14,Day);
					write_com(0x80+14);								
					write_com(0x0f);
				}
				if(Enter_num==4)
				{
					Hour++;
					if(Hour>23)
					Hour=0;
					SetTime_dispaly(0x80+0x40+6,Hour);
					write_com(0x80+0x40+6);								
					write_com(0x0f);
				}
				if(Enter_num==5)
				{
					Minute++;
					if(Minute>59)
					Minute=0;
					SetTime_dispaly(0x80+0x40+9,Minute);
					write_com(0x80+0x40+9);								
					write_com(0x0f);
				}
				if(Enter_num==6)
				{
					Second++;
					if(Second>59)
					Second=0;
					SetTime_dispaly(0x80+0x40+12,Second);
					write_com(0x80+0x40+12);								
					write_com(0x0f);
				}
				if(Enter_num==7)
				{
					Week++;
					if(Week>7)
					Week=1;
					Week_dispaly(0x80+0x40+15,Week);
					write_com(0x80+0x40+15);								
					write_com(0x0f);
				}
			}
			if(Select_num==2)
			{				
				if(Enter_num==1)
				{
					Hour_L++;
					if(Hour_L>23)
					Hour_L=0;
					SetTime_dispaly(0x80+0x40+4,Hour_L);
					write_com(0x80+0x40+4);								
					write_com(0x0f);
				}
				if(Enter_num==2)
				{
					Minute_L++;
					if(Minute_L>59)
					Minute_L=0;
					SetTime_dispaly(0x80+0x40+7,Minute_L);
					write_com(0x80+0x40+7);								
					write_com(0x0f);
				}
				 
				if(Enter_num==3)
				{
					Second_L++;
					if(Second_L>59)
					Second_L=0;
					SetTime_dispaly(0x80+0x40+10,Second_L);
					write_com(0x80+0x40+10);								
					write_com(0x0f);
				}
				if(Enter_num==4)
				{
					Hour_H++;
					if(Hour_H>23)
					Hour_H=0;
					SetTime_dispaly(0x80+0x40+4,Hour_H);
					write_com(0x80+0x40+4);								
					write_com(0x0f);
				}
				if(Enter_num==5)
				{
					Minute_H++;
					if(Minute_H>59)
					Minute_H=0;
					SetTime_dispaly(0x80+0x40+7,Minute_H);
					write_com(0x80+0x40+7);								
					write_com(0x0f);
				}
				 
				if(Enter_num==6)
				{
					Second_H++;
					if(Second_H>59)
					Second_H=0;
					SetTime_dispaly(0x80+0x40+10,Second_H);
					write_com(0x80+0x40+10);								
					write_com(0x0f);
				}				
			}
		}
	}
	if(DOWN==0)
	{
		delay1(2);
		if(DOWN==0)
		{
			while(!DOWN);
			if(Select_num==1)
			{
				if(Enter_num==1)
				{
					Year--;
					if(Year<0)
					Year=99;
					SetTime_dispaly(0x80+8,Year);
					write_com(0x80+8);								
					write_com(0x0f);
				}
				if(Enter_num==2)
				{
					Month--;
					if(Month<1)
					Month=12;
					SetTime_dispaly(0x80+11,Month);
					write_com(0x80+11);								
					write_com(0x0f);
				}
				if(Enter_num==3)
				{
					Day--;
					if(Day<1)
					Day=31;
					SetTime_dispaly(0x80+14,Day);
					write_com(0x80+14);								
					write_com(0x0f);
				}
				if(Enter_num==4)
				{
					Hour--;
					if(Hour<0)
					Hour=23;
					SetTime_dispaly(0x80+0x40+6,Hour);
					write_com(0x80+0x40+6);								
					write_com(0x0f);
				}
				if(Enter_num==5)
				{
					Minute--;
					if(Minute<0)
					Minute=59;
					SetTime_dispaly(0x80+0x40+9,Minute);
					write_com(0x80+0x40+9);								
					write_com(0x0f);
				}
				if(Enter_num==6)
				{
					Second--;
					if(Second<0)
					Second=59;
					SetTime_dispaly(0x80+0x40+12,Second);
					write_com(0x80+0x40+12);								
					write_com(0x0f);
				}
				if(Enter_num==7)
				{
					Week--;
					if(Week<1)
					Week=7;
					Week_dispaly(0x80+0x40+15,Week);
					write_com(0x80+0x40+15);								
					write_com(0x0f);
				}		
			}

			if(Select_num==2)
			{
				if(Enter_num==1)
				{
					Hour_L--;
					if(Hour_L<0)
					Hour_L=23;
					SetTime_dispaly(0x80+0x40+4,Hour_L);
					write_com(0x80+0x40+4);								
					write_com(0x0f);
				}
				if(Enter_num==2)
				{
					Minute_L--;
					if(Minute_L<0)
					Minute_L=59;
					SetTime_dispaly(0x80+0x40+7,Minute_L);
					write_com(0x80+0x40+7);								
					write_com(0x0f);
				}
				if(Enter_num==3)
				{
					Second_L--;
					if(Second_L<0)
					Second_L=59;
					SetTime_dispaly(0x80+0x40+10,Second_L);
					write_com(0x80+0x40+10);								
					write_com(0x0f);
				}
				 
				if(Enter_num==4)
				{
					Hour_H--;
					if(Hour_H<0)
					Hour_H=23;
					SetTime_dispaly(0x80+0x40+4,Hour_H);
					write_com(0x80+0x40+4);								
					write_com(0x0f);
				}
				if(Enter_num==5)
				{
					Minute_H--;
					if(Minute_H<0)
					Minute_H=59;
					SetTime_dispaly(0x80+0x40+7,Minute_H);
					write_com(0x80+0x40+7);								
					write_com(0x0f);
				}
				if(Enter_num==6)
				{
					Second_H--;
					if(Second_H<0)
					Second_H=59;
					SetTime_dispaly(0x80+0x40+10,Second_H);
					write_com(0x80+0x40+10);								
					write_com(0x0f);
				}
			}
		}
	}

	if(MODE==0)							//Çл»°´¼ü°´ÏÂ
	{
		delay1(2);							//Ïû¶¶
		if(MODE==0)
		{
			while(!MODE);					//°´¼üÊÍ·Å
			Auto_flg=~Auto_flg;				//ģʽÇл»
			if(Auto_flg==0)					//×Ô¶¯Ä£Ê½
			{
				AUTO_LED=0;					//×Ô¶¯µÆÁÁ
				HAND_LED=1;
			}
			if(Auto_flg==1)					//ÊÖ¶¯Ä£Ê½
			{
				AUTO_LED=1;					
				HAND_LED=0;					//ÊÖ¶¯µÆÁÁ
				LAMP1=1;					//¹ØµÆ
				LAMP2=1;
				LAMP3=1;
				LAMP4=1;
			}
		}
	}
	if(Auto_flg==1)							//ÊÖ¶¯Ä£Ê½
	{
		if(SWITCH==0)						//µÆ¿ª¹Ø°´¼ü°´ÏÂ
		{
			delay1(2);						//Ïû¶¶
			if(SWITCH==0)
			{
				while(!SWITCH);				//°´¼üÊÍ·Å
				Switch_num++;				//°´Ï´ÎÊýÔö¼Ó
				if(Switch_num==1)			//°´ÏÂÒ»´Î£¬¿ªÒ»ÕµµÆ
				{
					LAMP1=0;
					LAMP2=1;
					LAMP3=1;
					LAMP4=1;
				}
				if(Switch_num==2)			//°´Ï¶þ´Î£¬¿ª¶þÕµµÆ
				{
					LAMP1=0;
					LAMP2=0;
					LAMP3=1;
					LAMP4=1;
				}
				if(Switch_num==3)			//°´ÏÂ3´Î£¬¿ª3ÕµµÆ
				{
					LAMP1=0;
					LAMP2=0;
					LAMP3=0;
					LAMP4=1;
				}
				if(Switch_num==4)			//°´ÏÂ4´Î£¬¿ª4ÕµµÆ
				{
					LAMP1=0;
					LAMP2=0;
					LAMP3=0;
					LAMP4=0;
				}
				if(Switch_num==5)			//°´ÏÂ5´Î£¬¿ª0ÕµµÆ
				{
					LAMP1=1;
					LAMP2=1;
					LAMP3=1;
					LAMP4=1;
					Switch_num=0;			//´ÎÊýÇå³ý
				}
			}
		}
	}
}

void Open(void)
{
	float Now;
	float Set_L,Set_H;
	Now=Hour+Minute/60+Second/3600;				  		//°Ñʵʱʱ¼ä»¯³ÉСʱΪµ¥Î»
	Set_L=Hour_L+Minute_L/60+Second_L/3600;		  		//°ÑÉèÖÃÏÂÏÞʱ¼ä»¯³ÉСʱΪµ¥Î»
	Set_H=Hour_H+Minute_H/60+Second_H/3600;		  		//°ÑÉèÖÃÉÏÏÞʱ¼ä»¯³ÉСʱΪµ¥Î»
	if(Auto_flg==0)										//×Ô¶¯Ä£Ê½
	{
		if((Now>=Set_L)&(Now<=Set_H))				  	//ʵʱʱ¼äÔÚÉÏÏÂÏÞʱ¼ä·¶Î§ÄÚ
		{
			if(LIGHT1==0)							    //¹âÏß²»×ã
			{
				if(Value1==0)
				{
					LAMP1=1;							//È«Ãð
					LAMP2=1;
					LAMP3=1;
					LAMP4=1;
				}
				if((Value1>0)&(Value1<10))
				{
					LAMP1=0;							//ÁÁÒ»¸öµÆ
					LAMP2=1;
					LAMP3=1;
					LAMP4=1;
				}
				if((Value1>=10)&(Value1<20))
				{
					LAMP1=0;							//ÁÁ¶þ¸öµÆ
					LAMP2=0;
					LAMP3=1;
					LAMP4=1;
				}
				if((Value1>=20)&(Value1<30))
				{
					LAMP1=0;							//ÁÁÈý¸öµÆ
					LAMP2=0;
					LAMP3=0;
					LAMP4=1;
				}
				if(Value1>=30)
				{
					LAMP1=0;							//ÁÁËĸöµÆ
					LAMP2=0;
					LAMP3=0;
					LAMP4=0;
				}
			}
			if(LIGHT1==1)							    //¹âÏßÇ¿ÁÒ
			{
				LAMP1=1;								//È«Ãð
				LAMP2=1;
				LAMP3=1;
				LAMP4=1;
			}
		}
	
		if((Now<Set_L)|(Now>Set_H))					  	//ʵʱʱ¼ä²»ÔÚ·¶Î§ÄÚ
		{
			LAMP1=1;									//È«Ãð
			LAMP2=1;
			LAMP3=1;
			LAMP4=1;
		}
	}
} 

/*******************************************************************************************************/
void Count_Value(void)
{
	SetTime_dispaly(0x80+3,Value1);
	if(IN1==0)
	{
		delay1(1);
		if(IN1==0)
		{
			while(!IN1);
			if(OUT1_flag==0)
			{
				IN1_flag=1;
				TR0=1;					 //¿ªÆô¶¨Ê±Æ÷ ·ÀÖ¹Îó´¥·¢
			}
			if(OUT1_flag==1)
			{
				
				Value1++;				 //ÈËÊýÔö¼Ó
				if(Value1>=99)			 //Èç¹ûÈËÊý¼ÆÊýµ½99£¬±äΪ×î´ó99
				Value1=99;
				OUT1_flag=0;			 //ÇåÁã
				IN1_flag=0;
				TR0=0;					 //¹Ø±Õ¶¨Ê±Æ÷
				Count=0;
				Miao=0;
			}
		}
	}
	if(OUT1==0)
	{
		delay1(1);
		if(OUT1==0)
		{
			while(!OUT1);
			if(IN1_flag==0)
			{
				OUT1_flag=1;
				TR0=1;					 //¿ªÆô¶¨Ê±Æ÷ ·ÀÖ¹Îó´¥·¢
			}
			if(IN1_flag==1)
			{
				Value1--;				//ÈËÊý¼õÉÙ
				if(Value1<0)			//Èç¹ûÈËÊý¼ÆÊýСÓÚ0£¬±äΪ×îС0
				Value1=0;
				IN1_flag=0;				//ÇåÁã
				OUT1_flag=0;
				TR0=0;					 //¹Ø±Õ¶¨Ê±Æ÷
				Count=0;
				Miao=0;
			}
		}
	}
}
/****************************************ζÈ************************************************************/
/*void delay(uint y)		   							//DS18B20ÑÓʱº¯Êý£¨·ÂÕæÓã©
{
	while(y--);
} 
*/
void delay(uint z)			  							//DS18B20ÑÓʱº¯Êý£¨ÊµÎïÓã©
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=1;y>0;y--);
}  

void write_byte(uint dat)			//дһ¸ö×Ö½Ú
{
	uchar i;
	for(i=0;i<8;i++)		        //Ñ­»·°Ë´Î	  ¹²ÓаËλ
	{
		DQ=0;						//дÁã
		DQ=dat&0x01;                //Ïò×ÜÏßдλÊý¾Ý£¬´Ó×îµÍλдÆð
		delay(4);
		DQ=1;						//дһ
		dat>>=1;				    //Ï´Îд×÷×¼±¸£¬ÒÆλÊý¾Ý
	}
	delay(4);
}				     

uchar read_byte(void)				//¶ÁÒ»¸ö×Ö½Ú£¬·µ»ØÖµ
{
	uchar i;
	uint value;
	for(i=0;i<8;i++)		        //Ñ­»·°Ë´Î	  ¹²ÓаËλ
	{
		DQ=0;
		value>>=1;
		DQ=1;						//ÊÍ·Å×ÜÏß
		if(DQ)
		value|=0x80;			    //DQ=1£¬valueÈ¡1
		delay(4);
	}
	return value;
}

void ds18b20_init()				    //³õʼ»¯º¯Êý
{
	uint n;
	DQ=1;
	delay(8);					   
	DQ=0;
	delay(80);					    //µÍµçƽ480¡ª¡ª960us
	DQ=1;							//×ÜÏßÊÍ·Å
	delay(8);					    //µÈ´ý50¡ª¡ª100us
	n=DQ;						    //¶ÁÈ¡¸´Î»×´Ì¬
	delay(4);
}

int readtemperature()				//¶ÁÕûÊý²¿·Ö
{	
    int a,b;						//¸ß°Ë룬µÍ°Ëλ
	ds18b20_init();
	write_byte(0xcc);			    //Ìø¹ýromÆ¥Å䣬Ìø¹ý¶ÁÐòÁкŵIJÙ×÷£¬¿É½ÚÊ¡²Ù×÷ʱ¼ä
	write_byte(0x44);			    //Æô¶¯Î¶ȼì²â
	delay(300);					    //²âζÈ
	ds18b20_init();				    //¿ªÊ¼²Ù×÷Ç°ÐèÒª¸´Î»
	write_byte(0xcc);				//Ìø¹ýromÆ¥Åä
	write_byte(0xbe);			    //д¶Á¼Ä´æÆ÷ÖÐζÈÖµµÄÃüÁî
	a=read_byte();				    //low	  µÍλ¿ªÊ¼¶ÁÈ¡
	b=read_byte();				    //high	  ¸ßλ¿ªÊ¼¶ÁÈ¡
	b<<=8;							//°Ñ¸ßλ×óÒÆ°Ëλ
	b=b|a;							//¸ß°ËλÓëµÚ°Ëλ½øÐлòÔËË㣬µÃµ½×ܺÍ
	if(b>=0)						//Èç¹ûζȴóÓÚµÈÓÚ0
	{
		b=b*0.0625;					//Ö±½Ó³ËÒÔ0.0625
		write_com(0x80+0x40+2);		//ÔÚLCD1602¶ÔÓ¦µÄλÖò»Ð´ÄÚÈÝ
		write_date(0x20);
	}
    else							//ζÈСÓÚ0
	{	
		b=~b+1;						//È¡·´ÂëÔÙ¼ÓÒ»
		b=b*0.0625;					//ÔÙÔËËã
		write_com(0x80+0x40+2);		//ÔÚLCD1602¶ÔÓ¦µÄλÖÃдһ¸ö¸ººÅ
		write_date(0x2d);
	}
	return b;						//·µ»Øb£¬´ËʱÒÔ±íʾζÈ
}
void temperature_dispaly(char add,char dat)	 		//ζÈÏÔʾº¯Êý£ºµÚÒ»¸ö£º²ÎÊýµÄµØÖ·£¬µÚ¶þ¸ö£º²ÎÊýµÄÄÚÈÝ
{
	uchar shi,ge;
	shi=dat/10;								 		//°ÑζȵÄʮλÌáÈ¡³öÀ´
	ge=dat%10;								 		//°ÑζȵĸöλÌáÈ¡³öÀ´
	write_com(0x80+0x40+add);			   	 		//ҪдµÄµØÖ·
	write_date(0x30+shi);				   	 		//ʮλµÄÄÚÈÝ   1602×Ö·û¿â
	write_date(0x30+ge);				     		//¸öλµÄÄÚÈÝ	1602×Ö·û¿â
}
/*****************************************¶¨Ê±Æ÷³õʼ»¯ºÍÖ÷º¯Êý***********************************************************/
void T0_init(void)
{
	TMOD=0x11;				   	   //ÉèÖö¨Ê±Æ÷0Ϊ¹¤×÷·½Ê½1
	TH0=(65536-50000)/256;   	   //50MS¶¨Ê±
	TL0=(65536-50000)%256;
	EA=1;					   	   //¿ª¶¨Ê±Æ÷T0µÄÖжÏ	×ÜÖжÏ
	ET0=1;						   //ÔÊÐíT0ÖжÏ
//	TR0=1;						   //¿ªÆô¶¨Ê±Æ÷
}
void main()
{
	AUTO_LED=0;					 //ĬÈÏ×Ô¶¯Ä£Ê½
	temperature=readtemperature();
	init();						 //Òº¾§³õʼ»¯
	T0_init();					 //¶¨Ê±Æ÷³õʼ»¯
	delay1(8000);
	while(1)
	{
		if(Adjust==0)			 //·Çµ÷½ÚģʽÏÂÏÔʾʱ¼äÈËÊýºÍζÈ
		{	
			temperature=readtemperature();			//¶ÁȡζÈ
			temperature_dispaly(3,temperature);		//ÏÔʾζÈ
			Time_Display();		 //ÏÔʾʱ¼ä
			Open();		 		 //¶¯×÷ÅжÏ,¸ù¾Ý¹âÏߺÍÉùÏ쿪¹Ø
			Count_Value();		 //¼ÆËãÈËÊý
		}
		Keyscan();				 //ɨÃè¼üÅÌ
	}
}
void Timer0() interrupt 1					//¶¨Ê±Æ÷T0ÖжϺ¯Êý
{
	TH0=(65536-50000)/256;					//¸³³õÖµ=50ms
	TL0=(65536-50000)%256;					//TH0=3C,TL0=B0
	Count++;								//ÿÖжÏÒ»´Î£¬Count¼ÓÒ»£¬¼ÆÊý20´Î£¬±íʾ1sµÄʱ¼äµ½
	if(Count>=20)							//1sµ½
	{
		Count=0;
		Miao++;
		if(Miao>=3)							//3ÃëÄÚÎÞ´¥·¢ÁíÒ»¸ö£¬È«²¿ÇåÁã
		{
			Miao=0;
			OUT1_flag=0;			 		//ÇåÁã
			IN1_flag=0;
			TR0=0;					 		//¹Ø±Õ¶¨Ê±Æ÷
		}
	}

}

完整资料:

https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=614730300167&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585793889860.Copy.detail.614730300167.1828622527&forceFlush=1

发布了30 篇原创文章 · 获赞 12 · 访问量 1995

猜你喜欢

转载自blog.csdn.net/weixin_41017942/article/details/105264264