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

📄 cortrol.c.bak

📁 在外部环境中检测亮度
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************
//**********情报板系统控制器程序              ***********
//**********单片机STC12C5410AD,晶振18.432MHZ  ***********
//**********LIUBIN<2008.6.16>                 ***********
//**********当前版本1.0                       ***********
//****************************************************************************
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <ctype.h>
#include <intrins.h> 
#define ACK  1
#define noACK 0
#define MEASURE_TEMP 0X03   //测量温度命令        
#define MEASURE_HUM1 0X05   //测量湿度命令   
#define TEMP 0              //温度参数标志
#define HUMI 1              //湿度参数标志
#define LUMM 2              //亮度参数标志
#define S_TEMP 3            
#define DC     4         
////***********************************************************************************/
sfr	ISP_CONTR=0xe7;   
sfr ADC_CONTR=0XC5;
sfr ADC_DATA=0XC6;
sfr P1M0=0X91;
sfr P1M1=0X92;
sbit CHECK1=P1^0;
sbit CHECK2=P1^1;
sbit CHECK3=P1^2;
sbit TH_DATA=P1^4;
sbit TH_SCK =P1^5;
sbit C=P3^7;
sbit DRE=P3^2;
sbit E=P1^7;
sbit AC1=P2^0;
sbit AC2=P2^1;
sbit AC3=P2^2;
sbit KB0=0XA0;
sbit KB1=0XA1;
sbit KB2=0XA2;
sbit KB3=0XA3;
sbit STB=P0^0;
sbit CLK=P0^1;
sbit DATA0=P0^2;
sbit BELL=P0^3;
sbit LED=P3^5;
sbit IN1=P3^3;
//sbit test=P1^6;
//****************************************************************************************
void delay1(unsigned char d1);
void delay(unsigned int i);
int ADC3_Switch(void);
void POW_Check(void);
void Display(signed int display_data,unsigned char dis_flag);
void Display_set(signed int display_set_data,unsigned char dis_set_flag);
void serial_Init(void);
char s_write_byte(char);
void s_transstart(void);
unsigned char s_read_byte(char s );
signed int measure(unsigned char mode);  
void key_deal(void);
unsigned char key_switch(unsigned char key_d);
void keycost_deal(unsigned char TH_flag);
void bell(void);
void error_bell(void);
void TH_Control(void);
void Key_scan();
void R_Data_with(void);
void read_device_status( );
void set_TH_Control( );
//******************************************************************/
typedef unsigned char uchar;
uchar xdata CHECK_DATA,POW_DATA;
//uchar xdata serial_id;
uchar xdata i,j;
uchar xdata KeyNumber,kb_data;
bit keyboard_flag,keyflag,RT_Flag;
uchar xdata error;
signed int L_Temp_set,H_Temp_set,H_Hum_set,H_Lum_set;//L_Hum_set,L_Lum_set;
int TEM,HUMM,LUM,f1,f2,f3,time_count;
char TH_F0,TH_F1,TH_F2,kf;
uchar data  serial_count,serial_count_T;				// serial帧位置计数  
uchar data serial_length;							    // serial帧数据长度  
uchar data serial_sum;								    // serial帧总校验和  
uchar data serial_data;						    	    // serial帧数据  
uchar data serial_id;							        // DEVICE地址 
unsigned char serial_buf_R[7]; 		              		// 接收缓冲区
unsigned char serial_buf_T[7]; 		              		// 发送缓冲区
unsigned char serial_buf2[7]; 		                	// 接收缓冲2区
/*****************************************************************/
/***********************************************************************************/
void main(void)
{
 serial_Init( );
  while(1)
  {                       
	LED=0;                                           //点亮指示灯   
  
 	POW_Check( );                                    //三相电源检测
 	TH_Control();                                    //温湿度控制
 
   	if(kb_data!=0xff)                                //按键查询处理
	  { 
        key_deal();	  
 	    KeyNumber=0xff;
 	    kb_data=0Xff;
		keyflag=0;
      }             
    if(TH_F0==1&&RT_Flag==0)               
	  {          
	   
    	TEM=measure(TEMP);                           //测试温度值  
	    Display(TEM,TEMP);                           //显示温度值 
	
	    	 
	  }
	  
    LED=1;                                           //熄灭指示灯   
	if(TH_F1==1&&RT_Flag==0)
	  { 
	  HUMM=measure(HUMI);                            //测试湿度值  
	  Display(HUMM,HUMI);                            //显示湿度值  
      }
	  
    if(TH_F2==1&&RT_Flag==0)
	  { LUM=ADC3_Switch();                           //测试亮度值  
	    Display(LUM,LUMM);                           //显示亮度值   
	    keyflag=1;
	  }         
    if(RT_Flag==1)
	    {
			R_Data_with();
			serial_count=0;                          //复位帧计数  
			serial_sum=0;                            //复位校验和 
	        RT_Flag=0;
		 }  	   
  }
}
/*************************************初始化程序********************************
****函数名称:serial_Init()                         ****************************
****函数功能:设置通讯波特率,定时器0初值 ,变量初值****************************
*******************************************************************************/          
void serial_Init(void)
{ 
	TH1 = 0xFB;									    // 设定TH1初值 , 波特率  19200  
	TL1 = 0xFB;									    // 设定TL1初值,  波特率  19200   
	TH0 = 0Xa5;                                     //定时器0设置初值,定时时间为10MS
	TL0 = 0X00;
	SCON = 0x50;                                    // 设定串口工作方式
    PCON  = PCON|0X80;				 	  
	TMOD = (TMOD & 0x0f) | 0x21;  					// 设定T1为波特发生器
	PS   = 1;										// 串口为高级中断
	ES   = 1;										// 允许串口中断						      	
	TR1  = 1;  										// 启动T1
	TR0  = 1;  
    ET0  = 1; 
//	EX1  = 1;
//	PX1 =1;
//	IT1=1;
   	EA  = 0;
	DRE = 0;                                        //设485接受   
    C=0;
	E=0;
    delay(5);
	serial_id=P2;                                   //读地址 
	delay(5);
	E=1;

	BELL=1;
    error=0;  
//	P2=0XF0;
    KeyNumber=0XFF;
	kb_data=0xff;
	keyboard_flag=1;
	RT_Flag=0;
	keyflag=0;
	f1=200;
	f2=0;
	f3=0;
	TH_F0=0;
	TH_F1=0;
	TH_F2=0;
	time_count=0;
    kf=0;
    serial_count=0;
    serial_count_T=0;
    L_Temp_set=10;
    H_Temp_set=45;
    H_Hum_set=80;
   	EA=1;
 }
//********************************串口中断**********************************
//*******函数功能:处理串口中断,接收数据到缓冲区
//*******          发送缓冲区中要发送的数据
//**************************************************************************
void serial_IR (void) interrupt  4 
{
  uchar temp;
  if(RI)
  {RI=0;
  	//LED=0;
   temp=SBUF;
   if(temp==0x00)
   	ISP_CONTR=0X60;                                     //软件复位  
   else 
   serial_buf_R[serial_count++]=temp; 	                //将数据写入缓存区              
   }
  if(TI)
  { TI=0;
	serial_count_T++;
	if(serial_count_T < 7)
    	SBUF = serial_buf_T[serial_count_T];            //发送待发数据  
	else DRE = 0;                                       //设485接受 
  }


 }

 //*********************************接收到数据处理函数*******************
 
void R_Data_with(void)
{// LED=0;
	for(i=0;i<7;i++)
   {
   	serial_buf2[i]=serial_buf_R[i];
   	}
	 for(i=0;i<6;i++)
    {
    	serial_sum+=serial_buf_R[i];
   	}
	  if(serial_sum==serial_buf2[6])                //校验和累加  
		{  
			if(serial_buf2[1]== serial_id)          //校验地址  
	    	{   
	    		if(serial_buf2[2] == 0xA0)
		      	   read_device_status( );           //读取控制状态    
			 	if(serial_buf2[2]==0x50)
			       {
			       	set_TH_Control( );              //设置控制  
		           // write_flash();
		           }
	         }   
		  }  
 
 }
//*******************************取电源状态,温湿度,亮度参数值发送函数*********************
void read_device_status( )
{ // LED=0;
   serial_buf_T[0]=0XAA;
   serial_buf_T[1]=serial_id;
   serial_buf_T[2]=POW_DATA;
   serial_buf_T[3]=TEM;
   serial_buf_T[4]=HUMM;
   serial_buf_T[5]=LUM;
   serial_buf_T[6]=serial_buf_T[0]+serial_buf_T[1]+serial_buf_T[2]+serial_buf_T[3]+serial_buf_T[4]+serial_buf_T[5];
   DRE = 1;                                        //485启动发送 ,发送温湿度,亮度参数值
   delay(200); 
   serial_count_T = 0;
   SBUF = serial_buf_T[0]; 
 
 
 }
//******************************************************************************************
//*************************参数控制处理函数*************************************************
void set_TH_Control( )
{
  L_Temp_set=serial_buf2[3];
  H_Temp_set=serial_buf2[4];	
  H_Hum_set =serial_buf2[5];
  serial_buf_T[0]=0XBB;
   serial_buf_T[1]=serial_id;
   serial_buf_T[2]=0X50;
   serial_buf_T[3]=serial_buf2[3];
   serial_buf_T[4]=serial_buf2[4];
   serial_buf_T[5]=serial_buf2[5];
   serial_buf_T[6]=serial_buf2[6];
   DRE = 1;                                        //485启动发送,返回应答数据 
   delay(200); 
   serial_count_T = 0;
   SBUF = serial_buf_T[0]; 	
}
//*****************************************************************************************	
	
//********************************A/D转换函数*(P1.3)***********************************************/
int ADC3_Switch(void)
{
 int ADC_DA;
 ADC_CONTR=ADC_CONTR|0X80;                 //开A/D转换电源 
 delay(1000);
 P1M0=P1M0|0X08;                           //设置P1.3为开漏模式                         
 P1M1=P1M1|0X08;
 ADC_CONTR=ADC_CONTR|0XE3;                 //设置P1.3为A/D转换通道 
 ADC_CONTR=ADC_CONTR&0XEF;
 delay(10);
 ADC_DATA=0;
 ADC_CONTR= ADC_CONTR|0X08;                //启动A/D转换 
  while((ADC_CONTR&0X10)==0)                //判断A/D转换是否完成                 
      {;} 
 ADC_CONTR=ADC_CONTR&0XE7;                 //清标志,关闭A/D转换  
 ADC_DA=ADC_DATA;   
 return(ADC_DA);
}
//****************************************************************************************************************/
//*******************************************三相电源检测函数*****************************************************/    
void POW_Check()
 {
   if(CHECK1==0)
     {
      POW_DATA=0X01;
     
      }
   else 
   	  {
   	   POW_DATA=0;
   	
       }
   if(CHECK2==0)
     {
      POW_DATA=(POW_DATA<<1)|0X01;
  
      }
   else 
   	  {
   	   POW_DATA=POW_DATA<<1;
   	   
      }
   if(CHECK3==0)
      {
       POW_DATA=(POW_DATA<<1)|0X01;
      }
   else 
   	  {
   	   POW_DATA=POW_DATA<<1;
   	 
       }

  if(POW_DATA!=0x07)
    {CHECK_DATA=0XFF;

	 }
  else 
   { CHECK_DATA=0XF8;

	}


 }
//================================================================================================================//
//=============================================温湿度控制函数=====================================================
void TH_Control(void)
{uchar TH_Con_data;
 if(TEM>H_Temp_set)
    TH_Con_data=0xf7;
 else if(TEM<L_Temp_set)
    TH_Con_data=0xEF;
 else if(L_Temp_set<TEM<H_Temp_set)
    TH_Con_data=0XFF;
 if(HUMM>H_Hum_set)
 	 TH_Con_data= TH_Con_data&0XDF;
 ET0=0;
 P2=CHECK_DATA&TH_Con_data;
 C=1;
 delay(5);
 C=0;
 ET0=1;
 //P2=0XF0;	   
 
}
//*********************************************************************************************************************/
//************************************************数码管显示函数*******************************************************
//********函数名称: Display                        *******
//********函数功能:五位数码管显示温湿度,亮度     *******
//********入口参数:显示数值,参数标志             *******
//********返回值  :无                             *******
//*******************************************************************************************************
void Display(signed int display_data,unsigned char dis_flag)
{uchar xdata A[5];
 code uchar D[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0XC7,0X8C,0X88,0XC1,0X91,0XFF,0XBF,0X9C};
 uchar dp_data,Y;
 if(dis_flag==TEMP)
    {A[0]=12;
	 A[1]=24;
	 }
 if(dis_flag==HUMI)
    {A[0]=16;
	 A[1]=19;
	 }
 if(dis_flag==LUMM)
    {A[0]=17;
	 A[1]=22;
	 }
 if(display_data<=-10)
   {A[2]=(display_data*(-1))%10;
    A[3]=(display_data*(-1))/10;
    A[4]=23;
    }
 else if(display_data<0)
    {A[2]=display_data*(-1);
     A[3]=22;
     A[4]=23;
    }
 else if(display_data<10)
    {A[2]=display_data;
     A[3]=22;
     A[4]=22;
     }
 else if(display_data<100)
    {A[2]=display_data%10;
     A[3]=display_data/10;
     A[4]=22;
    }
 else if(display_data<1000)
    {A[2]=display_data%10;
     A[3]=(display_data/10)%10;
     A[4]=display_data/100;
    }
 else if(display_data<10000)
    {A[1]=display_data%10;
     A[2]=(display_data/10)%10;
     A[3]=(display_data/100)%10;
     A[4]=display_data/1000;
    }

 for(i=0;i<5;i++)
 {dp_data=D[A[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;
 
}
//===========================================================================================================// 
//**********************************************数码管显示参数 函数*******************************************
//******函数功能:显示设置参数值   *******
//************************************************************************************************************
void Display_set(signed int display_set_data,unsigned char dis_set_flag)
{int B[5];
 code uchar DD[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0XC7,0X8C,0X88,0XC1,0X91,0XFF,0XBF,0X9C};
 uchar dp_data,Y;
 if(dis_set_flag==0)
    {B[4]=17;
    }
 if(dis_set_flag==1)
    {B[4]=16;
	}

 if(display_set_data<=-10)
   {B[0]=(display_set_data*(-1))%10;
    B[1]=(display_set_data*(-1))/10;
    B[2]=23;
    B[3]=22;

    }
 else if(display_set_data<0)
    {B[0]=display_set_data*(-1);
     B[1]=22;
     B[2]=23;
     B[3]=22;
    }
 else if(display_set_data<10)
    {B[0]=display_set_data;
     B[1]=22;
     B[2]=22;
	 B[3]=22;
     }
 else if(display_set_data<100)
    {B[0]=display_set_data%10;
     B[1]=display_set_data/10;
     B[2]=22;
	 B[3]=22;
    }
 else if(display_set_data<1000)
    {B[0]=display_set_data%10;
     B[1]=(display_set_data/10)%10;
     B[2]=display_set_data/100;
	 B[3]=22;
    }

⌨️ 快捷键说明

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