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 */ }
标签:SCL,BH1750,HAL,stm32f103ve,void,delay,iic,IIC2,define 来源: https://www.cnblogs.com/loremmoqi/p/16357565.html