📄 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 + -