欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32單片機的光照傳感器程序源碼
[打印本頁]
作者:
電子極客迷
時間:
2019-4-15 11:01
標題:
stm32單片機的光照傳感器程序源碼
#include "bh1750.h"
#define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據ALT ADDRESS地址引腳不同修改
unsigned char BUF[4]; //接收數據緩存區
/***************************************************************
** 功能: IIC端口初始化
** 參數: 無參數
** 返回值: 無
****************************************************************/
void BH1750IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin;//PB6/PB7/PB5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GQ_GPIOx, &GPIO_InitStructure); //根據設定參數初始化
GPIO_SetBits(GQ_GPIOx,ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin); //輸出高
}
void In_mode(void)//SDA配置輸入模式
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GQ_GPIOx, &GPIO_InitStructure); //根據設定參數初始化
}
void Out_mode(void)//SDA配置輸出模式
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GQ_GPIOx, &GPIO_InitStructure); //根據設定參數初始化
}
/***************************************************************
** 功能: 產生IIC起始信號
** 參數: 無參數
** 返回值: 無
****************************************************************/
void BH1750_Start()
{
SDA_OUT(); //sda線輸出
SETSDA;
SETSCL;
delay_us(4);
CLRSDA;//START:when CLK is high,DATA change form high to low
delay_us(4);
CLRSCL;//鉗住I2C總線,準備發送或接收數據
}
/***************************************************************
** 功能: 產生IIC停止信號
** 參數: 無參數
** 返回值: 無
****************************************************************/
void BH1750_Stop()
{
SDA_OUT();//sda線輸出
CLRSDA;//STOP:when CLK is high DATA change form low to high
SETSCL;
delay_us(4);
SETSDA;//發送I2C總線結束信號
delay_us(4);
}
/***************************************************************
** 功能: 產生IIC應答信號
** 參數: 無參數
** 返回值: 無
****************************************************************/
void BH1750_SendACK(unsigned char ack)
{
SDA_OUT(); //sda線輸出
if(ack)
{
SETSDA; //寫應答信號
}
else
{
CLRSDA;
}
SETSCL; //拉高時鐘線
delay_us(2); //延時
CLRSCL; //拉低時鐘線
delay_us(2); //延時
}
/***************************************************************
** 功能: 產生IIC接收信號
** 參數: 無參數
** 返回值: 無
****************************************************************/
unsigned char BH1750_RecvACK()
{
unsigned char data;
SDA_IN(); //SDA設置為輸入
SETSCL; //拉高時鐘線
delay_us(2); //延時
data = READ_SDA; //讀應答信號
CLRSCL; //拉低時鐘線
delay_us(2); //延時
return data;
}
/***************************************************************
** 功能: 向IIC總線發送一個字節數據
** 參數: dat:一字節數據
** 返回值: 無
****************************************************************/
void BH1750_SendByte(unsigned char dat)
{
unsigned char i,bit;
SDA_OUT(); //sda線輸出
for (i=0; i<8; i++) //8位計數器
{
bit=dat&0x80;
if(bit)
{
SETSDA;
}
else
CLRSDA;
dat <<= 1; //移出數據的最高位
SETSCL; //拉高時鐘線
delay_us(2); //延時
CLRSCL; //拉低時鐘線
delay_us(2); //延時
}
BH1750_RecvACK();
}
/***************************************************************
** 功能: 從IIC總線接收一個字節數據
** 參數: 無參數
** 返回值: dat:接收一字節數據
****************************************************************/
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
unsigned char a;
SDA_IN(); //SDA設置為輸入
SETSDA; //使能內部上拉,準備讀取數據,
for(i=0; i<8; i++) //8位計數器
{
dat <<= 1;
SETSCL; //拉高時鐘線
delay_us(2); //延時
a=READ_SDA;//讀SDA數據
if(a==1)dat+=1;
CLRSCL; //拉低時鐘線
delay_us(2); //延時
}
return dat;
}
/***************************************************************
** 功能: 向bh1750寫入命令
** 參數: 無參數
** 返回值: 無
****************************************************************/
void Single_Write_BH1750( unsigned char REG_Address)
{
BH1750_Start(); //起始信號
BH1750_SendByte(SlaveAddress); //發送設備地址+寫信號
BH1750_SendByte(REG_Address); //內部寄存器地址,
BH1750_Stop(); //發送停止信號
}
/***************************************************************
** 功能: 連續讀出BH1750內部數據
** 參數: 無參數
** 返回值: 無
****************************************************************/
void Multiple_Read_BH1750(void)
{
unsigned char i;
BH1750_Start(); //起始信號
BH1750_SendByte(SlaveAddress+1); //發送設備地址+讀信號
for(i=0; i<3; i++) //連續讀取2個地址數據,存儲中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存儲0x32地址中的數據
if(i == 3)
{
BH1750_SendACK(1); //最后一個數據需要回NOACK
}
else
{
BH1750_SendACK(0); //回應ACK
}
}
BH1750_Stop(); //停止信號
// delay_ms(150);
}
/***************************************************************
** 功能: 初始化BH1750
** 參數: 無參數
** 返回值: 無
****************************************************************/
void BH1750_Init()
{
BH1750IO_Init();
Single_Write_BH1750(0x01);
CLRADDR; //將ADDR位初始化拉低
}
/***************************************************************
** 功能: 讀取光照度
** 參數: 無參數
** 返回值: data:返回光照度值
****************************************************************/
unsigned int data;
unsigned int return_gz(void)
{
return data;
}
unsigned int Read_gz(void)
{
static float temp;
static char ifg=0;
int dis_data;
switch(ifg)
{
case 0:
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
// delay_ms(200); //延時200ms
ifg++;
return 20;//200ms在執行讀取數據
case 1:
Multiple_Read_BH1750(); //連續讀出數據,存儲在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成數據,即光照數據
temp=(float)dis_data/1.2;
data=(int)temp;
ifg=0;
break;
}
return 100;
}
/***************************************************************
** 功能: 讀取光照度
** 參數: 無參數
** 返回值: data:返回光照度值
****************************************************************/
unsigned int Dispose(void)
{
static float temp_a;
unsigned int data_a;
int dis_data1 ;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_ms(200); //延時200ms
Multiple_Read_BH1750(); //連續讀出數據,存儲在BUF中
delay_ms(150);
dis_data1=BUF[0];
dis_data1=(dis_data1<<8)+BUF[1];//合成數據,即光照數據
temp_a=(float)dis_data1/1.2;
data_a=(int)temp_a;
return data_a;
}
復制代碼
作者:
admin
時間:
2019-4-15 13:50
本帖需要重新編輯補全頭文件 電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1