设为首页
收藏本站
找回密码
开启辅助访问
登录
注册
只需一步,快速开始
首页
BBS
在线充值
搜索
工控币获得方法
联系方式
搜索
搜索
本版
帖子
用户
工控论坛
»
首页
›
电子技术
›
STM32/8
›
stm32mini+bh1750测光照源程序
返回列表
发新帖
stm32mini+bh1750测光照源程序
[复制链接]
0
|
0
|
2020-5-29 02:05:19
|
显示全部楼层
|
阅读模式
基于stm32mini实现bh1750测光照。
串口通信,波特率9600
接线说明:
SDA <-> PA3
SCL <-> PA2
VCC <-> VCC
GND <-> GND
ADDR <-> GND (取决于slave address )这里接地
完整源码
stm32_bh1750测光照程序.7z
(262.93 KB, 售价: 1 工控币)
2020-5-29 02:03 上传
点击文件名下载附件
main.c文件如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "BH1750.h"
#include "lcd.h"
int main(void)
{
// float light;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
Init_BH1750(); //初始化BH1750
LCD_Init(); //初始化LED
LCD_Clear(WHITE); //清屏
while(1)
{
// light=read_BH1750(); //读取BH1750的光强数据
extern float temp_integer;
extern float temp_fractions;
read_BH1750();
LCD_ShowString(20,50,72,12,12,"light:");
LCD_ShowNum(60,50,temp_integer,4,12);
LCD_ShowString(84,50,12,12,12,".");
LCD_ShowNum(90,50,temp_fractions,2,12);
LCD_ShowString(110,50,12,12,12,"lx");
if(temp_integer<100)
{
LED1=0;
LCD_ShowString(50,2,72,12,12,"LED-ON");
}
else
{
LED1=1;
LCD_ShowString(50,2,72,12,12,"LED-OFF");
}
}
}
复制代码
bh1750.c如下:
/**************************************************************************
* 文件名 :bh1750.c
* 描述 :光强传感模块
****************************************************************************/
#include "BH1750.h"
#include "delay.h"
#include "lcd.h"
float temp_integer;
float temp_fractions;
uchar BUF[8]; //接收数据缓存区
int mcy; //进位标志
/***开始信号***/
void BH1750_Start()
{
SDA=1; //拉高数据线
SCL=1; //拉高时钟线
delay_us(5); //延时
GPIO_ResetBits(bh1750_PORT, sda); //产生下降沿
delay_us(5); //延时
GPIO_ResetBits(bh1750_PORT, scl); //拉低时钟线
}
/*****停止信号******/
void BH1750_Stop()
{
SDA=0; //拉低数据线
SCL=1; //拉高时钟线
delay_us(5); //延时
GPIO_SetBits(bh1750_PORT, sda); //产生上升沿
delay_us(5); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
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(bh1750_PORT, &GPIO_InitStruct);
if(ack == 1) //写应答信号
SDA=1;
else if(ack == 0)
SDA=0;
else
return;
SCL=1; //拉高时钟线
delay_us(5); //延时
SCL=0; //拉低时钟线
delay_us(5); //延时
}
/**************************************
接收应答信号
**************************************/
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(bh1750_PORT,&GPIO_InitStruct);
SCL=1; //拉高时钟线
delay_us(5); //延时
if(GPIO_ReadInputDataBit(GPIOA,sda)==1)//读应答信号
mcy = 1 ;
else
mcy = 0 ;
SCL=0; //拉低时钟线
delay_us(5); //延时
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
return mcy;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
if( 0X80 & dat )
GPIO_SetBits(bh1750_PORT,sda);
else
GPIO_ResetBits(bh1750_PORT,sda);
dat <<= 1;
SCL=1; //拉高时钟线
delay_us(5); //延时
SCL=0; //拉低时钟线
delay_us(5); //延时
}
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(bh1750_PORT,&GPIO_InitStruct );
GPIO_SetBits(bh1750_PORT,sda); //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL=1; //拉高时钟线
delay_us(5); //延时
if( SET == GPIO_ReadInputDataBit(bh1750_PORT,sda))
bit = 0X01;
else
bit = 0x00;
dat |= bit; //读数据
SCL=0; //拉低时钟线
delay_us(5); //延时
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(bh1750_PORT, &GPIO_InitStruct );
return dat;
}
void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
BH1750_Stop(); //发送停止信号
}
//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
GPIO_InitTypeDef GPIO_InitStruct;
/*开启GPIOB的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda | scl ;
GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
Single_Write_BH1750(0x01);
delay_ms(180); //延时180ms
}
//连续读出BH1750内部数据
void mread(void)
{
uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
BH1750_Stop(); //停止信号
delay_ms(5);
}
void read_BH1750(void)
{
int dis_data; //变量
// float temp_integer;
// float temp_fractions;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_ms(180); //延时180ms
mread(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1]; //合成数据
temp_integer=dis_data/1.2;
temp_fractions=10*dis_data/1.2;
temp_fractions=(int)temp_fractions%10;
// return temp_integer;
}
复制代码
bh1750.h文件如下
#ifndef __BH1750_H__
#define __BH1750_H__
#include "sys.h"
#define uchar unsigned char
#define uint unsigned int
#define SDA PAout(3)
#define SCL PAout(2)
#define sda GPIO_Pin_3
#define scl GPIO_Pin_2
#define bh1750_PORT GPIOA
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
extern uchar BUF[8]; //接收数据缓存区
extern int dis_data; //变量
extern int mcy; //表示进位标志位
void Init_BH1750(void);
void conversion(uint temp_data);
void Single_Write_BH1750(uchar REG_Address);//单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void mread(void); //连续的读取内部寄存器数据
void read_BH1750(void);
#endif
复制代码
光照
,
照度
,
bh1750
,
stm32
相关帖子
•
STM32F407+OOP+FSM设计思想
•
STM32做平衡小车全套sch原理图pcb电路图文件 C程序代码 BOM表
•
STM32实现U盘功能 USB_Mass_Storage源码
•
STM32串口的LIN从模式代码
•
基于stm32和soem的EtherCAT主站代码
•
太阳能翻板追日控制 采用s7-200plc与光照度模块modbus通信
•
STM32+LabVIEW的USB数据采集与显示源程序
•
STM32示波器程序ILI9341_IO模拟源程序+Proteus仿真
•
STM32F407 FLAC软解压 源程序
•
用PROTEUS8.9仿真实现STM32 ADC一路连续转换,值显示在LCD12864上
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
路漫漫
194
主题
199
帖子
74
积分
初级会员
初级会员, 积分 74, 距离下一级还需 426 积分
初级会员, 积分 74, 距离下一级还需 426 积分
工控币
74
加好友
发消息
回复楼主
返回列表
电子技术综合讨论
单片机嵌入式
EDA设计仿真
STM32/8
51单片机
上位机开发及系统管理
Labview
Multisim仿真
图文推荐
350W开关电源原理图及PCB图 元件参数封装图 完整资料可量产
7 天前
STM32做平衡小车全套sch原理图pcb电路图文件 C程序代码 BOM表
2021-04-01
三菱FX系列PLC与变频器MODBUS ASCII通信示例程序和文档
2021-03-31
三菱FX2N PLC与三菱变频器ModbusRTU协议通讯应用教程和示例程序
2021-03-31
电镀生产线S7-200 PLC程序带注释
2021-03-25
热门排行
1
LIS3DH中文数据手册
2
STM32F407+OOP+FSM设计思想
3
有偿求iFIX 5.9英文版授权
4
求IFIX5.9授权文件
5
威纶通触摸屏对应的位地址怎么写
6
卡尔曼(kalman)滤波演示程序 c#源码
7
三菱FX5U 以太网CC-LINK BASIC总线控制伺服
8
VC2017+OPENCV4.30实现机器人与传感器的手
9
CISCO QSGMII接口介绍,介绍sgmii接口与QSG
10
西门子STEP7 modbus 软件包分享