标题:
stm32f103zet6单片机BH1750光照传感器程序 0.96OLED显示
[打印本页]
作者:
muji
时间:
2023-8-9 15:37
标题:
stm32f103zet6单片机BH1750光照传感器程序 0.96OLED显示
工程实现了在stm32f103zet6开发板上利用双iic通信定时采集bh1750的光照信息(勒克斯),并将数据展示在0.96寸oled屏幕上,实现实时定量定性观测环境光照强度大小。keil工程如下:
单片机源程序如下:
#include "sys.h"
#include "delay.h"
#include "bh1750.h"
#include "oled.h"
/*
BH1750
SCL PB10
SDA PB11
VCC 3.3V
GND GND
ADDR keyibujie.
0.96OLED IIC
SCL PG12
SDA PD5
VCC 3.3V
GND GND
*/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
Light_Init();
bh_data_send(BHPowOn);
bh_data_send(BHReset);
bh_data_send(BHModeH1); //选择的是分辨率是4lx,测量时间是16ms的
delay_ms(100);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Clear();
OLED_Init();
OLED_ShowChinese(12,0,0,24,1);
OLED_ShowChinese(36,0,1,24,1);
OLED_ShowChinese(60,0,2,24,1);
OLED_ShowChinese(84,0,3,24,1);
while(1)
{
printf("%d \n",bh_data_read());
OLED_SHOW_BH1750(); //OLED动态显示BH1750光照数值
OLED_Refresh();
delay_ms(100);
}
}
复制代码
#include "delay.h"
#include "bh1750.h"
#include "oled.h"
typedef unsigned char BYTE;
//BYTE BUF[8]; //接收数据缓存区
//iic接口初始化
void Single_Write_BH1750(uchar REG_Address)
{
IIC_Start(); //起始信号
IIC_Send_Byte(BHAddWrite); //发送设备地址+写信号
IIC_Send_Byte(REG_Address); //内部寄存器地址,
// BH1750_SendByte(REG_data); //内部寄存器数据,
IIC_Stop(); //发送停止信号
}
void Light_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB10,11
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
Single_Write_BH1750(0x01);
}
/*************************************************************************************/
void bh_data_send(u8 command)
{
do{
IIC_Start(); //iic起始信号
IIC_Send_Byte(BHAddWrite); //发送器件地址
}while(IIC_Wait_Ack()); //等待从机应答
IIC_Send_Byte(command); //发送指令
IIC_Wait_Ack(); //等待从机应答
IIC_Stop(); //iic停止信号
}
u16 bh_data_read(void)
{
u16 buf;
IIC_Start(); //iic起始信号
IIC_Send_Byte(BHAddRead); //发送器件地址+读标志位
IIC_Wait_Ack(); //等待从机应答
buf=IIC_Read_Byte(1); //读取数据
buf=buf<<8; //读取并保存高八位数据
buf+=0x00ff&IIC_Read_Byte(0); //读取并保存第八位数据
IIC_Stop(); //发送停止信号
return buf;
}
void OLED_SHOW_BH1750(void)
{
OLED_ShowChar(40,26,'L',16,1);
OLED_ShowChar(48,26,'U',16,1);
OLED_ShowChar(58,26,'X',16,1);
if(bh_data_read() > 65200)
{
OLED_ShowChar(32,0,'E',16,0);
OLED_ShowChar(40,0,'R',16,0);
OLED_ShowChar(48,0,'R',16,0);
OLED_ShowChar(56,0,'O',16,0);
OLED_ShowChar(64,0,'R',16,0);
delay_ms(500);
OLED_Clear();
}
else if(bh_data_read() > 10000 && bh_data_read() < 65200)
{ OLED_ShowChinese(70,38,7,24,1);
OLED_ShowChinese(94,38,7,24,1);
OLED_ShowNum(0,26,bh_data_read() % 100000 / 10000,1,16,1);
OLED_ShowNum(8,26,bh_data_read() % 10000 / 1000 ,1,16,1);
OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
OLED_ShowChinese(70,38,4,24,1);
OLED_ShowChinese(94,38,2,24,1);
}
else if(bh_data_read() > 1000 && bh_data_read() < 10000)
{ OLED_ShowChinese(70,38,7,24,1);
OLED_ShowChinese(94,38,7,24,1);
OLED_ShowChar(0,26,' ',16,1);
OLED_ShowNum(8,26,bh_data_read() % 10000 / 1000 ,1,16,1);
OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
OLED_ShowChinese(70,38,2,24,1);
}
else if(bh_data_read() > 100 && bh_data_read() < 1000)
{ OLED_ShowChinese(70,38,7,24,1);
OLED_ShowChinese(94,38,7,24,1);
OLED_ShowChar(0,26,' ',16,1);
OLED_ShowChar(8,26,' ',16,1);
OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
OLED_ShowChinese(70,38,5,24,1);
OLED_ShowChinese(94,38,8,24,1);
}
else if(bh_data_read() > 10 && bh_data_read() < 100)
{ OLED_ShowChinese(70,38,7,24,1);
OLED_ShowChinese(94,38,7,24,1);
OLED_ShowChar(0,26,' ',16,1);
OLED_ShowChar(8,26,' ',16,1);
OLED_ShowChar(16,26,' ',16,1);
OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
OLED_ShowChinese(70,38,6,24,1);
}
else if(bh_data_read() < 10)
{ OLED_ShowChinese(70,38,7,24,1);
OLED_ShowChinese(94,38,7,24,1);
OLED_ShowChar(0,26,' ',16,1);
OLED_ShowChar(8,26,' ',16,1);
OLED_ShowChar(16,26,' ',16,1);
OLED_ShowChar(24,26,' ',16,1);
OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
OLED_ShowChinese(70,38,4,24,1);
OLED_ShowChinese(94,38,6,24,1);
}
// else break;
delay_ms(100);
}
复制代码
原理图:无
仿真:无
代码:
程序.7z
(201.55 KB, 下载次数: 40)
2023-8-9 16:08 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1900352116
时间:
2024-12-21 20:55
不能用
作者:
czh773963064
时间:
2025-3-17 08:23
谢谢分享,我也正在自己学习编程,学习了!
作者:
七彩的梦想
时间:
2025-4-8 23:14
有网友验证过以上程序能用吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1