www.pudn.com > SHT11.rar > WSKZ_SHT11.c, change:2008-04-20,size:7552b


 #include <reg52.h>  //头文件 
 #include <intrins.h> 
 #include <stdio.h> // 
#include <math.h>    //Keil library   
 
//************************************** 
 
#define uchar unsigned char //定义一下方便使用 
#define uint  unsigned int //定义一下方便使用 
#define ulong unsigned long //定义一下方便使用 
 
 
#define TEMP_ML 0x03   //000   0001    1 温度命令 
#define HUMI_ML 0x05   //000   0010    1 温度命令 
unsigned char error  ;//全局错误变量 
unsigned char ack  ;//全局应答变量 
//float temp_zi  ;//全局应答变量 
//float humi_zi  ;//全局应答变量 
unsigned char temp_h  ;//全局应答变量 
unsigned char temp_LL  ;//全局应答变量 
 
 unsigned  int  xianzhi_t=0;//温度显值 
 unsigned  int  xianzhi_h=0;//湿度显值 
 
 
uchar setzhi_h,setzhi_l; 
bit   setbz_h,setbz_l,setkey; 
 
 
 sbit DATA =P2^6;//数据 
 sbit SCK=P2^7;//时钟 
 sbit hot =P2^0;// 加热 
 sbit motor =P2^1;// 电机 
 sbit speek =P2^2;// 声音 
 sbit set =P0^0;//  设置 
 sbit setup =P0^1;//  设置+ 
 sbit setdown =P0^2;//  设置- 
 
 sbit	gwei =P3^4;//个位 
 sbit	swei =P3^3;//十位 
 sbit	bwei =P3^2;//百位 
 sbit	qwei =P3^1;//千位 
 unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳 
 
 
 
//*******************************基本驱动程 
 
 
 
///////////////// 
 ////////////////////// 
 
 
char read() //读一个字节 返回应答信号 
//---------------------------------------------------------------------------------- 
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"  
{  
  unsigned char i,val=0; 
  temp_LL=0; 
  temp_h=0; 
  DATA=1;                           //释放数据总线 
  for (i=0x80;i>0;i/=2)             //位移8位 
  { SCK=1;                          //上升沿读入 
    if (DATA) val=(val | i);        //确定值   
    SCK=0;  					  
  } 
   DATA=0;                        //读应答信号,有应答为1,为应答为0 通过CPU下拉为应答 
  SCK=1;                            //第9个脉冲 
   _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us  
  SCK=0;						     
  DATA=1;                           //释放数据总线 
  temp_h=val; 
  val=0; 
 
 ////低8位///////////////////////////// 
 
    DATA=1;                           //释放数据总线 
  for (i=0x80;i>0;i/=2)             //位移8位 
  { SCK=1;                          //上升沿读入 
    if (DATA) val=(val | i);        //确定值   
    SCK=0;  					  
  } 
   DATA=1;//0;                        //不需要应答 通过CPU下拉为应答 
  SCK=1;                            //第9个脉冲 
   _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us  
  SCK=0;						     
  DATA=1;                           //释放数据总线 
  temp_LL=val; 
 
 } 
//////////// 
 
 
  char write(unsigned char value) //写一个字节 返回应答信号 
//--------------------------------------------------------- 
{  
  unsigned char i ; 
   ack=0;   
  for (i=0x80;i>0;i/=2)             //释放数据总线 
  { if (i & value) DATA=1;          //写入值 
    else DATA=0;                         
    SCK=1;                          //上升沿写入 
     _nop_(); _nop_(); _nop_();        //延时	 
    SCK=0; 
  } 
  DATA=1;                           //释放数据总线 
  SCK=1;                            //第9个脉冲 
  if  (DATA==1) ack=1; 
                         //读应答信号 
  SCK=0;         
  return ack;                     //error=1 表示没有应答 
} 
//////// 
 
void start_sht11(void)  //启动 
//-------------------------------------------------------- 
{   
   DATA=1; SCK=0;                   //数据为1,SCK=0 
    _nop_(); 
   SCK=1;                          //第一个脉冲 
    _nop_(); 
   DATA=0;                         //数据跌落 
    _nop_ (); 
   SCK=0;                         //完成一个脉冲 
    _nop_(); _nop_(); _nop_(); 
   SCK=1;                         //再一个脉冲 
    _nop_(); 
   DATA=1;                        //数据变为1		    
    _nop_(); 
   SCK=0;                         //完成该脉冲		    
} 
 
 
////////////////////////////////// 
void sht_rest(void)  //复位 
    
{   
  unsigned char i;  
  DATA=1; SCK=0;                    //数据为1 时钟为0 
  for(i=0;i<9;i++)                  //9 个脉冲为 复位 
  { SCK=1; 
    SCK=0; 
  } 
  start_sht11();                   //启动 
} 
 
//////////////////////////////// 
 
 
			  //测量温度或者是温度,返回校验值 
  text_a(unsigned char ml) 
	{  
 		 unsigned int i; 
 
 		 start_sht11();                   //启动 
 		 write(ml);//写入测温度 
		 if (ack==1)  
		    { 
			    sht_rest() ;//复位 
          		 write(ml);//写入测温度 
             } 
        
          //判断是否处于忙 
 
	//	 DATA=1;//释放数据总线 
      //for (i=0;i<65535;i++) if(DATA==0) break;  
 
	 for (i=0;i<55535;i++){ if(DATA==0) break;else 	{xianshi();} } 
 
 
 		 read();//读温度 
 
 
  } 
 
 
/////////温湿度处理////// 
 
    text_jishuan_temp11() 
	{ 
	   error=0; 
	   ack=0; 
      sht_rest() ;//复位 
 
 	   text_a(TEMP_ML); 
 
      text_jishuan_temp(); 
	   key(); 
 	    text_a(HUMI_ML); 
  
      text_jishuan_humi(); 
 
 
          } 
 
///// 
 
 //////////计算温度//// 
 text_jishuan_temp() 
 { 
    float aa=0,bb=0,temp_zi; 
	int   abcd=0; 
 
 aa=(float)temp_h*256+(float)temp_LL;  
 temp_zi=0.01*aa-40; 
 
// 
 
 if  (temp_zi<0) 
    { 
	  temp_zi=0; 
    } 
   temp_zi=temp_zi*10; 
   xianzhi_t=(int)temp_zi;//给显示值 
 
   } 
  ///////计算湿度////// 
  text_jishuan_humi() 
 { 
    float aa=0,bb=0,humi_zi; 
	int   abcd=0; 
 
 aa=(float)temp_h*256+(float)temp_LL;  
 
 bb=aa*aa*2.8/1000000; 
 aa=0.0405*aa; 
 aa=aa-4-bb; 
 humi_zi=aa; 
 
 // 
    humi_zi=humi_zi*10; 
   xianzhi_h=(int)humi_zi; 
   } 
 
 
 
///////延时/////// 
delay(int i) 
{ 
   while(--i);      
      
}      
 
///////显示处理/////// 
xianshi() 
{     
    int   abcd=0; 
    int i;  
  for (i=0;i<1;i++) 
{   
 abcd=xianzhi_h; 
 gwei=1; 
 swei=1; 
 bwei=1; 
 qwei=1; 
 P1=dispcode[abcd/100]; 
  qwei=0; 
 delay(40); 
  qwei=1; 
  abcd=abcd%100	  ; 
 P1=dispcode[abcd/10]; 
 bwei=0; 
 delay(40); 
 bwei=1; 
 
 if(setbz_h^setbz_l) 
 { 
    if(setbz_h) abcd=setzhi_h; 
    if(setbz_l) abcd=setzhi_l; 
 
 	P1=dispcode[abcd/10]; 
  	swei=0; 
 	delay(40); 
  	swei=1; 
 	P1=dispcode[abcd%10]; 
 	gwei=0; 
 	delay(40); 
 	gwei=1;   
 
  } 
  else 
  { 
 	abcd=xianzhi_t; 
 	P1=dispcode[abcd/100]; 
  	swei=0; 
 	delay(40); 
  	swei=1; 
  	abcd=abcd%100	; 
 	P1=dispcode[abcd/10]; 
 	gwei=0; 
 	delay(40); 
 	gwei=1;   
   } 
 } 
} 
 
  doing() 
  { 
  char xianzhi_mi; 
   xianzhi_mi=xianzhi_t/10; 
   if((xianzhi_mi<setzhi_h)&(xianzhi_t>setzhi_l)) { motor=0;hot=0;speek=0;} 
   if(xianzhi_mi>setzhi_h)  { motor=1;hot=0;speek=1;} 
   if(xianzhi_mi<setzhi_l)  { motor=0;hot=1;speek=1;} 
  } 
 
 
key() 
{ 
  if(set&setkey)  
  { 
     setkey=0; 
     if(setbz_l) {setbz_l=0;setbz_h=0;} 
	 else  
	 { if(!setbz_h) setbz_h=1; 
	   else {setbz_h=0;setbz_l=1;} 
	  } 
   } 
   if(!set)  setkey=1; 
 
  if(setup==0) 
  { 
      if(setbz_h==1) 
	       { if (setzhi_h<=99) setzhi_h++;} 
      if(setbz_l==1) 
	       { if ((setzhi_l<setzhi_h)&(setzhi_l<=99)) setzhi_l++;} 
  }	  	   
 
 if(setdown==0) 
  { 
      if(setbz_h==1) 
	       { if ((setzhi_h>setzhi_l)&(setzhi_h>=1)) setzhi_h--;} 
      if(setbz_l==1) 
	       { if (setzhi_l>=1) setzhi_l--;} 
  }	  	   
 
 
   
 } 
 
//系统初始化/// 
csh() 
{ 
   P0=0XFF; 
   P1=1; 
   P2=0; 
   P3=0XFF; 
} 
   
 
 
///////////////////////////////// 
/////////////////////// 
main() 
{ 
  
  setzhi_h=22;//设置高温 
  setzhi_l=20;//设置低温 
 
   csh();//系统初始化 
    while(1) 
  { 
   text_jishuan_temp11();//测温湿度 
   //xianshi();//显示 
   doing();//处理 
   key();//键处理 
 //  xianshi();//显示     
    
      
  } 
}