bh1750.c 7.4 KB

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