当前位置:   article > 正文

SGP-30传感器IIC读取数据(基于52单片机、IO口模拟IIC)_使用iic的传感器

使用iic的传感器

说明:

//SGP30的SCL引脚定义

sbit SCL = P1^6; 

//SGP30的SDA引脚定义
sbit SDA = P1^7;    

SGP-30.h:

  1. #ifndef __SGP30_H
  2. #define __SGP30_H
  3. #include "main.h"
  4. #define SGP30_read 0xb1 //SGP30的读地址
  5. #define SGP30_write 0xb0 //SGP30的写地址
  6. #define ACK 0 //应答信号
  7. #define NACK 1 //非应答信号
  8. sbit SCL = P1^6; //SGP30的SCL引脚定义
  9. sbit SDA = P1^7; //SGP30的SDA引脚定义
  10. //I2C起始信号
  11. void I2CStart(void);
  12. //I2C停止信号
  13. void I2CStop(void);
  14. //I2C写一个字节数据,返回ACK或者NACK
  15. u8 I2C_Write_Byte(u8 Write_Byte);
  16. //I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK
  17. u8 I2C_Read_Byte(u8 AckValue);
  18. //初始化SGP30
  19. void SGP30_Init(void);
  20. //向SGP30写数据
  21. void SGP30_Write(u8 a, u8 b);
  22. //从SGP30读数据
  23. u32 SGP30_Read(void);
  24. #endif

SGP-30.c:

  1. #include "SGP30.H"
  2. #include "delay.h"
  3. //模拟IIC用的短延时 us
  4. void I2C_Delay (u8 t)
  5. {
  6. while(t--);
  7. }
  8. //I2C起始信号
  9. void I2CStart(void)
  10. {
  11. SDA = 1; //发送起始条件的数据信号
  12. SCL = 1;
  13. I2C_Delay(50); //起始条件建立时间大于4.7us,延时
  14. SDA = 0; //发送起始信号
  15. I2C_Delay(50); //起始条件锁定时间大于4μs
  16. SCL = 0; //钳住I2C总线,准备发送或接收数据
  17. I2C_Delay(50);
  18. }
  19. //I2C停止信号
  20. void I2CStop(void)
  21. {
  22. SDA = 0; //发送结束条件的数据信号
  23. SCL = 0;
  24. I2C_Delay(50);
  25. SCL = 1; //发送结束条件的时钟信号
  26. I2C_Delay(50); //结束条件建立时间大于4μs
  27. SDA = 1; //发送I2C总线结束信号
  28. I2C_Delay(50);
  29. }
  30. //I2C写一个字节数据,返回ACK或者NACK
  31. u8 I2C_Write_Byte(u8 Write_Byte) //Sendbyte
  32. {
  33. u8 i;
  34. SCL=0;
  35. I2C_Delay(10);
  36. for(i=0; i<8; i++) //要传送的数据长度为8
  37. {
  38. if(Write_Byte&0x80) //判断发送位
  39. {
  40. SDA = 1;
  41. }
  42. else
  43. {
  44. SDA = 0;
  45. }
  46. I2C_Delay(5);
  47. SCL=1; //输出SDA稳定后,拉高SCL给出上升沿,从机检测到后进行数据采样
  48. I2C_Delay(5); //保证时钟高电平周期大于4μs
  49. SCL=0;
  50. I2C_Delay(5);
  51. Write_Byte <<= 1;
  52. }
  53. I2C_Delay(1);
  54. SDA = 1; //8位发送完后释放数据线,准备接收应答位-ZLG
  55. I2C_Delay(40);
  56. SCL = 1; //MCU告知SHT2X数据发送完毕,等待从机的应答信号
  57. I2C_Delay(40);
  58. /*以下是判断I2C总线接收应到应答信号是ACK还是NACK*/
  59. if(SDA==1) //SDA为高,收到NACK
  60. {
  61. I2C_Delay(40);
  62. SCL=0;
  63. return NACK;
  64. }
  65. else //SDA为低,收到ACK
  66. {
  67. I2C_Delay(40);
  68. SCL=0;
  69. return ACK;
  70. }
  71. }
  72. //I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK
  73. u8 I2C_Read_Byte(u8 AckValue)//receivebyte
  74. {
  75. u8 i,RDByte=0;
  76. SCL=0; //置时钟线为低,准备接收数据位
  77. I2C_Delay(40);
  78. SDA = 1; //释放总线,置数据线为输入方式
  79. for (i=0; i<8; i++)
  80. {
  81. SCL = 1; //SCL高电平期间,采集SDA信号,并作为有效数据 //置时钟线为高使数据线上数据有效
  82. I2C_Delay(20);
  83. RDByte <<= 1; //移位
  84. if(SDA==1) //采样获取数据
  85. {
  86. RDByte |= 0x01;
  87. }
  88. else
  89. {
  90. RDByte &= 0xfe;
  91. }
  92. I2C_Delay(10);
  93. SCL = 0; //下降沿,从机给出下一位值
  94. I2C_Delay(60);
  95. }
  96. /*以下是I2C总线发送应答信号ACK或者NACK*/
  97. SDA = AckValue; //应答状态
  98. I2C_Delay(30);
  99. SCL = 1;
  100. I2C_Delay(50); //时钟低电平周期大于4μs
  101. SCL = 0; //清时钟线,钳住I2C总线以便继续接收
  102. I2C_Delay(50);
  103. return RDByte;
  104. }
  105. //初始化IIC接口
  106. void SGP30_Init(void)
  107. {
  108. SCL = 1;
  109. I2C_Delay(50);
  110. SDA = 1;
  111. I2C_Delay(50);
  112. SGP30_Write(0x20,0x03);
  113. // SGP30_ad_write(0x20,0x61);
  114. // SGP30_ad_write(0x01,0x00);
  115. }
  116. void SGP30_Write(u8 a, u8 b)
  117. {
  118. I2CStart();
  119. I2C_Write_Byte(SGP30_write); //发送器件地址+写指令
  120. I2C_Write_Byte(a); //发送控制字节
  121. I2C_Write_Byte(b);
  122. I2CStop();
  123. delay_ms(20);
  124. }
  125. unsigned long SGP30_Read(void)
  126. {
  127. unsigned long dat;
  128. int crc;
  129. I2CStart();
  130. I2C_Write_Byte(SGP30_read); //发送器件地址+读指令
  131. dat = I2C_Read_Byte(ACK);
  132. dat <<= 8;
  133. dat += I2C_Read_Byte(ACK);
  134. crc = I2C_Read_Byte(ACK); //check数据,舍去
  135. crc = crc; //避免编译产生警告,这句可有可无
  136. dat <<= 8;
  137. dat += I2C_Read_Byte(ACK);
  138. dat <<= 8;
  139. dat += I2C_Read_Byte(NACK);
  140. I2CStop();
  141. delay_ms(20);
  142. return(dat);
  143. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/604083
推荐阅读
相关标签
  

闽ICP备14008679号