头文件 iic.h  si7006.h

#ifndef __IIC_H__
#define __IIC_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
/*I2C1_SCL ---> PF14I2C1_SDA ---> PF15*/
//发送数据模式
#define SET_SDA_OUT     do{GPIOF->MODER &= (~(0x3<<30)); \GPIOF->MODER |= (0x1<<30);}while(0)
//接收数据模式
#define SET_SDA_IN      do{GPIOF->MODER &= (~(0x3<<30));}while(0)
//拉高拉低时钟线
#define SCL_H       do{GPIOF->BSRR |= (0x1<<14);}while(0)
#define SCL_L       do{GPIOF->BRR  |= (0x1<<14);}while(0)
//拉高拉低数据线
#define SDA_H       do{GPIOF->BSRR |= (0x1<<15);}while(0)
#define SDA_L       do{GPIOF->BRR  |= (0x1<<15);}while(0)
//读取当前数据线上的值
#define SDA_READ    (GPIOF->IDR & (0x1<<15))
//延时函数
void delay_us();
//IIC初始化
void iic_init();
//起始信号
void iic_start();
//结束信号
void iic_stop();
//发送一个字节
void iic_write_byte(char  data);
//接收一个字节
char iic_read_byte(char ack);
//等待应答信号
char iic_wait_ack();
//应答信号
void iic_ack();
//非应答信号
void iic_nack();#endif 
#ifndef __SI7006_H__
#define __SI7006_H__
#include "iic.h"//si7006初始化
void si7006_init();
//获取数据
short si7006_read_data(char slave_addr, char register_addr);#endif

功能函数 iic.c  si7006.c

#include "iic.h"//延时函数
void delay_us()
{int i = 2000;while (i--);
}
//IIC初始化
void iic_init()
{/*********RCC使能GPIOF组时钟*********/RCC->MP_AHB4ENSETR |= (0x1<<5); /**********GPIO章节配置*************///1.模式设置为输出模式  MODER[31:28]=0101GPIOF->MODER &= (~(0xf<<28));GPIOF->MODER |= (0x5<<28);//2.输出类型设置为推挽输出  OTYPER[15:14]=00GPIOF->OTYPER &= (~(0x3<<14));//3.输出速度设置为非常高速  OSPEEDR[31:28]=1111GPIOF->OSPEEDR |= (0xf<<28);//4.禁止上拉和下拉电阻  PUPDR[31:28]=0000GPIOF->PUPDR &= (~(0xf<<28));/***********IIC设置为空闲态*********/SCL_H;  //时钟线拉高SDA_H;  //数据线拉高
}
//起始信号
void iic_start()
{SET_SDA_OUT;//发送数据模式SCL_H;         //SCL拉高SDA_H;   //SDA拉高delay_us();SDA_L;        //SDA拉低delay_us();SCL_L;    //SCL拉低,保持占用状态
}
//停止信号
void iic_stop()
{SET_SDA_OUT;//设置SDA为输出SCL_L;      //SCL拉低delay_us();SDA_L;      //SDA拉低delay_us();SCL_H;      //SCL拉高delay_us();SDA_H;      //SDA拉高delay_us();
}
//发送一个字节
void iic_write_byte( char data)
{SET_SDA_OUT;   //发送数据模式int i;for (i = 0 ; i < 8; i++) {SCL_L;     //SCL拉低delay_us();if (data & 0x80)//判断最高位的值{SDA_H; //写入高电平}else{SDA_L; //写入低电平}delay_us();SCL_H;     //SCL拉高delay_us();delay_us();  data <<= 1; //左移1位}
}
//接收一个字节
char iic_read_byte( char ack)
{unsigned char data;unsigned int i;SET_SDA_IN;   //设置SDA为输入for (i = 0; i < 8; i++) {SCL_L;   //SCL拉低delay_us();delay_us();  //保证数据写完SCL_H;   //SCL拉高delay_us();data <<= 1;if (SDA_READ) data |= 1;//读到1else data |= 0;//读到0delay_us();}if (!ack) iic_ack();   //发送应答信号else iic_nack();  //发送非应答信号return data;
}
//等待应答信号char iic_wait_ack()
{int ack;SCL_L;   //SCL拉低delay_us();SDA_H;   //SDA拉高, 释放总线SET_SDA_IN; delay_us();SCL_H;delay_us();  if (SDA_READ) {ack = 1;  //非应答信号}else {ack = 0;  //应答信号}delay_us();SCL_L;return ack;
}
//应答信号
void iic_ack()
{SET_SDA_OUT;   //发送数据模式SCL_L;     //SCL拉低delay_us();SDA_L;     //SDA拉低,应答信号delay_us();   SCL_H;     //SCL拉高delay_us();delay_us();    //等待从机接收应答信号SCL_L;     //SCL拉低
}
void iic_nack()
{SET_SDA_OUT;   //发送数据模式SCL_L;     //SCL拉低delay_us();SDA_H;     //SDA拉高,非应答信号delay_us();   SCL_H;     //SCL拉高delay_us();delay_us();    //等待从机接收应答信号SCL_L;     //SCL拉低
}
#include "iic.h"
#include "si7006.h"
extern void delay_ms(unsigned int ms);
//SI7006初始化
void si7006_init()
{//IIC初始化iic_init();//起始信号iic_start();//发送从机地址iic_write_byte(0x40<<1);iic_wait_ack();//发送寄存器地址iic_write_byte(0xe6);iic_wait_ack();//发送初始值iic_write_byte(0x3a);iic_wait_ack();//结束信号iic_stop();
}
//获取数据short si7006_read_data(char slave_addr, char register_addr)
{//接收的数据short data;//接收高8位,低8位char data_h, data_l;//起始信号iic_start();//发送从机地址+wiic_write_byte(slave_addr << 1);iic_wait_ack();//发送寄存器地址iic_write_byte(register_addr);iic_wait_ack();iic_start();//发送从机地址+riic_write_byte((slave_addr << 1) | 0x1);iic_wait_ack();delay_ms(100);  // 等待转换结束之后在读取测量的结果data_h = iic_read_byte(0);//高8位data_l = iic_read_byte(1);//低8位//结束信号iic_stop();data = data_h;data <<= 8;data |= data_l;return data;
}

主函数  main.c

#include "iic.h"
#include "si7006.h"
extern void printf(const char *fmt, ...);
void delay_ms(unsigned int ms)
{int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 1800; j++);
}int main()
{short hum;short temp;si7006_init();while (1){hum = si7006_read_data(0x40, 0xe5);temp = si7006_read_data(0x40, 0xe3);printf("temp = %d\thum = %d\n", temp*176/65536-47,hum*125/65536-6);delay_ms(1000);}return 0;
}

测试结果:

IIC实验(测温度湿度)相关推荐

  1. 未来计算机将具有图像识别 定理证明,[单选] 低温计与高温计所测温度的分界线为()。...

    [单选] 低温计与高温计所测温度的分界线为(). 更多相关问题 [单选题]向一个栈顶指针为 HS 链式栈中插入一个 s 所指结点时,则执行( ). A. HS à next =s : B. s à n ...

  2. 10.5国庆作业(IIC实验)

    文章目录 作业内容 思路分析 IIC硬件电路图 IIC时序 IIC协议 代码实现 iic.c main.c 测试结果 作业内容 完成IIC实验:实现扩展板上空气温湿度传感器对空气温度与湿度的测量 思路 ...

  3. 基于FPGA的IIC读取LM74A温度值

    基于FPGA的IIC读取LM74A温度值 IIC总线概述 采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易.常用的串行扩展总线有: I2C (I ...

  4. STM32 Proteus仿真GP2Y101红外测距温度湿度DHT11内部RTC-0010

    STM32 Proteus仿真GP2Y101红外测距温度湿度DHT11内部RTC-0010 Proteus仿真小实验: STM32 Proteus仿真GP2Y101红外测距温度湿度DHT11内部RTC ...

  5. 基于正点原子STM32F103精英板IIC实验的MS5611气压计的使用

    MS5611是一款气压计,能够提供高精度的气压值与温度值,这次做项目正好需要用到这款传感器,包括之前也没好好学习用过IIC,所以写下博客记录一下. 如果有需要使用的朋友可以去https://downl ...

  6. 基于STM32单片机甲醛二氧化碳温度湿度采集系统

    实践制作DIY- GC008-甲醛二氧化碳温度湿度采集系统 一.功能说明: 基于STM32单片机设计-甲醛二氧化碳温度湿度采集系统 功能介绍: 1.基于STM32F103C系列,甲醛二氧化碳传感器,O ...

  7. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出

    文章目录 前言 一.I2C总线通信协议 1.I2C总线 2.工作原理 3.I2C特点 4.I2C模式选择 5.软件I2C和硬件I2C 二.串口输出温湿度传感器的数据 1.核心代码分析 2.硬件实操连接 ...

  8. c语言ntc程序,NTC热敏电阻测温度 单片机C和汇编源程序

    /*---------------------------------------------------------------------*/ /* --- STC MCU Internation ...

  9. Arduino与Proteus仿真实例-SHT7x温度湿度传感器驱动仿真

    SHT7x温度湿度传感器驱动仿真 1.SHT7x介绍 SHT7x传感器通过独特的电容传感器元件用于测量相对湿度,而温度则由带隙传感器测量.传感器以紧凑的形式集成传感器元件和信号处理,并提供完全校准的数 ...

最新文章

  1. ubuntu安装chrome浏览器
  2. css IE下执行的样式,其他浏览器忽略
  3. LeetCode Construct Binary Tree from Preorder and Inorder Traversal(构造二叉树)
  4. Java集合源码学习(五)几种常用集合类的比较
  5. 什么是内存(二):虚拟内存
  6. 记-纯前端excle下载
  7. Kubernetes集群(概念篇)
  8. DB2 错误代码 命令大全
  9. 应用容器Application container
  10. 趣文:如果像招聘程序员那样招聘木匠
  11. HTML网页设计结课作业~仿小米商城网站纯HTML模板源码(HTML+CSS)
  12. C/C++整数除法以及保留小数位的问题
  13. python快乐数字怎么表达_Python中的快乐数字
  14. linux lzma c语言接口,编译squashfs和lzma
  15. 正则匹配里面的(.*?)
  16. 70句计算机英语,70句成人英语日常口语大全
  17. git fork 远端仓库协作开发
  18. Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文笔记
  19. 草根大牛论道“下一代软件研发” 开启软件转型讨论大潮
  20. 野百合的春天 ——布鲁斯鲍文

热门文章

  1. wav怎么转mp3?请看详细步骤
  2. 小米6卸载html,小米手机驱动程序如何删除(附驱动程序卸载的步骤)
  3. 题目: 某学校需要一个能给学领前儿童自动出三个数加减法的算术题的程序,要求在运算过程中只能使用20以内的加减法且不能出现负数,并且未知数可以在等式的任何一位, 如 3 + 4 – 2 = ( ), 8
  4. python模拟手写_Python实现简单可学习的手写体识别
  5. 毕业论文怎么写 || 应届毕业生的经验分享
  6. 前端性能优化-服务端和网络优化-极客时间
  7. 《统计学习方法》第一章总结
  8. 使用server酱进行服务器端口异常报警
  9. 霍尼韦尔和剑桥量子,强强联手!
  10. CPLEX求解混合整数规划模型