stm32f103ve+BH1750使用教程+oled(HAL库)

博客 分享
0 245
张三
张三 2022-06-08 23:00:16
悬赏:0 积分 收藏

stm32f103ve+BH1750使用教程+oled(HAL库)

1.硬件:BH1750模块+oled

2.代码:BH1750是标准的iic协议的外设,我这里单独有iic的文件,之后想要实现多个设备共用一个iic。

BH1750.c
 1 #include "BH1750.h" 2 #include "delay.h" 3 #include "iic.h" 4 void bh_data_send(u8 command) 5 { 6     do{ 7     iic_start(); 8     iic_byte_write(BHAddWrite); 9     }while(iic_wait_ack());10     iic_byte_write(command);11     iic_wait_ack();12     iic_stop();13 }14 15 u16 bh_data_read(void)16 {17     u16 buf;18     iic_start();19     iic_byte_write(BHAddRead);20     iic_wait_ack();21     buf=iic_byte_read(1);22     buf=buf<<8;23     buf+=0x00ff&iic_byte_read(0);24     iic_stop();25     return buf;26 }
BH1750.h
#ifndef __BH1750_H#define __BH1750_H#include "main.h"/*************************************************************/#define BHAddWrite     0x46      //从机地址+最后写方向位#define BHAddRead      0x47      //从机地址+最后读方向位#define BHPowDown      0x00      //关闭模块#define BHPowOn        0x01      //打开模块等待测量指令#define BHReset        0x07      //重置数据寄存器值在PowerOn模式下有效#define BHModeH1       0x10      //高分辨率 单位1lx 测量时间120ms#define BHModeH2       0x11      //高分辨率模式2 单位0.5lx 测量时间120ms#define BHModeL        0x13      //低分辨率 单位4lx 测量时间16ms#define BHSigModeH     0x20      //一次高分辨率 测量 测量后模块转到 PowerDown模式#define BHSigModeH2    0x21      //同上类似#define BHSigModeL     0x23      // 上类似/*************************************************************/void bh_data_send(u8 command);u16 bh_data_read(void);#endif

iic.c

#include "iic.h"#include "delay.h"void iic_init(void){        IIC2_SCL = 1;    IIC2_SDA = 1;}/*函数名:iic_start功  能:启动iic,启动方式,在SCL高电平期间将SDA由高置低参  数:无返回值:无*/void iic_start(void){    SDA2_OUT();    IIC2_SDA=1;    IIC2_SCL=1;    delay_us(1);    IIC2_SDA=0;    delay_us(1);    IIC2_SCL=0;}/*函数名:iic_stop功  能:停止传输数据,实现方式在SCL高电平期间将SDA由低置高参  数:无返回值:无*/void iic_stop(void){    IIC2_SCL=0;    SDA2_OUT();        IIC2_SDA=0;    delay_us(1);    IIC2_SCL=1;    IIC2_SDA=1;    delay_us(1);}/*函数名:iic_ack功  能:接收从机应答信号,释放掉总线读取SDA置看是否有负脉冲,        当一段时间无应答默认接收完毕参  数:无返回值:无*/u8 iic_wait_ack(void){    u8 i=0;    SDA2_IN();    IIC2_SDA=1;delay_us(1);    IIC2_SCL=1;delay_us(1);    while(READ2_SDA)    {        i++;        if(i>250)         {                    iic_stop();            //如果i>255则产生非应答信号,iic停止            return 1;        }            }    IIC2_SCL=0;//时钟输出0     return 0;}/*函数名:iic_nask功  能:产生非应答信号参  数:无返  回:无*/void iic_nack(void){    IIC2_SCL=0;    SDA2_OUT();    IIC2_SDA=1;    delay_us(1);    IIC2_SCL=1;    delay_us(1);    IIC2_SCL=0;}    /*函数名:iic_ask功  能:产生ask应答参  数:无返  回:无*/void iic_ack(void){    IIC2_SCL=0;    SDA2_OUT();    IIC2_SDA=0;    delay_us(1);    IIC2_SCL=1;    delay_us(1);    IIC2_SCL=0;}/*函数名:iic_bit_write功  能:传送一个字节参  数:u8返回值:无*/void iic_byte_write(u8 buf){    u8 i;    SDA2_OUT();    IIC2_SCL=0;    for(i=1;i<=8;i++)    {        IIC2_SDA=(buf>>(8-i))&0x01;        delay_us(1);        IIC2_SCL=1;        delay_us(1);        IIC2_SCL=0;        delay_us(1);            }}/*函数名:iic_bit_read功  能:主机读取一个字节参  数:ask返回值:*/u8 iic_byte_read(unsigned char ask){    unsigned char  i,buf=0;    SDA2_IN();    for(i=0;i<8;i++)    {       IIC2_SCL=0;       delay_us(1);       IIC2_SCL=1;       buf <<=1;       if(READ2_SDA)           buf++;        delay_us(1);    }    if(!ask)        iic_nack();    else        iic_ack();    return buf;}

iic.h

#ifndef __IIC_H#define __IIC_H #include "main.h"#define SDA2_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)8<<4;}#define SDA2_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}#define IIC2_SCL    PBout(8) //SCL#define IIC2_SDA    PBout(9) //SDA     #define READ2_SDA   HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)void iic_init(void);void iic_start(void);void iic_stop(void);u8 iic_wait_ack(void);void iic_byte_write(u8 buf);u8 iic_byte_read(unsigned char ask);#endif

mian.c


int
main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ SystemClock_Config(); MX_GPIO_Init(); /* USER CODE BEGIN 2 */ OLED_Clear(); LEDG_OFF(); OLED_Init(); iic_init(); bh_data_send(BHPowOn); //==使能BH1750模块 bh_data_send(BHReset); //==复位BH1750模块 bh_data_send(BHModeH2);//==配置BH1750工作模式 /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ datalx =bh_data_read()/1.2; sprintf(string,"Light= %.1f",datalx); OLED_ShowString(0,0,string,16); OLED_ShowString(88,0,"lux",16); OLED_Refresh(); } /* USER CODE END 3 */}

 

posted @ 2022-06-08 22:42 lorem万俟 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员