SHT20最新数字温湿度传感器芯片 程序
/*
STC15L系列单片机
11.0592M晶振、3.3V
20150612 mos
*/
#include
#include
#define add_w 0x80 //传感器地址 + 写操作
#define add_r 0x81 //传感器地址 + 读操作
#define T_code 0xe3 //温度 测量指令
#define RH_code 0xe5 //湿度 测量指令
#define user_code_w 0xe6 //用户寄存器 写指令
#define user_code_r 0xe7 //用户寄存器 读指令,可读电池电压是否小于2.25V。(测量后才可查看)
#define RST_code 0xfe //软复位,寄存器服务。
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^3; //数据线
sbit scl=P1^4; //时钟线
/***********延时程序***********/
//11.0592MHz 1T 时钟周期0.09042us 机器周期0.09042us,根据当前配置计算延时程序。
//测量分辨率 RH 12 BIT、T 14 BIT,测量时间RH29ms、T85ms
//测量分辨率 RH 8 BIT、T 12 BIT,测量时间RH4 ms、T22ms
//SCL时钟,延时2us
void delay85ms(void) //误差 -0.[1**********]1us
{
unsigned char a,b,c;
for(c=97;c>0;c--)
for(b=56;b>0;b--)
for(a=85;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
void delay29ms(void) //误差 -0.[1**********]7us
{
unsigned char a,b,c;
for(c=161;c>0;c--)
for(b=221;b>0;b--)
for(a=3;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay15ms(void) //误差 -0.[1**********]2us
{
unsigned char a,b;
for(b=220;b>0;b--)
for(a=187;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
/*void delay4ms(void) //误差 -0.[1**********]3us
{
unsigned char a,b;
for(b=89;b>0;b--)
for(a=247;a>0;a--);
}
void delay22ms(void) //误差 -0.[1**********]4us
{
unsigned char a,b,c;
for(c=9;c>0;c--)
for(b=170;b>0;b--)
for(a=78;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
} */
void delay2us(void) //误差 -0.[1**********]9us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=8;a>0;a--);
}
/***********时序程序***********/
//传感器 基本时序程序。
//1 启动
//2 停止
//3 应答&非应答
//4 接收应答
//5 发送 一字节
//6 接收 一字节
//1 启动
void start(void)
{
sda=1;
delay2us();
scl=1;
delay2us();
sda=0;
delay2us();
scl=0;
delay2us();
}
//2 停止
void stop(void)
{
sda=0;
delay2us();
scl=1;
delay2us();
sda=1;
delay2us();
scl=0;
delay2us();
}
//3 应答&非应答
void ACK (void)
{
sda=0;
delay2us();
scl=1;
delay2us();
scl=0;
delay2us();
}
void noACK (void)
{
scl=1;
delay2us();
sda=0;
scl=0;
delay2us();
}
//4 接收应答
bit getACK(void)
{
bit ack1=0;
sda=1;
delay2us();
scl=1;
delay2us();
ack1=sda;
scl=0;
delay2us();
return ack1;
}
//5 发送 一字节
void send(uchar DATA)
{
uchar Bit_Counter=8;
while(Bit_Counter>0)
{
sda=(bit)(DATA&0x80);
DATA
scl=1;
delay2us();
scl=0;
delay2us();
Bit_Counter--;
}
}
//6 接收 一字节
unsigned char Read()
{
unsigned char x=0,y=8;
sda=1;
while(y>0)
{
scl=1;
delay2us();
if(sda)
x=x|0x01;
else
x=x&0xfe;
scl=0;
delay2us();
if(y>1)
x=x
y--;
}
return x;
}
/*1**********传感器初始化&软复位*********/
/*2**********传感器用户寄存器读取*******/
/*3**********传感器测量分辨率设置*******/
/*4**********传感器低电压检测***********/
// 1传感器初始化&软复位
void SHT2x_init()
{
start();
send(add_w);
getACK();
send(RST_code);
getACK();
stop();
delay15ms();
sda=1;
scl=1;
}
// 2传感器用户寄存器读取
unsigned char SHT2x_user_register()
{
uchar register_data;
start();
send(add_w);
getACK();
send(user_code_r);
getACK();
start();
send(add_r);
getACK();
register_data=Read();
noACK();
stop();
return register_data;
}
// 3 传感器测量分辨率设置
// 测量分辨率设置 RH 8 BIT、T 12 BIT,测量时间RH4ms、T22ms
void SHT2x_Resolution()
{
start();
send(add_w);
getACK();
send(user_code_w);
getACK();
send(0x3b);
getACK();
getACK();
stop();
}
// 4 传感器低电压检测
// 此状态位在每次测量后更新
bit SHT2x_battery()
{
uchar battery;
start();
send(add_w);
getACK();
send(user_code_r);
getACK();
start();
send(add_r);
getACK();
battery=Read();
noACK();
stop();
battery=(battery&0x40)>>6;
return battery;
}
/***********测量结果***********/
// 1 湿度测量
// 启动》发送地址+写操作》接收ACK》湿度测量命令》接收ACK》启动》发送地址+读操作》...
// ...接收ACK》测量时间延时》读取高位数据》ACK》读取低位数据》NO_ACK》停止。
// 计算结果。返回结果。
unsigned int RH_Result()
{
unsigned int RH_Data;
unsigned long RH=0;
start();
send(add_w);
getACK();
send(RH_code);
getACK();
start();
send(add_r);
getACK();
delay29ms();
RH_Data=Read();
ACK();
RH_Data=RH_Data
RH_Data=RH_Data|Read();
noACK();
stop();
RH_Data=RH_Data&0xfffc;
RH=RH_Data*12500L;
RH=RH>>16;
RH=RH-600;
return RH;
}
// 2 温度测量
// 启动》发送地址+写操作》接收ACK》温度测量命令》接收ACK》启动》发送地址+读操作》...
// ...接收ACK》测量时间延时》读取高位数据》ACK》读取低位数据》NO_ACK》停止。
// 计算结果。返回结果。
unsigned int T_Result()
{
unsigned int T_Data;
unsigned long T=0;
start();
send(add_w);
getACK();
send(T_code);
getACK();
start();
send(add_r);
getACK();
delay85ms();
T_Data=Read();
ACK();
T_Data=T_Data
T_Data=T_Data|Read();
noACK();
stop();
T_Data=T_Data&0xfffE;
T=T_Data*17572L;
T=T>>16;
T=T-4685;
return T;
}
/***********主程序***********/
void main()
{
uint T,RH,B1;
//i=RH_Result();
//i=T_Result();
SHT2x_init();
SHT2x_Resolution();
B1=SHT2x_user_register();
T=T_Result();
RH=RH_Result();
SHT2x_battery();
while(1);
}