/*
STC15L系列单片机
11.0592M晶振、3.3V
0612mos
*/
#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.000000000011us
{
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.072337962967us
{
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.000000000002us
{
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.072337962963us
{
unsigned char a,b;
for(b=89;b>0;b--)
for(a=247;a>0;a--);
}
void delay22ms(void) //误差 -0.036168981484us
{
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.010*********us
{
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();
ret