MAIN.C
#include "si7006.h"
#include "led.h"
#include "beep.h"
int main()
{
short tem;
unsigned short hum;
i2c_init();
beep_init();
all_led_init();
while(1)
{
tem = si7006_read_tem();
hum = si7006_read_hum();
tem = tem * 175.72 / 65536 - 46.85;
hum = hum * 125 / 65535 - 6;
if(tem > 27)
{
//蜂鸣器
beep_on();
//风扇
bee_on();
}
if(hum > 58)
{
LED1_ON();
}
else
{
LED1_OFF();
}
printf("tem = %d \n hum = %d\n", tem, hum);
delay(1000);
}
return 0;
}
SI7006.C
#include"si7006.h"
//封装延时函数
void delay(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++)
{}
}
}
void si7006_init()
{
//发起起始信号
i2c_start();
//发送从机地址+写标志
i2c_write_byte(0X80);
//等待从机应答
i2c_wait_ack();
//发送寄存器地址 0XE6
i2c_write_byte(0XE6);
//等待从机应答
i2c_wait_ack();
//传输要写入的数据0X3A、
i2c_write_byte(0X3A);
//等待从机应答
i2c_wait_ack();
//发送终止信号
i2c_stop();
}
short si7006_read_tem()
{
short tem;
char tem_h,tem_l;
//发起起始信号
i2c_start();
//发送从机地址+写标志
i2c_write_byte(0x80);
//等待从机应答
i2c_wait_ack();
//发送寄存器地址 0XE3
i2c_write_byte(0xe3);
//等待从机应答
i2c_wait_ack();
//重复起始信号
i2c_start();
//发送从机地址+读标志
i2c_write_byte(0x81);
//等待从机应答
i2c_wait_ack();
delay(100);//等待从机测量数据
//接收数据高八位
//发送应答信号
tem_h=i2c_read_byte(0);
//接收数据低八位
//发送非应答信号
tem_l=i2c_read_byte(1);
//将高八位和低八位合成一个数据 高八位<<8|低8位
tem=tem_h<<8|tem_l;
return tem;
}
unsigned short si7006_read_hum()
{
unsigned short hum;
unsigned char hum_h,hum_l;
//发起起始信号
i2c_start();
//发送从机地址+写标志
i2c_write_byte(0x80);
//等待从机应答
i2c_wait_ack();
//发送寄存器地址 0XE3
i2c_write_byte(0xe5);
//等待从机应答
i2c_wait_ack();
//重复起始信号
i2c_start();
//发送从机地址+读标志
i2c_write_byte(0x81);
//等待从机应答
i2c_wait_ack();
delay(100);//等待从机测量数据
//接收数据高八位
//发送应答信号
hum_h=i2c_read_byte(0);
//接收数据低八位
//发送非应答信号
hum_l=i2c_read_byte(1);
//将高八位和低八位合成一个数据 高八位<<8|低8位
hum=hum_h<<8|hum_l;
return hum;
}