久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
STM32 BH1750光線感應(yīng)源程序
[打印本頁]
作者:
對點天空
時間:
2018-6-5 13:46
標(biāo)題:
STM32 BH1750光線感應(yīng)源程序
基于BH1750模塊實現(xiàn)的光強(qiáng)度檢測,使用的是STM32F103C8T6
單片機(jī)源程序如下:
#include "bh1750.h"
#include "delay.h"
#include "timer.h"
u8 BUF[8];
u16 temp2=0;
float lux=0;
void bh1750_iic_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6); //PB6,PB7 輸出高
}
/****向BH1750單次寫命令****/
void Single_Write_bh1750(unsigned char Reg_Address)
{
bh1750_iic_start();
bh1750_send_byte(0x46); //發(fā)送器件地址0100 0110 最后一位0,表示寫
//IIC_Wait_Ack();
bh1750_send_byte(Reg_Address);
//IIC_Wait_Ack();
bh1750_iic_stop();
}
/****BH1750初始化****/
void bh1750_Init(void)
{
char dir=0;
unsigned char value=0;
TIM3_PWM_Init(899,0);
bh1750_iic_init();
TIM_SetCompare3(TIM3,0);
while(1)
{
Single_Write_bh1750(0x01);
Single_Write_bh1750(0x10);
delay_ms(200);
bh1750_ReadContinuous1();
temp2=BUF[0];
temp2=(temp2<<8)+BUF[1];
lux=(float)temp2/1.2; //lux是float型
if((lux>0)&&(lux<50))
value=10;
else if(lux<75)
value=20;
else if(lux<100)
value=40;
else if(lux<125)
value=50;
else if(lux<150)
value=60;
else if(lux<175)
value=70;
else if(lux<200)
value=80;
else if(lux<250)
value=90;
else if(lux<280)
value=110;
else if(lux<300)
value=120;
else if(lux<320)
value=130;
else if(lux<340)
value=140;
else if(lux<360)
value=150;
else if(lux<380)
value=160;
else if(lux<400)
value=170;
else if(lux<410)
value=180;
else if(lux<450)
value=190;
else if(lux<800)
value=240;
printf("光照強(qiáng)度:%f value:%d\r\n",lux,value);
TIM_SetCompare3(TIM3,value);
//delay_ms(1000);
}
}
/****從BH1750單次讀Lux****/
/****
模式選擇:H-Resolution Mode,分辨率1lux
單次讀Opecode:0010 0000 ,即0x20
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadOneTime(void)
{
bh1750_iic_start();
bh1750_send_byte(0x46); //發(fā)送器件地址0100 0110 最后一位0,表示寫
bh1750_recv_ack();
bh1750_send_byte(0x20); //發(fā)送One time H-Resolution Mode的Opecode 0010 0000,分辨率為1lux
bh1750_recv_ack();
bh1750_iic_stop();
delay_ms(200);
bh1750_iic_start();
bh1750_send_byte(0x47); //
bh1750_recv_ack();
BUF[0]=bh1750_recv_byte(1);
//IIC_Ack(); //主機(jī)應(yīng)答
//temp1=temp<<8;
BUF[1]=bh1750_recv_byte(0);
//IIC_NAck(); //主機(jī)不應(yīng)答
bh1750_iic_stop();
// temp2=BUF[0];
// temp2=(temp2<<8)+BUF[1];
// lux=(float)temp2/1.2; //lux是float型
//return lux;
//delay_ms(200);
}
/****從BH1750連續(xù)讀Lux****/
/****
模式選擇:H-Resolution Mode,分辨率1lux
連續(xù)讀Opecode:0001 0000
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadContinuous1(void)
{
// u16 temp=0,temp1=0;
bh1750_iic_start();
bh1750_send_byte(0x46); //發(fā)送器件地址0100 0110 最后一位0,表示寫
bh1750_recv_ack();
bh1750_send_byte(0x10); //發(fā)送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率為1lux
bh1750_recv_ack();
bh1750_iic_stop();
delay_ms(200);
bh1750_iic_start();
bh1750_send_byte(0x47);
bh1750_recv_ack();
BUF[0]=bh1750_recv_byte(1);
BUF[1]=bh1750_recv_byte(0);
//temp=bh1750_recv_byte(1);
//temp1=bh1750_recv_byte(0);
bh1750_iic_stop();
//temp2=temp1+(temp<<8);
//lux=(float)temp2/1.2; //lux是float型
}
void Conversion(void)
{
temp2=BUF[0];
temp2=(temp2<<8)+BUF[1];
lux=(float)temp2/1.2; //lux是float型
}
/**************************************
起始信號
**************************************/
void bh1750_iic_start(void)
{
BH1750_SDA_OUT() //設(shè)置SDA線為輸出
//在開始數(shù)據(jù)傳輸前,先讓SDA和SCL都拉高
BH1750_IIC_SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號,釋放總線
delay_us(2);
BH1750_IIC_SCL=1;
delay_us(5); //Tsu;STA:起始條件的建立時間大于4.7us。
BH1750_IIC_SDA=0; //SDA由高變?yōu)榈捅硎鹃_始信號
delay_us(4); //起始條件的保持時間大于4us
BH1750_IIC_SCL=0; //鉗住IIC總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
delay_us(2);
}
/**************************************
停止信號
**************************************/
void bh1750_iic_stop(void)
{
BH1750_SDA_OUT() //設(shè)置SDA線為輸出
//IIC_SCL=0; //此句是調(diào)試BH1750時加,2018.03.03
BH1750_IIC_SDA=0; //發(fā)送停止信號的數(shù)據(jù)信號
delay_us(2);
BH1750_IIC_SCL=1; //發(fā)送停止信號的時鐘信號
delay_us(5); //停止信號的建立時間大于4us
BH1750_IIC_SDA=1; //發(fā)送停止信號
delay_us(4); //;
}
/**************************************
發(fā)送應(yīng)答信號
入口參數(shù):ack (0:ACK 1:NAK)
**************************************/
void bh1750_send_ack(char ack)
{
BH1750_IIC_SCL=0;
BH1750_SDA_OUT();
BH1750_IIC_SDA=ack; //主器件應(yīng)答
delay_us(2);
BH1750_IIC_SCL=1;
delay_us(4); //SCL高電平周期大于4us
BH1750_IIC_SCL=0; //清時鐘線,鉗住IIC總線以便繼續(xù)接收
delay_us(2);
}
/**************************************
接收應(yīng)答信號
**************************************/
char bh1750_recv_ack(void)
{
u8 ucErrorTime=0;
BH1750_SDA_IN(); //SDA設(shè)置成輸入
BH1750_IIC_SDA=1;
delay_us(2);
BH1750_IIC_SCL=1;
delay_us(2);
while(BH1750_READ_SDA)
{
ucErrorTime++;
if(ucErrorTime>=250)
{
bh1750_iic_stop();
return 1;
}
}
BH1750_IIC_SCL=0;
return 0;
}
/**************************************
向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
**************************************/
void bh1750_send_byte(char dat)
{
u8 i;
BH1750_SDA_OUT();
for(i=0;i<8;i++)
{
if((dat<<i)&0x80) BH1750_IIC_SDA=1; //判斷發(fā)送位
else BH1750_IIC_SDA=0;
delay_us(2);
BH1750_IIC_SCL=1; //拉高SCL,通知被控器開始接收數(shù)據(jù)位
delay_us(4); //保證SCL高電平周期大于4us
BH1750_IIC_SCL=0; //拉低SCL,允許SDA傳輸下一位數(shù)據(jù)。因為只有在SCL=0時才允許SDA的狀態(tài)發(fā)生變化
delay_us(2);
}
//以下四句是調(diào)試BH1750時添加的,2018.03.03
//特別注意;用方法三時,以下四句不可去掉,去掉后得到的數(shù)有問題
//用方法二時,以下四句需注釋掉,否則也會有問題,至于原因暫時還不清楚。
// IIC_SDA=0;
// delay_us(2);
// IIC_SCL=1;
// delay_us(2);
BH1750_IIC_SCL=0; //拉低SCL,為下次數(shù)據(jù)傳輸做好準(zhǔn)備
delay_us(2);
}
/**************************************
從IIC總線接收一個字節(jié)數(shù)據(jù)
用來接收從器件傳來的數(shù)據(jù),ack為1時,發(fā)送Ack(產(chǎn)生應(yīng)答);ack為0時,發(fā)送NAck(不產(chǎn)生應(yīng)答)
**************************************/
char bh1750_recv_byte(unsigned char ack)
{
unsigned char i,receive=0;
BH1750_SDA_IN();
for(i=0;i<8;i++)
{
BH1750_IIC_SCL=0; //置SCL為低,準(zhǔn)備接收數(shù)據(jù)位
delay_us(5); //時鐘低電平周期大于4.7us
BH1750_IIC_SCL=1; //置SCL為高,使SDA上數(shù)據(jù)有效
delay_us(2);
receive=receive<<1;
if(BH1750_READ_SDA) receive=receive+1; //讀取SDA,把接收的數(shù)據(jù)位放入receve中,若此處寫成IIC_SDA==1,會失敗,思考原因?
delay_us(2);
}
if(!ack)
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
Keil代碼下載:
bh1750.rar
(275.76 KB, 下載次數(shù): 435)
2018-6-6 02:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
阿斯頓馬丁
時間:
2018-7-26 17:21
非常感謝
作者:
666o
時間:
2018-8-3 20:29
下載來學(xué)習(xí)學(xué)習(xí),感謝樓主
作者:
jach09
時間:
2018-11-17 14:31
感謝樓主,
非常感謝
作者:
18784506782
時間:
2019-3-12 23:23
jach09 發(fā)表于 2018-11-17 14:31
感謝樓主,
非常感謝
非常感謝,很好
作者:
hylinzhi
時間:
2019-3-13 09:20
非常感謝,太好了
作者:
asdfghhj
時間:
2019-3-30 20:46
學(xué)習(xí)學(xué)習(xí)
作者:
R...
時間:
2019-4-1 15:02
非常感謝
作者:
皮皮蝦皮
時間:
2019-10-26 10:31
編譯的時候出現(xiàn)問題,說無法打開.\core_cm3.o 這是什么問題呀,煩請樓主解答一下
作者:
btcypwz
時間:
2019-12-29 01:17
感謝樓主
作者:
HJWei
時間:
2020-3-16 19:46
我測試了一下不行,數(shù)據(jù)一致不更新
作者:
skywanggg
時間:
2020-6-6 12:33
感謝樓主
作者:
威龍1410
時間:
2020-7-11 23:40
測試通過,謝謝樓主!
作者:
淵魚()
時間:
2023-3-27 21:30
有大佬能根據(jù)樓主的資料畫個仿真圖嗎?
作者:
hezezeze
時間:
2023-4-18 13:31
求問 實物怎么連接
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美福利影院
|
欧美日韩一区二区三区
|
谁有毛片网址
|
亚洲第一色
|
欧美日韩国
|
国产精品一品二区三区的使用体验
|
黄色成人在线
|
成人免费在线播放
|
色婷婷狠狠
|
日韩中文字幕在线观看
|
国产精品国产成人国产三级
|
中文字幕在线观看不卡
|
日本欧美视频
|
91视频在线免费观看
|
久久黄网
|
国产精品一区二
|
一级国产片
|
黄色在线观看免费
|
久久精品视频免费看
|
超碰99在线
|
黄色片免费看
|
三级视频在线观看
|
成人午夜在线
|
成 人 黄 色 片 在线播放
|
国产一级片免费看
|
91免费版看片
|
一区二区三区免费
|
欧美一级在线观看
|
欧美极品在线
|
午夜天堂av
|
夜夜夜夜操
|
国产精品视频网站
|
一区二区不卡
|
午夜爱
|
超碰免费在线播放
|
91午夜精品亚洲一区二区三区
|
精品久久久久久久久久久
|
国产日韩综合
|
在线观看h片
|
欧美日韩色
|
日韩精品三级
|