找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2408|回复: 1
收起左侧

stm32单片机的光照传感器程序源码

[复制链接]
ID:144296 发表于 2019-4-15 11:01 | 显示全部楼层 |阅读模式
  1. #include "bh1750.h"


  2. #define  SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  3. unsigned char  BUF[4];  //接收数据缓存区


  4. /***************************************************************
  5. ** 功能:     IIC端口初始化
  6. ** 参数:   无参数
  7. ** 返回值:    无
  8. ****************************************************************/
  9. void BH1750IO_Init(void)
  10. {         
  11.     GPIO_InitTypeDef  GPIO_InitStructure;
  12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  13.    GPIO_InitStructure.GPIO_Pin = ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin;//PB6/PB7/PB5
  14.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  15.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  16.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根据设定参数初始化
  17.     GPIO_SetBits(GQ_GPIOx,ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin); //输出高
  18. }
  19. void In_mode(void)//SDA配置输入模式
  20. {
  21.      GPIO_InitTypeDef  GPIO_InitStructure;
  22.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  23.    GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
  24.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
  25.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  26.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根据设定参数初始化
  27. }
  28. void Out_mode(void)//SDA配置输出模式
  29. {
  30.      GPIO_InitTypeDef  GPIO_InitStructure;
  31.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  32.    GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
  33.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  34.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  35.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根据设定参数初始化
  36.    
  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. }
复制代码
回复

使用道具 举报

ID:1 发表于 2019-4-15 13:50 | 显示全部楼层
本帖需要重新编辑补全头文件 电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表