/*编译环境**************************************
功能 :温湿度传感器SHT10接口时序代码
适用 :
CPU :STC12LE5616
IDE :Keil uVision2
电路板 :
温度湿度传感器SHT10
P2.4: SHTDATA
P2.5: SHTSCK
本程序说明
本程序已经调试通过并已开始使用,确保时序无误。
如果不能调试通过,请确保硬件电路正确,且延时足够。
本程序包含三个文件:SHT10.c,SHT10.h,const.h。
这只是一个项目中的部分文件,不能单独编译。
如果有疑问,欢迎交流:leruite@126.com
由于本项目没有用到,因此没有把湿度的测量值转换为实际,请根据datasheet自行编写
广告^_^:
北京乐锐特电子有限公司
老中发3037柜
主营电阻、电容、集成电路,并为客户提供配单服务;单片机系统开发,指导学生毕业设计
电话:010-62610288,15611692294
传真:010-62610288
邮箱:leruite@126.com
QQ:21418740
MSN:leruite@live.cn
欢迎光临、欢迎垂询,本柜台竭诚为您服务。
************************************************/
/*SHT10时序说明*********************************
同I2C很相似
总线空闲
SCK保持低电平,DATA保持高电平
开始信号
把SCK置为高,把DATA置低;在DATA为低的情况下,SCK发出一个负方波,即先置低,再置高;
再把DATA置高,SCK置低,(DATA置低)。至此完成开始信号
数据传送
SCK为高时,DATA的数据需保持稳定;只有当SCK为低电平时,才允许DATA上的数据改变.
应答信号
接收数据的IC在每收到1字节(8bit)数据,向发送数据的IC发出低电平脉冲信号,视为已收到信号
结束信号
没有必须的结束信号;如果在数据接收过程中想结束本次传输,只需保持ACK为高电平,即可结束
转换结束
在启动温度或湿度检测后至测量完成,需要等待一段时间,SHT10通过下拉DATA至低电平表示测量结束.
************************************************/
#define SHT10_CFILE
#include "const.h"
#include "sht10.h"
/*延时子程序************************************/
static void Delay_Time(u8 time)
{
for(;time>0;time--)
{}
}
void Init_Sht(void)
{
P2M1&=~0x30; //P2口 7 6 5 4 3 2 1 0
// P2M1|=0x08; // O D
P2M0&=~0x10; //P2M1 0 0
P2M0|=0x20; //P2M0 1 0
}
/*SHT接口复位***********************************/
void Sht_Connect_Rst(void)
{
s8 i;
High_Shtdata();
Delay_Time(SHT_DELAY);
Low_Shtsck();
Delay_Time(SHT_DELAY);
for(i=10;i>0;i--)
{
High_Shtsck();
Delay_Time(SHT_DELAY);
Low_Shtsck();
Delay_Time(SHT_DELAY);
}
}
/*SHT start***********************************/
void Sht_Start(void)
{
High_Shtsck(); //SCK置1
Delay_Time(SHT_DELAY);
Low_Shtdata(); //DATA清0
Delay_Time(SHT_DELAY);
Low_Shtsck(); //SCK清0
Delay_Time(SHT_DELAY);
High_Shtsck(); //SCK置1
Delay_Time(SHT_DELAY);
High_Shtdata(); //DATA置1
Delay_Time(SHT_DELAY);
Low_Shtsck(); //SCK清0
}
/*发送一个ACK***********************************/
void Sht_Send_Ack(void)
{
High_Shtdata(); //?把数据线打高,其它程序没有这么做,但是时序图上可以看到有这一项
Delay_Time(SHT_DELAY);
Low_Shtdata(); //再把数据线拉低
Delay_Time(SHT_DELAY);
High_Shtsck(); //给一个正方波,先拉高SCK
Delay_Time(SHT_DELAY);
Low_Shtsck(); //再拉低SCK
Delay_Time(SHT_DELAY);
High_Shtdata(); //拉高DATA,释放数据线.//?两面都是输出,一个输出高,一个输出低怎么办
Delay_Time(SHT_DELAY);
}
/*发送一个NOACK*********************************/
void Sht_Send_No_Ack(void)
{
High_Shtdata(); //把数据线打高
Delay_Time(SHT_DELAY);
High_Shtsck(); //给一个正方波,先拉高SCK
Delay_Time(SHT_DELAY);
Low_Shtsck(); //再拉低SCK
Delay_Time(SHT_DELAY);
High_Shtdata(); //拉高DATA,释放数据线
Delay_Time(SHT_DELAY);
}
/*读ACK*****************************************/
u8 Sht_Read_Ack(void)
{
u8 temp;
High_Shtdata(); //置高SDA
Delay_Time(SHT_DELAY);
High_Shtsck(); //发送一个正脉冲,读SDA
Delay_Time(SHT_DELAY);
Set_Data_In();
temp=SHTDATA;
Low_Shtsck(); //把SDA和SCLK置低
Delay_Time(SHT_DELAY);
return(temp);
}
/*发送一个BYTE*********************************
由高位到低位发送*******************************/
void Sht_Send_Byte(u8 abyte)
{
s8 i;
for(i=7;i>=0;i--) //循环发送每一位
{
if(abyte&(0x01<<i))
{
High_Shtdata(); //如果被发送的位为高,置高DATA
}
else
{
Low_Shtdata(); //否则置低DATA
}
Delay_Time(SHT_DELAY);
High_Shtsck(); //发送一个正脉冲,该位被送出
Delay_Time(SHT_DELAY);
Low_Shtsck();
Delay_Time(SHT_DELAY);
}
}
/*读一个Byte************************************
由高位到低位接收********************************/
u8 Sht_Read_Byte(void)
{
u8 temp=0;
s8 i;
High_Shtdata(); //释放数据线
Set_Data_In();
for(i=8;i>0;i--) //循环接收每一位
{
temp<<=1; //把数据左移准备读下一次bit
Delay_Time(SHT_DELAY);
High_Shtsck(); //拉高SCK
Delay_Time(SHT_DELAY);
if(SHTDATA) //读取一个bit
{
temp|=0x01;
}
Low_Shtsck(); //拉低SCK
}
return temp;
}
/*读状态寄存器**********************************
返回值为状态值,-1代表错误***********************/
u8 Sht_Read_Status(void)
{
u8 temp;
Sht_Start(); //启动时序
Sht_Send_Byte(RD_STATUS_CMD); //读命令字
if(Sht_Read_Ack()) //读ACK
{
return -1;
}
temp=Sht_Read_Byte(); //读状态字
Sht_Send_Ack(); //发送一个ACK
Sht_Read_Byte(); //读CRC,暂时没用
Sht_Send_Ack(); //发送一个ACK
return temp;
}
/*写状态寄存器**********************************
返回值为0代表成功,-1代表错误********************/
u8 Sht_Write_Staus(u8 state)
{
Sht_Start(); //启动时序
Sht_Send_Byte(WR_STATUS_CMD); //写命令字
if(Sht_Read_Ack()) //读ACK
{
return -1;
}
Sht_Send_Byte(state); //写状态字
if(Sht_Read_Ack()) //读ACK
{
return -1;
}
return 0;
}
/*测量温湿度************************************
入口为T(温度)或RH(湿度)
返回值为测量值,-1代表错误***********************/
u16 Sht_Measure(u8 cmd)
{
u16 temp;
Sht_Start();
Sht_Send_Byte(cmd);
if(Sht_Read_Ack()) //读ACK
{
return -1;
}
Set_Data_In();
while(SHTDATA); //延时等待DATA变低
temp=Sht_Read_Byte(); //读高8位数据
Sht_Send_Ack(); //发送一个ACK
temp=(temp<<8)+Sht_Read_Byte(); //读低8位并合成一个16位数据
Sht_Send_Ack(); //发送一个ACK
Sht_Read_Byte(); //读CRC
Sht_Send_Ack(); //发送一个ACK
if(cmd==T)
{
temp=temp-3963; //14bit温度转换,其结果为实际温度*100
}
else if(cmd==RH)
{
//把湿度的测量值转换为实际值,呵呵,因为本项目没有用到,因此没有写,
} //不要拍砖啊^_^
return temp;
}
- 1
- 2
- 3
- 4
前往页