bh1750.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "bh1750.h"
  2. #include "public.h"
  3. #define bh1750_SlaveAddress 0x46
  4. unsigned char bh1750_buffer[4]={0};
  5. //void system_delay_us(unsigned int n);
  6. //void system_delay_ms(int x);
  7. /***************************************************************
  8. ** 功能: IIC端口初始化
  9. ** 参数: 无参数
  10. ** 返回值: 无
  11. ****************************************************************/
  12. void BH1750IO_Init(void)
  13. {
  14. BH1750_SCL_PIN_OUT();
  15. BH1750_SDA_PIN_OUT();
  16. }
  17. /***************************************************************
  18. ** 功能: 产生IIC起始信号
  19. ** 参数: 无参数
  20. ** 返回值: 无
  21. ****************************************************************/
  22. void BH1750_Start(void)
  23. {
  24. BH1750_SDA_PIN_OUT(); //sda线输出
  25. SETSDA;
  26. SETSCL;
  27. system_delay_us(4);
  28. CLRSDA;//START:when CLK is high,DATA change form high to low
  29. system_delay_us(4);
  30. CLRSCL;//钳住I2C总线,准备发送或接收数据
  31. }
  32. /***************************************************************
  33. ** 功能: 产生IIC停止信号
  34. ** 参数: 无参数
  35. ** 返回值: 无
  36. ****************************************************************/
  37. void BH1750_Stop(void)
  38. {
  39. BH1750_SDA_PIN_OUT();///sda线输出
  40. CLRSDA;//STOP:when CLK is high DATA change form low to high
  41. SETSCL;
  42. system_delay_us(4);
  43. SETSDA;//发送I2C总线结束信号
  44. system_delay_us(4);
  45. }
  46. /***************************************************************
  47. ** 功能: 产生IIC应答信号
  48. ** 参数: 无参数
  49. ** 返回值: 无
  50. ****************************************************************/
  51. void BH1750_SendACK(unsigned char ack)
  52. {
  53. BH1750_SDA_PIN_OUT(); //sda线输出
  54. if(ack)
  55. {
  56. SETSDA; //写应答信号
  57. }
  58. else
  59. {
  60. CLRSDA;
  61. }
  62. SETSCL; //拉高时钟线
  63. system_delay_us(2); //延时
  64. CLRSCL; //拉低时钟线
  65. system_delay_us(2); //延时
  66. }
  67. /***************************************************************
  68. ** 功能: 产生IIC接收信号
  69. ** 参数: 无参数
  70. ** 返回值: 无
  71. ****************************************************************/
  72. unsigned char BH1750_RecvACK(void)
  73. {
  74. unsigned char data;
  75. BH1750_SDA_PIN_IN(); //SDA设置为输入
  76. SETSCL; //拉高时钟线
  77. system_delay_us(2); //延时
  78. data = READ_SDA; //读应答信号
  79. CLRSCL; //拉低时钟线
  80. system_delay_us(2); //延时
  81. return data;
  82. }
  83. /***************************************************************
  84. ** 功能: 向IIC总线发送一个字节数据
  85. ** 参数: dat:一字节数据
  86. ** 返回值: 无
  87. ****************************************************************/
  88. void BH1750_SendByte(unsigned char dat)
  89. {
  90. unsigned char i,bit;
  91. BH1750_SDA_PIN_OUT();
  92. for (i=0; i<8; i++)
  93. {
  94. bit=dat&0x80;
  95. if(bit)
  96. {
  97. SETSDA;
  98. }
  99. else
  100. CLRSDA;
  101. dat <<= 1;
  102. SETSCL;
  103. system_delay_us(2);
  104. CLRSCL;
  105. system_delay_us(2);
  106. }
  107. BH1750_RecvACK();
  108. }
  109. /***************************************************************
  110. ** 功能: 从IIC总线接收一个字节数据
  111. ** 参数: 无参数
  112. ** 返回值: dat:接收一字节数据
  113. ****************************************************************/
  114. unsigned char BH1750_RecvByte(void)
  115. {
  116. unsigned char i;
  117. unsigned char dat = 0;
  118. unsigned char a;
  119. BH1750_SDA_PIN_IN(); //SDA设置为输入
  120. SETSDA;
  121. for(i=0; i<8; i++)
  122. {
  123. dat <<= 1;
  124. SETSCL;
  125. system_delay_us(2);
  126. a=READ_SDA;
  127. if(a==1)dat+=1;
  128. CLRSCL;
  129. system_delay_us(2);
  130. }
  131. return dat;
  132. }
  133. /***************************************************************
  134. ** 功能: 向bh1750写入命令
  135. ** 参数: 无参数
  136. ** 返回值: 无
  137. ****************************************************************/
  138. void Single_Write_BH1750( unsigned char REG_Address)
  139. {
  140. BH1750_Start(); //起始信号
  141. BH1750_SendByte(bh1750_SlaveAddress); //发送设备地址+写信号
  142. BH1750_SendByte(REG_Address); //内部寄存器地址,
  143. BH1750_Stop(); //发送停止信号
  144. }
  145. /***************************************************************
  146. ** 功能: 连续读出BH1750内部数据
  147. ** 参数: 无参数
  148. ** 返回值: 无
  149. ****************************************************************/
  150. void Multiple_Read_BH1750(void)
  151. {
  152. unsigned char i;
  153. BH1750_Start(); //起始信号
  154. BH1750_SendByte(bh1750_SlaveAddress+1); //发送设备地址+读信号
  155. for(i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
  156. {
  157. bh1750_buffer[i] = BH1750_RecvByte(); //bh1750_buffer[0]存储0x32地址中的数据
  158. if(i == 3)
  159. {
  160. BH1750_SendACK(1); //最后一个数据需要回NOACK
  161. }
  162. else
  163. {
  164. BH1750_SendACK(0); //回应ACK
  165. }
  166. }
  167. BH1750_Stop(); //停止信号
  168. }
  169. /***************************************************************
  170. ** 功能: 初始化BH1750
  171. ** 参数: 无参数
  172. ** 返回值: 无
  173. ****************************************************************/
  174. void BH1750_Init()
  175. {
  176. BH1750IO_Init();
  177. Single_Write_BH1750(0x01);
  178. //CLRADDR; //将ADDR位初始化拉低
  179. }
  180. /***************************************************************
  181. ** 功能: 读取光照度
  182. ** 参数: 无参数
  183. ** 返回值: data:返回光照度值
  184. ****************************************************************/
  185. unsigned int get_bh1750_value(void)
  186. {
  187. static float temp_a;
  188. unsigned int data_a;
  189. int dis_data1 ;
  190. Single_Write_BH1750(0x01); // power on
  191. Single_Write_BH1750(0x10); // H- resolution mode
  192. system_delay_ms(200); //延时200ms
  193. Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
  194. system_delay_ms(150);
  195. dis_data1=bh1750_buffer[0];
  196. dis_data1=(dis_data1<<8)+bh1750_buffer[1];//合成数据,即光照数据
  197. temp_a=(float)dis_data1/1.2;
  198. data_a=(int)temp_a;
  199. return data_a;
  200. }