bh1750.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "bh1750.h"
  2. //#include "slave.h"
  3. #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
  4. unsigned char BH_BUF[4]; //接收数据缓存区
  5. /***************************************************************
  6. ** 功能: IIC端口初始化
  7. ** 参数: 无参数
  8. ** 返回值: 无
  9. ****************************************************************/
  10. void BH1750IO_Init(void)
  11. {
  12. GPIO_InitTypeDef GPIO_InitStructure;
  13. RCC_APB2PeriphClockCmd(BH1750_SDA_RCC|BH1750_SCL_RCC,ENABLE);
  14. GPIO_InitStructure.GPIO_Pin = BH1750_SCL_GPIO_PIN;//PB6/PB7/PB5
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  17. GPIO_Init(BH1750_SCL_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化
  18. GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;//PB6/PB7/PB5
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  21. GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化
  22. GPIO_SetBits(BH1750_SDA_GPIO_TYPE,BH1750_SDA_GPIO_PIN); //输出高
  23. GPIO_SetBits(BH1750_SCL_GPIO_TYPE,BH1750_SCL_GPIO_PIN); //输出高
  24. }
  25. void bh1750_sdain_mode(void)//SDA配置输入模式
  26. {
  27. GPIO_InitTypeDef GPIO_InitStructure;
  28. RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE);
  29. GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;
  30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
  31. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  32. GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化
  33. }
  34. void bh1750_sdaout_mode(void)//SDA配置输出模式
  35. {
  36. GPIO_InitTypeDef GPIO_InitStructure;
  37. RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE);
  38. GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;
  39. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  40. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  41. GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化
  42. }
  43. /***************************************************************
  44. ** 功能: 产生IIC起始信号
  45. ** 参数: 无参数
  46. ** 返回值: 无
  47. ****************************************************************/
  48. void BH1750_Start()
  49. {
  50. SDA_OUT(); //sda线输出
  51. SETSDA;
  52. SETSCL;
  53. delay_us(4);
  54. CLRSDA;//START:when CLK is high,DATA change form high to low
  55. delay_us(4);
  56. CLRSCL;//钳住I2C总线,准备发送或接收数据
  57. }
  58. /***************************************************************
  59. ** 功能: 产生IIC停止信号
  60. ** 参数: 无参数
  61. ** 返回值: 无
  62. ****************************************************************/
  63. void BH1750_Stop()
  64. {
  65. SDA_OUT();//sda线输出
  66. CLRSDA;//STOP:when CLK is high DATA change form low to high
  67. SETSCL;
  68. delay_us(4);
  69. SETSDA;//发送I2C总线结束信号
  70. delay_us(4);
  71. }
  72. /***************************************************************
  73. ** 功能: 产生IIC应答信号
  74. ** 参数: 无参数
  75. ** 返回值: 无
  76. ****************************************************************/
  77. void BH1750_SendACK(unsigned char ack)
  78. {
  79. SDA_OUT(); //sda线输出
  80. if(ack)
  81. {
  82. SETSDA; //写应答信号
  83. }
  84. else
  85. {
  86. CLRSDA;
  87. }
  88. SETSCL; //拉高时钟线
  89. delay_us(2); //延时
  90. CLRSCL; //拉低时钟线
  91. delay_us(2); //延时
  92. }
  93. /***************************************************************
  94. ** 功能: 产生IIC接收信号
  95. ** 参数: 无参数
  96. ** 返回值: 无
  97. ****************************************************************/
  98. unsigned char BH1750_RecvACK()
  99. {
  100. unsigned char data;
  101. SDA_IN(); //SDA设置为输入
  102. SETSCL; //拉高时钟线
  103. delay_us(2); //延时
  104. data = READ_SDA; //读应答信号
  105. CLRSCL; //拉低时钟线
  106. delay_us(2); //延时
  107. return data;
  108. }
  109. /***************************************************************
  110. ** 功能: 向IIC总线发送一个字节数据
  111. ** 参数: dat:一字节数据
  112. ** 返回值: 无
  113. ****************************************************************/
  114. void BH1750_SendByte(unsigned char dat)
  115. {
  116. unsigned char i,bit;
  117. SDA_OUT(); //sda线输出
  118. for (i=0; i<8; i++) //8位计数器
  119. {
  120. bit=dat&0x80;
  121. if(bit)
  122. {
  123. SETSDA;
  124. }
  125. else
  126. CLRSDA;
  127. dat <<= 1; //移出数据的最高位
  128. SETSCL; //拉高时钟线
  129. delay_us(2); //延时
  130. CLRSCL; //拉低时钟线
  131. delay_us(2); //延时
  132. }
  133. BH1750_RecvACK();
  134. }
  135. /***************************************************************
  136. ** 功能: 从IIC总线接收一个字节数据
  137. ** 参数: 无参数
  138. ** 返回值: dat:接收一字节数据
  139. ****************************************************************/
  140. unsigned char BH1750_RecvByte()
  141. {
  142. unsigned char i;
  143. unsigned char dat = 0;
  144. unsigned char a;
  145. SDA_IN(); //SDA设置为输入
  146. SETSDA; //使能内部上拉,准备读取数据,
  147. for(i=0; i<8; i++) //8位计数器
  148. {
  149. dat <<= 1;
  150. SETSCL; //拉高时钟线
  151. delay_us(2); //延时
  152. a=READ_SDA;//读SDA数据
  153. if(a==1)dat+=1;
  154. CLRSCL; //拉低时钟线
  155. delay_us(2); //延时
  156. }
  157. return dat;
  158. }
  159. /***************************************************************
  160. ** 功能: 向bh1750写入命令
  161. ** 参数: 无参数
  162. ** 返回值: 无
  163. ****************************************************************/
  164. void Single_Write_BH1750( unsigned char REG_Address)
  165. {
  166. BH1750_Start(); //起始信号
  167. BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
  168. BH1750_SendByte(REG_Address); //内部寄存器地址,
  169. BH1750_Stop(); //发送停止信号
  170. }
  171. /***************************************************************
  172. ** 功能: 连续读出BH1750内部数据
  173. ** 参数: 无参数
  174. ** 返回值: 无
  175. ****************************************************************/
  176. void Multiple_Read_BH1750(void)
  177. {
  178. unsigned char i;
  179. BH1750_Start(); //起始信号
  180. BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
  181. for(i=0; i<3; i++) //连续读取2个地址数据,存储中BH_BUF
  182. {
  183. BH_BUF[i] = BH1750_RecvByte(); //BH_BUF[0]存储0x32地址中的数据
  184. if(i == 3)
  185. {
  186. BH1750_SendACK(1); //最后一个数据需要回NOACK
  187. }
  188. else
  189. {
  190. BH1750_SendACK(0); //回应ACK
  191. }
  192. }
  193. BH1750_Stop(); //停止信号
  194. // delay_ms(150);
  195. }
  196. /***************************************************************
  197. ** 功能: 初始化BH1750
  198. ** 参数: 无参数
  199. ** 返回值: 无
  200. ****************************************************************/
  201. void BH1750_Init()
  202. {
  203. BH1750IO_Init();
  204. Single_Write_BH1750(0x01);
  205. //CLRADDR; //将ADDR位初始化拉低
  206. }
  207. /***************************************************************
  208. ** 功能: 读取光照度
  209. ** 参数: 无参数
  210. ** 返回值: data:返回光照度值
  211. ****************************************************************/
  212. unsigned int Dispose(void)
  213. {
  214. static float temp_a;
  215. unsigned int data_a;
  216. int dis_data1 ;
  217. Single_Write_BH1750(0x01); // power on
  218. Single_Write_BH1750(0x10); // H- resolution mode
  219. delay_ms(200); //延时200ms
  220. Multiple_Read_BH1750(); //连续读出数据,存储在BH_BUF中
  221. delay_ms(150);
  222. dis_data1=BH_BUF[0];
  223. dis_data1=(dis_data1<<8)+BH_BUF[1];//合成数据,即光照数据
  224. temp_a=(float)dis_data1/1.2;
  225. data_a=(int)temp_a;
  226. return data_a;
  227. }