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

📄 cortrol.c

📁 在外部环境中检测亮度
💻 C
📖 第 1 页 / 共 2 页
字号:
 else if(display_set_data<10000)
    {B[0]=display_set_data%10;
     B[1]=(display_set_data/10)%10;
     B[2]=(display_set_data/100)%10;
     B[3]=display_set_data/1000;
    }
 if(dis_set_flag==DC)
    {B[0]=23;
     B[1]=22;
	 B[2]=22;
	 B[3]=22;
	 B[4]=17;
	}

 for(i=0;i<5;i++)
 {dp_data=DD[B[i]];
  for(j=8;j>0;j--)
     {  CLK=0;
   	    if(dp_data&0x80)
	       Y=1;
		else Y=0;
	       DATA0=Y;
	       CLK=1;
		   dp_data=dp_data<<1;
     
      }  
	
  }
   STB=0;
   STB=1;
   delay(2);
   STB=0;
 
}
/******************************************定时器0中断************************
***函数名称:   time0()                         ****
***函数功能:  定时检测温度,湿度,亮度并显示   ****
*****************************************************************************/
void time0() interrupt 1
{
  uchar key[4]; 
  TH0 = 0xa5;										// 每秒中断100次   
  TL0 = 0x00;										// 中断周期: 10mS    
  
  Key_scan();
  if(KeyNumber!=0xff)
    {
  //   kb_data=KeyNumber;
 	 key[kf++]=KeyNumber;
     if(kf>3)
       kf=0;
     time_count=1;
     KeyNumber=0xff;

     }
  else
    { if(time_count==1)
		{kb_data=key[0];
		 keyboard_flag=0;
		 kf=0;
		}
      time_count=0;
     }              
// if(keyflag==0)
 // {
   if(f1==200)
    {TH_F0=1;
     f3=0;
	 TH_F2=0;
     f2++;
     keyflag=0;
   	 }
   if(f2==200)
    {TH_F1=1;
     TH_F0=0;
	 f1=0;
     f3++;
	 }
   if(f3==200)
   {TH_F2=1;
   	f2=0;
	TH_F1=0;
    f1++;
    if(keyflag==1)
	TH_F2=0; 
	}
   // }
// time_count++;
//  LED=1; 
   if(serial_count>6)
     {
     	RT_Flag=1;
     } 
  }
/*****************************************************************************
/********************************键盘扫描中断程序****************************
***函数名称:  Key_scan() 
***函数功能:  键盘扫描               
******************************************************************************/  
/*void INTT1()interrupt 2
 {
 
     EX1=0;

    // Key_scan();
	// keyflag=0;
	// keyboard_flag=0;
     
     EX1=1;
  
 }     */
//*****************************键盘扫描函数*********************************************************
//*******函数名称:Key_scan                   *********
//*******函数功能:扫描键盘,并取得键值       *********
//*******修改参数:KeyNumber                  *********
//**************************************************************************************************
void Key_scan()
{
  uchar i,j,pin1;
   for(i=0;i<4;i++)
    {for(j=0;j<4;j++)
	   {P2=0XFF&(~(0X01<<(3-i)));
	    pin1=P2;
	//	delay1(10);
		if(((pin1>>(4+j))&0x01)==0)
          {KeyNumber=i+j*4;
		  
		   }
        }
	 }     
 //   P2=0XF0;
//	LED=0;

}
//**************************************************************************************************** 
//******************************************按键查询处理函数  ****************************************
//*******函数名称:key_deal                                              ******************                                          
//*******函数功能:查询按键,若是设置温度,湿度键,就调用设置处理函数    ******************
//****************************************************************************************************  
void key_deal(void)
{
  switch(kb_data)
  {case  3:  keycost_deal(TEMP);
         
              break;
   case  7:  keycost_deal(HUMI);
              break;
   default:   break;

      
  }
 
}
//===================================================================================================
//==========================================按键处理函数=============================================
//********函数名称:keycost_deal                                 ******
//********函数功能:设置温湿度控制参数值,处理,显示             ******
//********入口参数:TEMP,HUMI,温湿度标志                         ******
//********出口参数:无                                           ******
//********修改参数: L_Temp_set, H_Temp_set,L_Hum_set,H_Hum_set ******
//===================================================================================================
void keycost_deal(unsigned char TH_flag)
 { unsigned char KD1=0,KD2=0,KD3=0,keydata=0xff;
   uchar i;
   char DDC;
   keyflag=1;
   for(i=0;i<2;i++)
   { if(TH_flag==HUMI)
      i=1;
	 DDC=1;
     Display_set(0,i); 
     keyboard_flag=1;
     while(keyboard_flag==1);
	 keydata=key_switch(kb_data); 
     if(kb_data==0x0D)                                        //按下“-”号
          {DDC=DDC*(-1);
		   Display_set(0,DC);
		   keyboard_flag=1;
		 //  KeyNumber=0xff;
		   }
	 else if(kb_data==0x0E)                                   //按下"返回"键
	       return;
//=======================第一次数字键============================================	
     while(keyboard_flag==1);
	 keydata=key_switch(kb_data); 
	 if(keydata>=0&&keydata<=9)                     
	      {KD1=keydata;
		   Display_set((keydata*DDC),i);
         
          }
     else if(keydata==0x0E)                                   //按下"返回"键
          return;
	 else 
	      {error_bell();                                      //蜂鸣器报错误信号
		   return;
		   }
//=======================第二次数字键============================================
	 keyboard_flag=1;
     while(keyboard_flag==1);
	 keydata=key_switch(kb_data); 
	 
     if(keydata>=0&&keydata<=9)
		 {
			Display_set(((KD1*10+keydata)*DDC),i);
			// F++;
			KD2=keydata;
		//	KeyNumber=0xff;
		 
		  }
	 else if(kb_data==0x0F)                                //有“个”位时按下"确定"键
          {if(i==0)
		     {if(TH_flag==TEMP)
			    { L_Temp_set=KD1*DDC;
				  keydata=0xff;
                // KeyNumber=0xff;
                 continue;
				 }
		
			  }
		   	else if(i==1)
		     {if(TH_flag==TEMP)
			    { H_Temp_set=KD1*DDC;
                  return;
				 }
			  if(TH_flag==HUMI)
			    {  H_Hum_set=KD1*DDC;
                  return;
				 }
			  }
			}
	   else if(kb_data==0x0E)                              //按下"返回"键
          return;
	   else 
	      {error_bell();                                   //蜂鸣器报错误信号
		   return;
		   }
//=======================第三次数字键============================================		   
	   keyboard_flag=1;
       while(keyboard_flag==1);
       keydata=key_switch(kb_data);  
       
	    if(kb_data==0x0F)                                  //有“十”位数据时按下"确定"键
          {
          	if(i==0)
		     {
				if(TH_flag==TEMP)
				{ 
					L_Temp_set=(KD1*10+KD2)*DDC;
					keydata=0xff;
			    //	KeyNumber=0xff;
					continue;
				}
			 }       
				
				
		   else if(i==1)
				{
					if(TH_flag==TEMP)
					{ 
						H_Temp_set=(KD1*10+KD2)*DDC;
							return;
					}
					if(TH_flag==HUMI)
					{  
						H_Hum_set=(KD1*10+KD2)*DDC;
							return;
					}
				}
			}
	   else if(keydata>=0&&keydata<=9)
			{   if(DDC==-1)
			      {error_bell(); 
				   return;
				   }
				Display_set(((KD1*100+KD2*10+keydata)*DDC),i);
			//	F++;
				KD3=keydata;
				keyboard_flag=1;
			//	KeyNumber=0xff;
			}
	   else if(kb_data==0x0E)                                   //按下"返回"键
          return;
	   else 
	      {error_bell();
		   return;
		   }
       keyboard_flag=1;
       while(keyboard_flag==1);
       if(kb_data==0x0F)                                       //有“百”位数据时按下"确定"键
          {if(i==0)
		     {if(TH_flag==TEMP)
			    { L_Temp_set=(KD1*100+KD2*10+KD3)*DDC;
				  keydata=0xff;
                 // KeyNumber=0xff;
                  continue;
				 }
			  }
		   	else if(i==1)
		     {if(TH_flag==TEMP)
			    { H_Temp_set=(KD1*100+KD2*10+KD3)*DDC;
                  return;
				 }
			  if(TH_flag==HUMI)
			    {  H_Hum_set=(KD1*100+KD2*10+KD3)*DDC;
                  return;
				 }
			  }
			}
	   else if(kb_data==0x0E)                                   //按下"返回"键
          return;
	   else 
	      {error_bell();                                        //蜂鸣器报错误信号
		   return;
		   }
 	 }		  
      
  }              
//=================================================================================

//****************************键值转换函数******************************************
//*****函数名称:key_switch                         **********
//*****函数功能:把实际键值转换成键盘上标识的键值   **********
//**********************************************************************************
uchar key_switch(unsigned char key_d)
 {unsigned char  key_cost;
  switch(key_d)
  {case 0: key_cost=7;break;
   case 1: key_cost=8;break;
   case 2: key_cost=9;break;
   case 3: key_cost=0x10;break;
   case 4: key_cost=4;break;
   case 5: key_cost=5;break;
   case 6: key_cost=6;break;
   case 7: key_cost=0x11;break;
   case 8: key_cost=1;break;
   case 9: key_cost=2;break;
   case 0X0A: key_cost=3;break;
   case 0X0B: key_cost=0X12;break;
   case 0X0C: key_cost=0X00;break;
   case 0X0D: key_cost=0X0D;break;
   case 0X0E: key_cost=0X0E;break;
   case 0X0F: key_cost=0X0F;break;
   default: break;
  }
  return key_cost;
 }

//=============================================================================================================//
//***************************************************************************************************
//******************************读温湿度数据*******************************************
//****函数功能:调用I2C读写函数计算出温湿度值                          ****************
//****入口参数:TEMP,HUMI,温度标志,湿度标志                          ****************
//****出口参数:TH_value,测量温度值,测量的湿度值                     ****************
//***************************************************************************************************
signed int measure(unsigned char mode)
 {  unsigned int TH_H,TH_L,sum;
 	unsigned int i;
	signed int TH_value,rh_lin;
	const float xdata T1=+0.01f;              // for 14 Bit @ 5V
    const float xdata T2=+0.00008f;           // for 14 Bit @ 5V    
    float xdata t_C;                          // t_C   : 温度 

   	s_transstart();                                     //传输开始
 	switch(mode)
 	 {case TEMP: error+=s_write_byte(MEASURE_TEMP);     //发送测温度命令    
 	             break;
 	  case HUMI: error+=s_write_byte(MEASURE_HUM1);     //发送测湿度命令    
 	  	         break;
 	  default:   break;
 	 }
 
  for(i=0;i<65535;i++)                                  //等待温湿度值准备      
   {if(IO0PIN & TH_DATA==0)
   	  break;
    }
      
  if(TH_DATA)
    error=error+1;
  TH_H=s_read_byte(noACK);                              //读温湿度值高位    
  TH_L=s_read_byte(ACK);                                //读温湿度值低位  
  TH_H=TH_H<<8; 
  sum=TH_H+TH_L;
   t_C=sum*0.01 - 40;
  if(mode)
	{
		rh_lin=((-4)+(0.0405*sum)+(sum*sum*(-2.8E-6)));  	//计算湿度值   
    TH_value=(t_C-25)*(T1+T2*sum)+rh_lin;              //计算温度湿度 [%RH]   
    if(TH_value>100)TH_value=100;                      //湿度范围:0.1-100之间   
  }
  else
    TH_value=(-40)+(0.01*sum);                          //计算温度值    
 
  return TH_value;	
 // LED=0;  	
}

//============================================================================

  void s_transstart()                     //SHT11I2C启动  
  {
   TH_DATA=1; TH_SCK=0;                
   delay(1);
   TH_SCK=1; 
   delay(1);
   TH_DATA=0;
   delay(1);
   TH_SCK=0; 
   delay(1);
   TH_SCK=1;
   delay(1);
   TH_DATA=1;           
   delay(1);
   TH_SCK=0;  
  }
 
//============================================================================

char s_write_byte(unsigned char value)// 写字节 检查ack应答 
{ 
unsigned char xdata i,error=0; 
for (i=0x80;i>0;i/=2)                  //shift bit for masking
{ if (i & value) TH_DATA=1;            //masking value with i , write to SENSI-BUS
    else TH_DATA=0; 
    TH_SCK=1;                          //clk for SENSI-BUS
    TH_SCK=1;
    TH_SCK=0;
}
TH_DATA=1;//disp();                         //release DAT-line
TH_SCK=1; //disp();                          //clk #9 for ack 
error=TH_DATA; //disp();                     //check ack (DAT will be pulled down by SHT11)
TH_SCK=0;        
return error;                     //error=1 in case of no acknowledge
}

//======================================================================= 

 unsigned char s_read_byte(uchar ack)    // 读字节 检查ack应答(if ack=1) 
{ 
uchar xdata i,val=0;
TH_DATA=1;                               //release DAT-line
for (i=0x80;i>0;i/=2)                    //shift bit for masking
{ TH_SCK=1;                              //clk for SENSI-BUS
    if (TH_DATA) val=(val | i);          //read bit 
    //disp();
    TH_SCK=0;                     
}
TH_DATA=!ack;                            //in case of "ack==1" pull down DAT-Line
TH_SCK=1; //disp();                           //clk #9 for ack
//disp();                                //pulswith approx. 5 us 
TH_SCK=0;//disp();                            
TH_DATA=1;                               //release DAT-line
return val;
}
//=========================================================================================
//=============================延时函数========================================  
void delay1(unsigned char d1)
{ 
  uchar j,k;
  for(;d1>0;d1--)
   {for(j=50;j>0;j--)
     {for(k=0;k>0;k--);
	 }
	}

}
void delay(unsigned int i)
{ 
 for(;i>0;i--)
	 ;
}

//*************************************蜂鸣器函数*******************************
void bell(void)
 {BELL=0;
  delay(0x8fff);
  BELL=1;
 }
void error_bell(void)
 { char  k;
   for(k=4;k>0;k--)
	{bell();
	delay(0x9fff);
	 }
  }
//*****************************************************************************


  

⌨️ 快捷键说明

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