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

📄 sht11.txt

📁 AVR的mega128单片机对SHT11温湿度传感器采集
💻 TXT
字号:

  

#include<iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define set_data_out() sbi(DDRB,PB6);//设置DATA为输出
#define set_data_input() cbi(DDRB,PB6);//设置DATA为输入
#define set_data_out_1() sbi(PORTB,PB6);//DATA为高
#define set_data_out_0() cbi(PORTB,PB6);//DATA为低

#define set_sck_out() sbi(DDRB,PB5);//设置SCK为输出
#define set_sck_out_1() sbi(PORTB,PB5);//SCK为高
#define set_sck_out_0() cbi(PORTB,PB5);//SCK为低





void Start(void)            //起始信号子程序
{
 //set_sck_out();
 set_sck_out_1();
 _delay_loop_2(5);           //延时2.7微妙
 //set_data_out();
 set_data_out_1();
 _delay_loop_2(5);
 set_data_out_0();
 _delay_loop_2(5);
 set_sck_out_0();
 _delay_loop_2(5);
 _delay_loop_2(5);
 set_sck_out_1();
 _delay_loop_2(5);
 set_data_out_1();
 _delay_loop_2(5);
 set_sck_out_0();
 _delay_loop_2(5);
} 

void Reset_communication(void)//复位通信
{
 int l;
 _delay_loop_2(25000);//延时13.5毫秒
 set_data_out();
 set_data_out_1();
 set_sck_out();
 set_sck_out_0();
 for(l=1;l<=10;l++)
 {
 set_sck_out_1();
 _delay_loop_2(5);
 set_sck_out_0();
 _delay_loop_2(5);
 }
 Start();
}


void Testack(void)//应答检查
{
 int stateack;
 //set_data_out_1();
 //_delay_loop_2(5);
 stateack=PINB;              //读入数据线上的应答状态
  if((stateack&0x40)==0)     //ack=0时,清零标志Flag
 {
  Flag=0;
 }
  else
 {
  Flag=1;
  }
 set_sck_out_1();
 //_delay_loop_2(5);



 //_delay_loop_2(5);
 set_sck_out_0();
 //_delay_loop_2(5);
}

void Ack(void)//主控制器发送应答子程序
{
 set_data_out();
 set_data_out_0();
 //_delay_loop_2(5);
 set_sck_out_1();
 _delay_loop_2(5);
 _delay_loop_2(5);
 set_sck_out_0();
 //_delay_loop_2(5);
 set_data_input();
 
 //set_data_out_1();//主控制器使用内部上拉电阻释放总线
}

void Stop_Noack(void)//主控制器发送非应答子程序,终止通信
{
 set_data_out();
 set_data_out_1();    //主机不予应答,输出高电平
 //_delay_loop_2(5);
 set_sck_out_1();
 _delay_loop_2(5);
 _delay_loop_2(5);
 set_sck_out_0();
 //_delay_loop_2(5);
}

void Send_measure_command(unsigned int input)//发送测量命令
{
 unsigned int temp;
 for(temp=8;temp!=0;temp--)//循环移位,逐位发送数据
 {
 
  //_delay_loop_2(5);
  if((input&0x80)==0)
  {
   set_data_out_0();
  }
   else
  {
   set_data_out_1();
  }
  set_sck_out_1();
  _delay_loop_2(5);
  _delay_loop_2(5); 
  
  set_sck_out_0();
  
  
  //_delay_loop_2(5);
  input=input<<1;
 }
}

void Start_measure(void) //启动测量
{
 int j;
 //_delay_loop_2(5);
 set_data_out_1();        //从机释放总线,主控制器使用内部上拉电阻,使得总线空闲
 for(j=0;j<10;j++)
 {
 _delay_loop_2(50000);//延时260毫秒,等待测量结束
 }
}

void Wait_data_ready(void)//等待SHT11拉低总线
{
 int dataready;
 dataready=PINB;
 while(!((dataready&0x40)==0));
}

unsigned int Read_return_8bitdata(void)//读取返回的一个字节数据
{
 unsigned int k,rbyte=0,rbyte1=0;
 for(k=8;k!=0;k--)        //逐位读入字节数据
 {
   set_sck_out_1();
  //
  rbyte1=rbyte1<<1;
  if((PINB&0x40)==0)
  rbyte=0;
  else
  rbyte=1;
  
  rbyte1=rbyte1|rbyte;
 
  //_delay_loop_2(5);
  //_delay_loop_2(5);
  set_sck_out_0();
  //_delay_loop_2(5);
 }
 return(rbyte1);            //返回读入的字节数据
}




float get_temperature(void)
{
 const float d1=-39.36,d2=0.01;
 float t;
 uint16_t tem;
 do{
 Reset_communication();
 Start();
 Send_measure_command(T);//控制器往总线上传送测量相对湿度命令
 set_data_input();//SHT11控制总线
 set_data_out_1();
 Testack();//应答检查
 }while(Flag==1);
 Start_measure();//启动测量
 //set_data_out_1();
 Wait_data_ready();//等待数据准备
 T_receive[0]=Read_return_8bitdata();
 Ack();
 T_receive[1]=Read_return_8bitdata();
 Stop_Noack();
 T_receive[0]=T_receive[0]&0x3f;
 T_receive[0]=T_receive[0]*16*16;
 tem=T_receive[0]+T_receive[1];
 float Tem=tem;
 t=d1+d2*Tem;                         //计算出温度
 return(t);
}


float get_humidity(void)
{
 uint16_t H;
 const float c1=-4.0,c2=0.0405,c3=-0.0000028,t1=0.01,t2=0.00008;
 float h;
 float rh_true;
 do{
 Reset_communication();
 Start();
 Send_measure_command(RH);//控制器往总线上传送测量相对湿度命令
 set_data_input();//SHT11控制总线
 set_data_out_1();
 Testack();//应答检查
 }while(Flag==1);
 Start_measure();//启动测量
 //set_data_out_1();
 Wait_data_ready();//等待数据准备
 RH_receive[0]=Read_return_8bitdata();
 Ack();
 RH_receive[1]=Read_return_8bitdata();
 Stop_Noack();
 RH_receive[0]=RH_receive[0]&0x0f;
 RH_receive[0]=RH_receive[0]*16*16;
 H=RH_receive[0]+RH_receive[1];
 float rh=H;
 h=c1+c2*rh+c3*rh*rh;                         //计算出相对湿度
 temperature=get_temperature();
 rh_true=(temperature-25)*(t1+t2*rh)+h;
 if(rh_true>100) rh_true=100;
 if(rh_true<0.1) rh_true=0.1;
 return(rh_true);
}

⌨️ 快捷键说明

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