欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32mini+bh1750測光照源程序
[打印本頁]
作者:
Tracytra
時間:
2020-5-27 04:13
標題:
stm32mini+bh1750測光照源程序
基于stm32mini實現bh1750測光照。
串口通信,波特率9600
接線說明:
SDA <-> PA3
SCL <-> PA2
VCC <-> VCC
GND <-> GND
ADDR <-> GND (取決于slave address )這里接地
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
復制代碼
全部程序51hei下載地址:
bh1750程序.7z
(262.93 KB, 下載次數: 68)
2020-5-27 14:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
yy3900636
時間:
2020-6-5 10:30
多謝樓主,這里正好有用
作者:
wyqf
時間:
2021-12-6 22:05
感謝樓主,實測可用
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1