BH1750.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #include <REG52.h>
  2. //#include <math.h> //Keil library
  3. #include <BH1750.h> //Keil library
  4. #include <INTRINS.H>
  5. #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
  6. //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  7. typedef unsigned char BYTE;
  8. typedef unsigned short WORD;
  9. BYTE BUF[8]; //接收数据缓存区
  10. // uchar ge,shi,bai,qian,wan; //显示变量
  11. //int dis_data; //变量
  12. void IICdelay_xms(unsigned int k);
  13. void Init_BH1750(void);
  14. void Single_Write_BH1750(uchar REG_Address); //单个写入数据
  15. uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
  16. void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
  17. void Delay5us();
  18. void Delay5ms();
  19. void BH1750_Start(); //起始信号
  20. void BH1750_Stop(); //停止信号
  21. void BH1750_SendACK(bit ack); //应答ACK
  22. bit BH1750_RecvACK(); //读ack
  23. void BH1750_SendByte(BYTE dat); //IIC单个字节写
  24. BYTE BH1750_RecvByte(); //IIC单个字节读
  25. //----------------------------------
  26. //毫秒延时**************************
  27. void IICdelay_xms(unsigned int k)
  28. {
  29. unsigned int i,j;
  30. for(i=0;i<k;i++)
  31. {
  32. for(j=0;j<121;j++)
  33. {;}
  34. }
  35. }
  36. /**************************************
  37. 1Tmode
  38. **************************************/
  39. void Delay5us() //@11.0592MHz
  40. {
  41. unsigned char i;
  42. _nop_();
  43. i = 11;
  44. while (--i);
  45. }
  46. void Delay5ms() //@11.0592MHz
  47. {
  48. unsigned char i, j;
  49. i = 54;
  50. j = 199;
  51. do
  52. {
  53. while (--j);
  54. } while (--i);
  55. }
  56. /**************************************
  57. 起始信号
  58. **************************************/
  59. void BH1750_Start()
  60. {
  61. SDA_BH1750 = 1; //拉高数据线
  62. SCL_BH1750 = 1; //拉高时钟线
  63. Delay5us(); //延时
  64. SDA_BH1750 = 0; //产生下降沿
  65. Delay5us(); //延时
  66. SCL_BH1750 = 0; //拉低时钟线
  67. }
  68. /**************************************
  69. 停止信号
  70. **************************************/
  71. void BH1750_Stop()
  72. {
  73. SDA_BH1750 = 0; //拉低数据线
  74. SCL_BH1750 = 1; //拉高时钟线
  75. Delay5us(); //延时
  76. SDA_BH1750 = 1; //产生上升沿
  77. Delay5us(); //延时
  78. }
  79. /**************************************
  80. 发送应答信号
  81. 入口参数:ack (0:ACK 1:NAK)
  82. **************************************/
  83. void BH1750_SendACK(bit ack)
  84. {
  85. SDA_BH1750 = ack; //写应答信号
  86. SCL_BH1750 = 1; //拉高时钟线
  87. Delay5us(); //延时
  88. SCL_BH1750 = 0; //拉低时钟线
  89. Delay5us(); //延时
  90. }
  91. /**************************************
  92. 接收应答信号
  93. **************************************/
  94. bit BH1750_RecvACK()
  95. {
  96. SCL_BH1750 = 1; //拉高时钟线
  97. Delay5us(); //延时
  98. CY = SDA_BH1750; //读应答信号
  99. SCL_BH1750 = 0; //拉低时钟线
  100. Delay5us(); //延时
  101. return CY;
  102. }
  103. /**************************************
  104. 向IIC总线发送一个字节数据
  105. **************************************/
  106. void BH1750_SendByte(BYTE dat)
  107. {
  108. BYTE i;
  109. for (i=0; i<8; i++) //8位计数器
  110. {
  111. dat <<= 1; //移出数据的最高位
  112. SDA_BH1750 = CY; //送数据口
  113. SCL_BH1750 = 1; //拉高时钟线
  114. Delay5us(); //延时
  115. SCL_BH1750 = 0; //拉低时钟线
  116. Delay5us(); //延时
  117. }
  118. BH1750_RecvACK();
  119. }
  120. /**************************************
  121. 从IIC总线接收一个字节数据
  122. **************************************/
  123. BYTE BH1750_RecvByte()
  124. {
  125. BYTE i;
  126. BYTE dat = 0;
  127. SDA_BH1750 = 1; //使能内部上拉,准备读取数据,
  128. for (i=0; i<8; i++) //8位计数器
  129. {
  130. dat <<= 1;
  131. SCL_BH1750 = 1; //拉高时钟线
  132. Delay5us(); //延时
  133. dat |= SDA_BH1750; //读数据
  134. SCL_BH1750 = 0; //拉低时钟线
  135. Delay5us(); //延时
  136. }
  137. return dat;
  138. }
  139. //*********************************
  140. void Single_Write_BH1750(uchar REG_Address)
  141. {
  142. BH1750_Start(); //起始信号
  143. BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
  144. BH1750_SendByte(REG_Address); //内部寄存器地址,
  145. // BH1750_SendByte(REG_data); //内部寄存器数据,
  146. BH1750_Stop(); //发送停止信号
  147. }
  148. //********单字节读取*****************************************
  149. /*
  150. uchar Single_Read_BH1750(uchar REG_Address)
  151. { uchar REG_data;
  152. BH1750_Start(); //起始信号
  153. BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
  154. BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始
  155. BH1750_Start(); //起始信号
  156. BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
  157. REG_data=BH1750_RecvByte(); //读出寄存器数据
  158. BH1750_SendACK(1);
  159. BH1750_Stop(); //停止信号
  160. return REG_data;
  161. }
  162. */
  163. //*********************************************************
  164. //
  165. //连续读出BH1750内部数据
  166. //
  167. //*********************************************************
  168. void Multiple_read_BH1750(void)
  169. {
  170. uchar i;
  171. BH1750_Start(); //起始信号
  172. BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
  173. EA=0;
  174. for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
  175. {
  176. BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
  177. if (i == 3)
  178. {
  179. BH1750_SendACK(1); //最后一个数据需要回NOACK
  180. }
  181. else
  182. {
  183. BH1750_SendACK(0); //回应ACK
  184. }
  185. }
  186. EA=1;
  187. BH1750_Stop(); //停止信号
  188. Delay5ms();
  189. }
  190. //初始化BH1750,根据需要请参考pdf进行修改****
  191. void Init_BH1750()
  192. {
  193. Single_Write_BH1750(0x01);
  194. }
  195. unsigned int BH1750_temp(void)
  196. {
  197. unsigned int dis_data; //变量
  198. Init_BH1750(); //初始化BH1750
  199. Single_Write_BH1750(0x01); // power on
  200. Single_Write_BH1750(0x10); // H- resolution mode
  201. IICdelay_xms(200); //延时180ms
  202. Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
  203. dis_data=BUF[0];
  204. dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
  205. return dis_data;
  206. }