找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3536|回复: 2
打印 上一主题 下一主题
收起左侧

STM32的BH1750程序

[复制链接]
跳转到指定楼层
楼主
ID:569034 发表于 2019-10-12 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "usart.h"
  4. #include "hard_i2c_driver.h"
  5. #include "arc_lcd.h"
  6. /* Private typedef -----------------------------------------------------------*/
  7. /* Private define ------------------------------------------------------------*/
  8. /* Private macro -------------------------------------------------------------*/
  9. extern I2C_INIT_INFO I2C_Info;        ///<I2C控制器相关信息
  10. /* Private variables ---------------------------------------------------------*/
  11. /* Private function prototypes -----------------------------------------------*/
  12. /* Private functions ---------------------------------------------------------*/

  13. /**
  14.   * @brief  延时函数
  15.   * @param  Time 延时时间参数
  16.   * @retval None
  17.   */
  18. void Delay(uint32_t Time)
  19. {
  20.         while(Time--);
  21. }
  22. /**
  23.   * @brief  串口打印输出温度和湿度
  24.   * @param  None
  25.   * @retval None
  26.   */
  27. int main(void)
  28. {
  29.         uint8_t I2C_Data[10],ret;
  30.         uint8_t DataString[100];
  31.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); //重新映射中断向量表
  32.         SystemInit();//系统时钟初始化
  33.         USART_Configuration(115200);//串口1初始化
  34.         printf("\x0c\0");printf("\x0c\0");//超级终端清屏
  35.         printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
  36.         printf("\r\n*******************************************************************************");
  37.         printf("\r\n************************ Copyright 2009-2012, ViewTool ************************");
  38.         printf("\r\n************************* viewtoolcom *************************");
  39.         printf("\r\n***************************** All Rights Reserved *****************************");
  40.         printf("\r\n*******************************************************************************");
  41.         printf("\r\n");
  42.         ARC_LCD_Init();//初始化LCD
  43.         ARC_LCD_Clear(LCD_COLOR_BLACK);
  44.         //根据BH1750FVI传感器设置I2C初始化数据
  45.         I2C_Info.controlMode = 1;//硬件控制
  46.         I2C_Info.speed=100000;//100K
  47.         I2C_Info.subAddrMode=2;//无子地址模式
  48.         I2C_Info.subAddrWidth=0;//子地址为0字节宽度
  49.         I2C_Info.slaveAddr=0x46;//BH1750FVI传感器I2C地址
  50.         I2C_Info.channel=1;//使用I2C2
  51.         VT_I2C_HardInit(&I2C_Info);
  52.         I2C_Data[0]=0x01;
  53.         VT_I2C_HardWriteNByte(I2C2,0,I2C_Data,1);//传感器芯片上电命令
  54.         while(1)
  55.         {
  56.                 I2C_Data[0]=0x11;
  57.                 ret = VT_I2C_HardWriteNByte(I2C2,0,I2C_Data,1);//发送测量命令
  58.                 if(ret){
  59.                         printf("I2C写数据错误 %d\n\r",ret);
  60.                 }
  61.                 Delay(3000000);//等待大于120ms,必须加这个延时,否则传感器没准备好数据会出现读数据错误
  62.                 ret = VT_I2C_HardReadNByte(I2C2,0,I2C_Data,2);//读取光照强度值
  63.                 if(ret){
  64.                         printf("I2C读数据错误 %d\n\r",ret);
  65.                 }else{
  66.                         printf("光强度:%f lx\n\r",((I2C_Data[0]<<8)+I2C_Data[1])/(1.2*2));
  67.                         sprintf((char *)DataString,"%0.1f",((I2C_Data[0]<<8)+I2C_Data[1])/(1.2*2));
  68.                         ARC_LCD_DispMyString(0,70,DataString);//将测得的温度值在LCD上显示
  69.                 }
  70.                 Delay(1000000);
  71.         }
  72. }

  73. #ifdef  USE_FULL_ASSERT
  74. /**
  75.   * @brief  报告在检查参数发生错误时的源文件名和错误行数
  76.   * @param  file 源文件名
  77.   * @param  line 错误所在行数
  78.   * @retval None
  79.   */
  80. void assert_failed(uint8_t* file, uint32_t line)
  81. {
  82.     /* 用户可以增加自己的代码用于报告错误的文件名和所在行数,
  83.        例如:printf("错误参数值: 文件名 %s 在 %d行\r\n", file, line) */

  84.     /* 无限循环 */
  85.     while (1)
  86.     {
  87.     }
  88. }
  89. #endif

  90. /*********************************END OF FILE**********************************/
复制代码

所有资料51hei提供下载:
光照.7z (732.92 KB, 下载次数: 54)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-10-12 23:47 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:569034 发表于 2019-10-13 21:25 | 只看该作者
#include "BH1750.h"
#include "stdio.h"

uchar  BUF[8];                                   

int mcy;              
uint date[4];
uint dis_data;      
void GPIOConfig(void)  
{
          GPIO_InitTypeDef GPIO_InitStruct;
       
          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
       
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = sda | scl;   

void Delay_5us(void)
{
         uint16_t i=0;
         uint16_t timer = 5;
         while(timer--)
          {
                         i=10;
                         while(i--);
    }
}

void Delay_mms(uint16_t tmp)
{
          uint16_t i=0;
          while(tmp--)
                  {
                                i=12000;
                                while(i--);
      }
}

void BH1750_Start()
{
    GPIO_SetBits(GPIOB, sda);                  
    GPIO_SetBits(GPIOB, scl);                 
    Delay_5us();               
    GPIO_ResetBits(GPIOB, sda);                  
    Delay_5us();               
}


void BH1750_Stop()
{
                GPIO_ResetBits(GPIOB, scl);               
    GPIO_ResetBits(GPIOB, sda);                  
    GPIO_SetBits(GPIOB, scl);                     
    Delay_5us();               
    GPIO_SetBits(GPIOB, sda);                  
    Delay_5us();               
}
void BH1750_SendACK(int ack)
{
          GPIO_InitTypeDef GPIO_InitStruct;
       
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = sda;
    GPIO_Init(GPIOB, &GPIO_InitStruct);  
       
       
    if(ack == 1)   
                        GPIO_SetBits(GPIOB, sda);
                else if(ack == 0)
                        GPIO_ResetBits(GPIOB, sda);
                else
                        return;
                       
    GPIO_SetBits(GPIOB, scl);   
    Delay_5us();               
    GPIO_ResetBits(GPIOB, scl);      
    Delay_5us();               
}

int BH1750_RecvACK()
{
          GPIO_InitTypeDef GPIO_InitStruct;
       
          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = sda;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
       
    GPIO_SetBits(GPIOB, scl);           
    Delay_5us();                 
       
          if(GPIO_ReadInputDataBit( GPIOB, sda ) ==1 )
        mcy = 1 ;  
    else
        mcy = 0 ;                       
       
    GPIO_ResetBits(GPIOB, scl);                    
    Delay_5us();                 
  
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init( GPIOB, &GPIO_InitStruct );
       
    return mcy;
}

void BH1750_SendByte(uchar dat)
{
    uchar i;

    for (i=0; i<8; i++)      
{
                                if( 0X80 & dat )
          GPIO_SetBits( GPIOB, sda);
        else
          GPIO_ResetBits( GPIOB, sda);
                         
       dat <<= 1;
        GPIO_SetBits(GPIOB, scl);               
        Delay_5us();           
        GPIO_ResetBits(GPIOB, scl);              
        Delay_5us();           
      }
    BH1750_RecvACK();
}

uchar BH1750_RecvByte()     
{
    uchar i;
    uchar dat = 0;
          uchar bit;
          
         GPIO_InitTypeDef GPIO_InitStruct;
         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_InitStruct.GPIO_Pin = sda;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init( GPIOB, &GPIO_InitStruct );
       
    GPIO_SetBits( GPIOB, sda);         
    for (i=0; i<8; i++)        
    {
        dat <<= 1;
        GPIO_SetBits( GPIOB, scl);              
        Delay_5us();           
                       
                          if( SET == GPIO_ReadInputDataBit( GPIOB, sda ) )
             bit = 0X01;
       else
             bit = 0x00;  
                       
        dat |= bit;               
                       
        GPIO_ResetBits( GPIOB, scl);               
        Delay_5us();            
    }
               
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init( GPIOB, &GPIO_InitStruct );
    return dat;
}

void Single_Write_BH1750(uchar REG_Address)
{
    BH1750_Start();                 
    BH1750_SendByte(SlaveAddress);   
    BH1750_SendByte(REG_Address);   
  //  BH1750_SendByte(REG_data);     
    BH1750_Stop();                  
}


void Init_BH1750()
{
   //Single_Write_BH1750(0x01);  
       
                Single_Write_BH1750(0x01);  
       
    Single_Write_BH1750(0x10);   
   Delay_mms(180);            
}

void mread(void)
{   
          uchar i;       
    BH1750_Start();                     
    BH1750_SendByte(SlaveAddress+1);      
          for (i=0; i<3; i++)                     
    {
       BUF[i] = BH1750_RecvByte();         

                          
                         dis_data=BUF[i];

             date[i]=(dis_data<<8)+BUF[i];      

                         if (i == 3)
       {
          BH1750_SendACK(1);              
       }
       else
       {               
          BH1750_SendACK(0);         
       }
                         Delay_mms(5);
   }
          date[0]=(date[0]+date[1]+date[2])/3;
    BH1750_Stop();                          
    Delay_mms(5);
}

BH1750光强传感器.pdf

433.63 KB, 下载次数: 12, 下载积分: 黑币 -5

模块详细资料

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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