3241|4

132

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【RISC-V MCU CH32V103测评】BH1750光强检测 [复制链接]

 

BH1750是一款数字式光强度传感器,相较于光敏电阻与A/D转换器所构成的光强检测,基于使用简便无需进行标度处理等特点。

BH1750是采用I2C接口来工作的,在使用时,可通过2个I/O口来模拟I2C通讯来进行环境光的检测。

BH1750与开发板的连接及显示效果如下图所示:

在模拟I2C通讯的过程中,对其输出高低电平及读取输入信号的相关定义如下:

#define SCL_Set() GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_SET)

#define SCL_Clr() GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_RESET)

 

#define SDA_Set() GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_SET)

#define SDA_Clr() GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_RESET)

配置BH1750相关引脚的初始化函数为:

void BH1750_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;                //定义一个GPIO_InitTypeDef类型的结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; //配置GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置GPIO模式为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;    //设置GPIO口输出速度   GPIO_Speed_50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //调用库函数,初始化GPIOA
}

将相关引脚设置为输入功能的函数为:

void IIC_INPUT_MODE_SET()
{
    GPIO_InitTypeDef  GPIO_InitStructure;                //定义一个GPIO_InitTypeDef类型的结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            //配置GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //设置GPIO模式为输入  GPIO_Mode_IPD GPIO_Mode_IPU
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ;    //设置GPIO口输出速度  GPIO_Speed_50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //调用库函数,初始化GPIOA
}

将相关引脚设置为输出功能的函数为:

void IIC_OUTPUT_MODE_SET()
{
    GPIO_InitTypeDef  GPIO_InitStructure;                //定义一个GPIO_InitTypeDef类型的结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            //配置GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置GPIO模式为推挽输出
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ;    //设置GPIO口输出速度GPIO_Speed_50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //调用库函数,初始化GPIOA
}

BH1750的多字节读取函数为:

void Multiple_Read_BH1750()
{
    BH1750_Start();
    BH1750_SendByte(SlaveAddress+1);
    BH1750_RecvACK();
    BUF[0] = BH1750_RecvByte();
    BH1750_SendACK(0);
    BUF[1] = BH1750_RecvByte();
    BH1750_SendACK(1);
    BH1750_Stop();
    Delay_Ms(5);
}

读取光强度值得函数为:

void Get_Sunlight_Value()
{
    int dis_data=0;
    float temp;
    char i=0;
    int sd;
    Single_Write_BH1750(0x01);  // power on
    Single_Write_BH1750(0x10);  // H- resolution mode
    Delay_Ms(180);
    Multiple_Read_BH1750();
    for(i=0;i<3;i++)    dis_data=BUF[0];
    dis_data=(dis_data<<8)+BUF[1];
    temp=(float)dis_data/1.2;
    sd=(int)temp;
    if(sd<54612) OLED_ShowNum(0,2,sd,5,16);
}

实现显示效果的主程序为:

int main(void)
{
    uint8_t  senflag;
    Delay_Init();   //延时函数初始化
    app_OLED_Init();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"CH32V103 TEST",16);
    OLED_ShowString(0,2,"OLED & BH1750",16);
    BH1750_Init();
    Delay_Ms(2000);
    OLED_Clear();
    OLED_ShowString(0,0,"Sunlight=",16);
    OLED_ShowString(48,2,"lx",16);
    while(1)
    {
       Get_Sunlight_Value();
       Delay_Ms(500);
    }
}

 

最新回复

感谢分享,期待后续的测评计划帖子哈,我也会持续关注你的哈!!!   详情 回复 发表于 2021-2-17 14:51

赞赏

1

查看全部赞赏

点赞(1) 关注
 
 

回复
举报

2942

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 

为啥非要使用IO口来模拟IIC,硬件上不是有IIC吗?这种用法在任务少的时候没有问题,但是在多任务的环境下这就是大问题了。以后使用操作系统是趋势,建议少用IO模拟。

点评

主要是易于移植,对于容量大好上系统,小的会受限。  详情 回复 发表于 2021-2-15 10:18
 
 
 

回复

132

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
本帖最后由 jennyzhaojie 于 2021-2-15 10:20 编辑
bigbat 发表于 2021-2-15 08:51 为啥非要使用IO口来模拟IIC,硬件上不是有IIC吗?这种用法在任务少的时候没有问题,但是在多任务的环境下这 ...

主要是易于移植,使用引脚不受限制;对于容量大的好上系统,小的会受限些。

 
 
 

回复

1942

帖子

2

TA的资源

版主

4
 

感谢分享,期待后续的测评计划帖子哈,我也会持续关注你的哈!!!

 
 
 

回复

132

帖子

0

TA的资源

一粒金砂(高级)

5
 
w494143467 发表于 2021-2-17 14:51 感谢分享,期待后续的测评计划帖子哈,我也会持续关注你的哈!!!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表