GY_30.c
GY_30.c
如下:
#include "sys.h"
#include "GY_30.h"
#include "delay.h"
#include "myiic.h"
BYTE BUF[8]; /* 接收数据缓存区 */
void BH1750_Start ( void ) {
/* 光照传感器起始信号 */
IIC_Start();
}
void BH1750_Stop ( void ) {
/* 光照传感器停止信号 */
IIC_Stop();
}
void BH1750_SendACK ( BYTE ack ) {
/* 发送应答信号。参数ack为0是ACK,为1是NAK */
if ( ack == 0 ) {
IIC_Ack();
} else {
IIC_NAck();
}
}
BYTE BH1750_RecvACK ( void ) {
/* 接收应答信号 */
return IIC_Wait_Ack();
}
void BH1750_SendByte ( BYTE dat ) {
/* 向IIC总线发送一个字节数据 */
IIC_Send_Byte ( dat );
BH1750_RecvACK();
}
BYTE BH1750_RecvByte ( void ) {
/* 从IIC总线接收一个字节数据 */
return IIC_Read_Byte ( 0 );
}
void Single_Write_BH1750 ( uchar REG_Address ) {
BH1750_Start(); /* 起始信号 */
BH1750_SendByte ( SlaveAddress ); /* 发送设备地址 + 写信号 */
BH1750_SendByte ( REG_Address ); /* 内部寄存器地址 */
BH1750_Stop(); /* 发送停止信号 */
}
void Init_BH1750 ( void ) {
/* BH1750初始化函数 */
IIC_Init();
delay_ms ( 50 );
Single_Write_BH1750 ( 0x01 );
}
void Multiple_read_BH1750 ( void ) {
/* 连续读出BH1750内部数据 */
uchar 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 ( 5 );
}
GY_30.h
GY_30.h
如下:
#ifndef _GY_30_H_
#define _GY_30_H_
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
typedef unsigned short WORD;
#define SlaveAddress 0x46
void BH1750_Start ( void );
void BH1750_Stop ( void );
void BH1750_SendACK ( BYTE ack );
BYTE BH1750_RecvACK ( void );
void BH1750_SendByte ( BYTE dat );
BYTE BH1750_RecvByte ( void );
void Single_Write_BH1750 ( uchar REG_Address );
void Init_BH1750 ( void );
void Multiple_read_BH1750 ( void );
#endif
myiic.c
myiic.c
如下:
#include "myiic.h"
#include "delay.h"
void IIC_Init ( void ) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOC, &GPIO_InitStructure );
IIC_SCL = 1;
IIC_SDA = 1;
}
void IIC_Start ( void ) {
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us ( 4 );
IIC_SDA = 0;
delay_us ( 4 );
IIC_SCL = 0;
}
void IIC_Stop ( void ) {
SDA_OUT();
IIC_SCL = 0;
IIC_SDA = 0;
delay_us ( 4 );
IIC_SCL = 1;
IIC_SDA = 1;
delay_us ( 4 );
}
u8 IIC_Wait_Ack ( void ) {
u8 ucErrTime = 0;
SDA_IN();
IIC_SDA = 1;
delay_us ( 1 );
IIC_SCL = 1;
delay_us ( 1 );
while ( READ_SDA ) {
ucErrTime++;
if ( ucErrTime > 250 ) {
IIC_Stop();
return 1;
}
}
IIC_SCL = 0;
return 0;
}
void IIC_Ack ( void ) {
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 0;
delay_us ( 2 );
IIC_SCL = 1;
delay_us ( 2 );
IIC_SCL = 0;
}
void IIC_NAck ( void ) {
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 1;
delay_us ( 2 );
IIC_SCL = 1;
delay_us ( 2 );
IIC_SCL = 0;
}
void IIC_Send_Byte ( u8 txd ) {
u8 t;
SDA_OUT();
IIC_SCL = 0;
for ( t = 0; t < 8; t++ ) {
IIC_SDA = ( txd & 0x80 ) >> 7;
txd <<= 1;
delay_us ( 2 );
IIC_SCL = 1;
delay_us ( 2 );
IIC_SCL = 0;
delay_us ( 2 );
}
}
u8 IIC_Read_Byte ( unsigned char ack ) {
unsigned char i, receive = 0;
SDA_IN();
for ( i = 0; i < 8; i++ ) {
IIC_SCL = 0;
delay_us ( 2 );
IIC_SCL = 1;
receive <<= 1;
if ( READ_SDA ) {
receive++;
}
delay_us ( 1 );
}
return receive;
}
myiic.h
myiic.h
如下:
#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
#define SDA_IN() {
GPIOC->CRL &= 0XFFF0FFFF; GPIOC->CRL |= 8 << (4*4);}
#define SDA_OUT() {
GPIOC->CRL &= 0XFFF0FFFF; GPIOC->CRL |= 3 << (4*4);}
#define IIC_SCL PCout(3)
#define IIC_SDA PCout(4)
#define READ_SDA PCin(4)
void IIC_Init ( void );
void IIC_Start ( void );
void IIC_Stop ( void );
void IIC_Send_Byte ( u8 txd );
u8 IIC_Read_Byte ( unsigned char ack );
u8 IIC_Wait_Ack ( void );
void IIC_Ack ( void );
void IIC_NAck ( void );
void IIC_Write_One_Byte ( u8 daddr, u8 addr, u8 data );
u8 IIC_Read_One_Byte ( u8 daddr, u8 addr );
#endif
main.c
main.c
如下:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "GY_30.h"
#include "string.h"
#include "stdio.h"
extern BYTE BUF[];
int main ( void ) {
float temp = 0.0f; /* 要显示的数值 */
unsigned int dis_data = 0; /* 从传感器中读取的数据 */
char show_buf[30] = {
0}; /* 数据发送缓冲区 */
SystemInit();
delay_init ( 72 );
NVIC_Configuration();
uart_init ( 9600 );
Init_BH1750();
while ( 1 ) {
Single_Write_BH1750 ( 0x01 ); /* power on */
Single_Write_BH1750 ( 0x10 ); /* H-resolution mode */
delay_ms ( 180 ); /* 延时180ms */
Multiple_read_BH1750(); /* 连续读出数据,存储在BUF中 */
dis_data = BUF[0];
dis_data = ( dis_data << 8 ) + BUF[1]; /* 合成数据,即光照数据 */
temp = ( float ) dis_data / 1.2;
sprintf ( show_buf, "Light is %d LX\r\n", ( int ) temp );
printf ( "%s", show_buf );
memset ( show_buf, 0, sizeof ( show_buf ) );
delay_ms ( 500 );
}
}