BH1750连接51单片机测量光照强度显示在LCD1602 代码
时间: 2023-10-22 13:05:09 浏览: 253
以下是一个示例代码,演示如何在51单片机上使用BH1750光照强度传感器并将测量结果显示在LCD1602上:
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_EN P2_2
#define LCD_DATA P1
sbit SDA = P1^0;
sbit SCL = P1^1;
// LCD相关函数
void LCD_Init();
void LCD_Cmd(unsigned char command);
void LCD_Data(unsigned char data);
void LCD_String(char *string);
void LCD_Clear();
// I2C总线相关函数
void I2C_Start();
void I2C_Stop();
void I2C_SendByte(unsigned char byte);
unsigned char I2C_ReadByte();
// BH1750传感器相关函数
void BH1750_Init();
unsigned int BH1750_Read();
void main()
{
unsigned int lightIntensity;
char buffer[16];
LCD_Init();
BH1750_Init();
while (1)
{
lightIntensity = BH1750_Read();
LCD_Clear();
sprintf(buffer, "Light: %4d lx", lightIntensity);
LCD_String(buffer);
// 延时一段时间后再次测量
for (int i = 0; i < 50000; i++);
}
}
void LCD_Init()
{
LCD_Cmd(0x38); // 8位数据线,2行显示,5x7点阵字符
LCD_Cmd(0x0C); // 打开显示,光标关闭
LCD_Cmd(0x06); // 光标右移
LCD_Cmd(0x01); // 清屏
}
void LCD_Cmd(unsigned char command)
{
LCD_RS = 0; // RS为0,选择命令寄存器
LCD_RW = 0; // RW为0,选择写入模式
LCD_DATA = command;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
_nop_();
_nop_();
}
void LCD_Data(unsigned char data)
{
LCD_RS = 1; // RS为1,选择数据寄存器
LCD_RW = 0; // RW为0,选择写入模式
LCD_DATA = data;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
_nop_();
_nop_();
}
void LCD_String(char *string)
{
while (*string)
{
LCD_Data(*string++);
}
}
void LCD_Clear()
{
LCD_Cmd(0x01); // 清屏
}
void I2C_Start()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
SCL = 0;
}
void I2C_Stop()
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
}
void I2C_SendByte(unsigned char byte)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = (byte & 0x80) >> 7;
byte <<= 1;
SCL = 1;
_nop_();
_nop_();
SCL = 0;
}
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SCL = 0;
}
unsigned char I2C_ReadByte()
{
unsigned char i, byte = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
byte <<= 1;
SCL = 1;
_nop_();
_nop_();
byte |= SDA;
SCL = 0;
}
return byte;
}
void BH1750_Init()
{
I2C_Start();
I2C_SendByte(0x46); // 发送写入地址
I2C_Stop();
I2C_Start();
I2C_SendByte(0x40); // 发送写入命令
I2C_Stop();
}
unsigned int BH1750_Read()
{
unsigned int lightIntensity = 0;
I2C_Start();
I2C_SendByte(0x46); // 发送写入地址
I2C_Stop();
I2C_Start();
I2C_SendByte(0x47); // 发送读取地址
lightIntensity = (I2C_ReadByte() << 8) | I2C_ReadByte(); // 高8位在前,低8位在后
I2C_Stop();
return lightIntensity;
}
```
请注意,以上代码仅供参考,具体的连接和配置可能会根据您的硬件和编程环境而有所不同。在使用之前,请确保您已正确连接硬件,并根据需要进行相应的修改和调整。
阅读全文