找回密码
 注册

QQ登录

只需一步,快速开始

搜索

stm32mini+bh1750测光照源程序

[复制链接]
路漫漫 发表于 2020-5-29 02:05:19 | 显示全部楼层 |阅读模式
基于stm32mini实现bh1750测光照。
串口通信,波特率9600
接线说明:
SDA <-> PA3
SCL  <-> PA2
VCC  <-> VCC
GND <-> GND
ADDR <-> GND  (取决于slave address )这里接地
完整源码 stm32_bh1750测光照程序.7z (262.93 KB, 售价: 1 E币)
main.c文件如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "BH1750.h"
  6. #include "lcd.h"

  7. int main(void)
  8. {
  9. //  float light;
  10.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  11.         delay_init();                     //延时函数初始化         
  12.         uart_init(9600);                 //串口初始化为9600
  13.         LED_Init();                                //初始化与LED连接的硬件接口
  14.   Init_BH1750();       //初始化BH1750
  15.         LCD_Init();     //初始化LED
  16.         LCD_Clear(WHITE);     //清屏
  17.         
  18.   while(1)
  19.   {
  20. //   light=read_BH1750();  //读取BH1750的光强数据
  21.   extern float temp_integer;
  22.   extern float temp_fractions;
  23.            read_BH1750();
  24.                         LCD_ShowString(20,50,72,12,12,"light:");
  25.         
  26.                 LCD_ShowNum(60,50,temp_integer,4,12);
  27.           LCD_ShowString(84,50,12,12,12,".");
  28.           LCD_ShowNum(90,50,temp_fractions,2,12);
  29.                 LCD_ShowString(110,50,12,12,12,"lx");
  30.                 if(temp_integer<100)
  31.                 {
  32.                         LED1=0;
  33.                         
  34.                         LCD_ShowString(50,2,72,12,12,"LED-ON");
  35.                 }
  36.                 else
  37.                 {
  38.                         LED1=1;
  39.         
  40.                         LCD_ShowString(50,2,72,12,12,"LED-OFF");
  41.                 }
  42.   }               
  43. }        
复制代码
bh1750.c如下:
  1. /**************************************************************************
  2. * 文件名  :bh1750.c
  3. * 描述    :光强传感模块     
  4. ****************************************************************************/

  5. #include "BH1750.h"
  6. #include "delay.h"
  7. #include "lcd.h"

  8. float temp_integer;
  9. float temp_fractions;

  10. uchar    BUF[8];               //接收数据缓存区  
  11. int   mcy;     //进位标志

  12. /***开始信号***/
  13. void BH1750_Start()
  14. {
  15.   SDA=1;                    //拉高数据线
  16.   SCL=1;                   //拉高时钟线
  17.   delay_us(5);                 //延时
  18.   GPIO_ResetBits(bh1750_PORT, sda);                    //产生下降沿
  19.   delay_us(5);                 //延时
  20.   GPIO_ResetBits(bh1750_PORT, scl);                    //拉低时钟线
  21. }

  22. /*****停止信号******/
  23. void BH1750_Stop()
  24. {
  25.     SDA=0;                   //拉低数据线
  26.     SCL=1;                      //拉高时钟线
  27.     delay_us(5);                 //延时
  28.     GPIO_SetBits(bh1750_PORT, sda);                    //产生上升沿
  29.     delay_us(5);                 //延时
  30. }

  31. /**************************************
  32. 发送应答信号
  33. 入口参数:ack (0:ACK 1:NAK)
  34. **************************************/
  35. void BH1750_SendACK(int ack)
  36. {
  37.         GPIO_InitTypeDef GPIO_InitStruct;
  38.         
  39.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
  40.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  41.   GPIO_InitStruct.GPIO_Pin = sda;
  42.   GPIO_Init(bh1750_PORT, &GPIO_InitStruct);  
  43.         
  44.         if(ack == 1)   //写应答信号
  45.                 SDA=1;
  46.         else if(ack == 0)
  47.                 SDA=0;
  48.         else
  49.                 return;                        
  50.   SCL=1;     //拉高时钟线
  51.   delay_us(5);                 //延时
  52.   SCL=0;      //拉低时钟线
  53.   delay_us(5);                //延时
  54. }

  55. /**************************************
  56. 接收应答信号
  57. **************************************/
  58. int BH1750_RecvACK()
  59. {
  60.         GPIO_InitTypeDef GPIO_InitStruct;
  61.         
  62.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;  /*这里一定要设成输入上拉,否则不能读出数据*/
  63.   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  64.   GPIO_InitStruct.GPIO_Pin=sda;
  65.   GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
  66.         
  67.   SCL=1;            //拉高时钟线
  68.   delay_us(5);                 //延时        
  69.         if(GPIO_ReadInputDataBit(GPIOA,sda)==1)//读应答信号
  70.     mcy = 1 ;  
  71.   else
  72.     mcy = 0 ;                                
  73.   SCL=0;                    //拉低时钟线
  74.   delay_us(5);                 //延时
  75.   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  76.   GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
  77.         return mcy;
  78. }

  79. /**************************************
  80. 向IIC总线发送一个字节数据
  81. **************************************/
  82. void BH1750_SendByte(uchar dat)
  83. {
  84.   uchar i;
  85.   for (i=0; i<8; i++)         //8位计数器
  86.   {
  87.                 if( 0X80 & dat )
  88.       GPIO_SetBits(bh1750_PORT,sda);
  89.     else
  90.       GPIO_ResetBits(bh1750_PORT,sda);
  91.                 dat <<= 1;
  92.     SCL=1;               //拉高时钟线
  93.     delay_us(5);             //延时
  94.     SCL=0;                //拉低时钟线
  95.     delay_us(5);            //延时
  96.   }
  97.   BH1750_RecvACK();
  98. }

  99. uchar BH1750_RecvByte()
  100. {
  101.   uchar i;
  102.   uchar dat = 0;
  103.         uchar bit;
  104.         
  105.         GPIO_InitTypeDef GPIO_InitStruct;
  106.         
  107.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   /*这里一定要设成输入上拉,否则不能读出数据*/
  108.   GPIO_InitStruct.GPIO_Pin = sda;
  109.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  110.   GPIO_Init(bh1750_PORT,&GPIO_InitStruct );
  111.         
  112.   GPIO_SetBits(bh1750_PORT,sda);          //使能内部上拉,准备读取数据,
  113.   for (i=0; i<8; i++)         //8位计数器
  114.   {
  115.     dat <<= 1;
  116.     SCL=1;               //拉高时钟线
  117.     delay_us(5);             //延时
  118.                         
  119.                 if( SET == GPIO_ReadInputDataBit(bh1750_PORT,sda))
  120.       bit = 0X01;
  121.     else
  122.       bit = 0x00;  
  123.                 dat |= bit;             //读数据   
  124.                 SCL=0;                //拉低时钟线
  125.     delay_us(5);            //延时
  126.   }               
  127.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  128.   GPIO_Init(bh1750_PORT, &GPIO_InitStruct );
  129.   return dat;
  130. }

  131. void Single_Write_BH1750(uchar REG_Address)
  132. {
  133.   BH1750_Start();                  //起始信号
  134.   BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  135.   BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  136. //  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
  137.   BH1750_Stop();                   //发送停止信号
  138. }

  139. //初始化BH1750,根据需要请参考pdf进行修改****
  140. void Init_BH1750()
  141. {
  142.   GPIO_InitTypeDef GPIO_InitStruct;
  143.          /*开启GPIOB的外设时钟*/
  144.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  145.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
  146.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  147.   GPIO_InitStruct.GPIO_Pin = sda | scl ;
  148.   GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
  149.         
  150.   Single_Write_BH1750(0x01);  
  151.         delay_ms(180);            //延时180ms
  152. }

  153. //连续读出BH1750内部数据
  154. void mread(void)
  155. {   
  156.         uchar i;        
  157.   BH1750_Start();                          //起始信号
  158.   BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  159.         
  160.         for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF
  161.   {
  162.     BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  163.     if (i == 3)
  164.     {
  165.       BH1750_SendACK(1);                //最后一个数据需要回NOACK
  166.     }
  167.     else
  168.     {               
  169.       BH1750_SendACK(0);                //回应ACK
  170.     }
  171.   }
  172.   BH1750_Stop();                          //停止信号
  173.   delay_ms(5);
  174. }

  175. void read_BH1750(void)
  176. {
  177.   int dis_data;                       //变量        
  178. //        float temp_integer;
  179. //        float temp_fractions;

  180.         Single_Write_BH1750(0x01);   // power on
  181.   Single_Write_BH1750(0x10);   // H- resolution mode
  182.   delay_ms(180);            //延时180ms
  183.         mread();       //连续读出数据,存储在BUF中
  184.   dis_data=BUF[0];
  185.   dis_data=(dis_data<<8)+BUF[1]; //合成数据
  186.         temp_integer=dis_data/1.2;
  187.         temp_fractions=10*dis_data/1.2;        
  188.         temp_fractions=(int)temp_fractions%10;
  189.         
  190.         
  191. //        return temp_integer;
  192. }
复制代码
bh1750.h文件如下
  1. #ifndef __BH1750_H__
  2. #define __BH1750_H__

  3. #include "sys.h"

  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. #define SDA   PAout(3)   
  7. #define SCL   PAout(2)   
  8. #define sda   GPIO_Pin_3
  9. #define scl   GPIO_Pin_2
  10. #define bh1750_PORT GPIOA

  11. #define          SlaveAddress   0x46   //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  12.                               //ALT  ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  13.                                                                                                                         
  14. extern uchar    BUF[8];                         //接收数据缓存区              
  15. extern int     dis_data;                       //变量               
  16. extern int   mcy;              //表示进位标志位

  17. void Init_BH1750(void);
  18. void conversion(uint temp_data);
  19. void  Single_Write_BH1750(uchar REG_Address);//单个写入数据
  20. uchar Single_Read_BH1750(uchar REG_Address);   //单个读取内部寄存器数据
  21. void  mread(void);         //连续的读取内部寄存器数据
  22. void read_BH1750(void);
  23. #endif
复制代码


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-25 17:06

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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