只是个人的记录贴,写了玩的,还在写,才读出IIC结果,还没写数据处理和周期获取什么的,代码由郭天祥IIC代码改编,醉了,网页端知乎上传图片花式不成功。
#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
#define uchar unsigned char
sbit sda=P2^0;//数据线
sbit scl=P2^1;//时钟线
void delay() {; ;}
void Delay(unsigned int t);
//函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
void start()//开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()//应答
{
uchar i;
scl=1;
while((sda==1)&&(i<250)) i++;
scl=0;
delay();
}
void init()//IIC初始化
{
sda=1;
scl=1;
}
void write_byte(uchar date)//写入
{
uchar i, temp;
temp=date;
scl=0;
delay();
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();
}
// sda=1;
delay();
}
void IIC_Ack()//给SHT31发送应答信号
{
scl=0;
delay();
sda=0;
delay();
scl=1;
delay();
scl=0;
delay();
sda=1;
}
uchar read_byte()//读取数据
{
uchar i,j,k;
for(i=0;i<8;i++)
{
scl=0;
delay();
scl=1;
delay();
j=sda;
k=(k<<1)|j;
delay();
}
IIC_Ack();//发送应答信号
return k;
}
void main (void)
{
init(); //初始化
start();//开始信号
write_byte(0x88);//器件地址,查手册可得默认0x44,取7位地址+读写位得0x88
respons();//应答
write_byte(0x2C);//写入命令,这里写入的是单次测量命令2C06
respons();
write_byte(0x06);
respons();
stop();//停止信号
Delay(50000);//随便延迟了一会给测量时间
Delay(50000);
start();//开始信号
write_byte(0x89);//设置读取,即0x88最后一位读写位改为读
respons();//应答
read_byte();//读取温度高八位
read_byte();//读取温度低八位
read_byte();//CRC
read_byte();//湿度高八位
read_byte();//湿度低八位
read_byte();//CRC
stop();
while (1) //主循环
{
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}