基于stm32mini實現(xiàn)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);// 設置中斷優(yōu)先級分組2
- delay_init(); //延時函數(shù)初始化
- uart_init(9600); //串口初始化為9600
- LED_Init(); //初始化與LED連接的硬件接口
- Init_BH1750(); //初始化BH1750
- LCD_Init(); //初始化LED
- LCD_Clear(WHITE); //清屏
-
- while(1)
- {
- // light=read_BH1750(); //讀取BH1750的光強數(shù)據(jù)
- 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]; //接收數(shù)據(jù)緩存區(qū)
- int mcy; //進位標志
- /***開始信號***/
- void BH1750_Start()
- {
- SDA=1; //拉高數(shù)據(jù)線
- SCL=1; //拉高時鐘線
- delay_us(5); //延時
- GPIO_ResetBits(bh1750_PORT, sda); //產(chǎn)生下降沿
- delay_us(5); //延時
- GPIO_ResetBits(bh1750_PORT, scl); //拉低時鐘線
- }
- /*****停止信號******/
- void BH1750_Stop()
- {
- SDA=0; //拉低數(shù)據(jù)線
- SCL=1; //拉高時鐘線
- delay_us(5); //延時
- GPIO_SetBits(bh1750_PORT, sda); //產(chǎn)生上升沿
- delay_us(5); //延時
- }
- /**************************************
- 發(fā)送應答信號
- 入口參數(shù):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; /*這里一定要設成輸入上拉,否則不能讀出數(shù)據(jù)*/
- 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總線發(fā)送一個字節(jié)數(shù)據(jù)
- **************************************/
- void BH1750_SendByte(uchar dat)
- {
- uchar i;
- for (i=0; i<8; i++) //8位計數(shù)器
- {
- 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; /*這里一定要設成輸入上拉,否則不能讀出數(shù)據(jù)*/
- GPIO_InitStruct.GPIO_Pin = sda;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(bh1750_PORT,&GPIO_InitStruct );
-
- GPIO_SetBits(bh1750_PORT,sda); //使能內部上拉,準備讀取數(shù)據(jù),
- for (i=0; i<8; i++) //8位計數(shù)器
- {
- dat <<= 1;
- SCL=1; //拉高時鐘線
- delay_us(5); //延時
-
- if( SET == GPIO_ReadInputDataBit(bh1750_PORT,sda))
- bit = 0X01;
- else
- bit = 0x00;
- dat |= bit; //讀數(shù)據(jù)
- 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); //發(fā)送設備地址+寫信號
- BH1750_SendByte(REG_Address); //內部寄存器地址,請參考中文pdf22頁
- // BH1750_SendByte(REG_data); //內部寄存器數(shù)據(jù),請參考中文pdf22頁
- BH1750_Stop(); //發(fā)送停止信號
- }
- //初始化BH1750,根據(jù)需要請參考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
- }
- //連續(xù)讀出BH1750內部數(shù)據(jù)
- void mread(void)
- {
- uchar i;
- BH1750_Start(); //起始信號
- BH1750_SendByte(SlaveAddress+1); //發(fā)送設備地址+讀信號
-
- for (i=0; i<3; i++) //連續(xù)讀取6個地址數(shù)據(jù),存儲中BUF
- {
- BUF[i] = BH1750_RecvByte(); //BUF[0]存儲0x32地址中的數(shù)據(jù)
- if (i == 3)
- {
- BH1750_SendACK(1); //最后一個數(shù)據(jù)需要回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(); //連續(xù)讀出數(shù)據(jù),存儲在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1]; //合成數(shù)據(jù)
- 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總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
- //ALT ADDRESS引腳接地時地址為0x46,接電源時地址為0xB8
-
- extern uchar BUF[8]; //接收數(shù)據(jù)緩存區(qū)
- extern int dis_data; //變量
- extern int mcy; //表示進位標志位
- void Init_BH1750(void);
- void conversion(uint temp_data);
- void Single_Write_BH1750(uchar REG_Address);//單個寫入數(shù)據(jù)
- uchar Single_Read_BH1750(uchar REG_Address); //單個讀取內部寄存器數(shù)據(jù)
- void mread(void); //連續(xù)的讀取內部寄存器數(shù)據(jù)
- void read_BH1750(void);
- #endif
復制代碼
全部程序51hei下載地址:
bh1750程序.7z
(262.93 KB, 下載次數(shù): 68)
2020-5-27 14:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|