将BH1750与51单片机连接测量亮度并显示在LCD1602上 的代码
时间: 2024-04-07 17:33:14 浏览: 306
BH1750数字光强度测试仪设计LCD1602显示51单片机C语言程序完整版.doc
以下是将BH1750光照强度传感器与51单片机连接,测量亮度并显示在LCD1602上的示例代码:
```c
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_EN P2_2
#define LCD_DATAPINS P0
#define BH1750_ADDR 0x23 // BH1750器件地址
sbit SDA = P1^1; // I2C总线的数据引脚
sbit SCL = P1^0; // I2C总线的时钟引脚
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1000; j++);
}
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_WriteByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
SDA = (dat & 0x80) >> 7;
dat <<= 1;
SCL = 1;
_nop_();
_nop_();
SCL = 0;
_nop_();
_nop_();
}
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SCL = 0;
}
unsigned char I2C_ReadByte() {
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++) {
SCL = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
dat <<= 1;
dat |= SDA;
}
SCL = 0;
SDA = 1;
return dat;
}
void BH1750_Init() {
I2C_Start();
I2C_WriteByte(BH1750_ADDR << 1); // 发送器件地址
I2C_WriteByte(0x10); // 初始化命令
I2C_Stop();
}
unsigned int BH1750_ReadData() {
unsigned int data;
I2C_Start();
I2C_WriteByte((BH1750_ADDR << 1) | 0x01); // 发送器件地址,并设置为读模式
data = I2C_ReadByte() << 8; // 读取高字节
data |= I2C_ReadByte(); // 读取低字节
I2C_Stop();
return data;
}
void LCD_WriteCmd(unsigned char cmd) {
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATAPINS = cmd;
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_WriteData(unsigned char dat) {
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATAPINS = dat;
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_Init() {
delay(100);
LCD_WriteCmd(0x38); // 设置16x2显示,5x7点阵,8位数据接口
delay(5);
LCD_WriteCmd(0x0C); // 开显示,光标不显示
delay(5);
LCD_WriteCmd(0x06); // 光标右移,字符不移动
delay(5);
LCD_WriteCmd(0x01); // 清除显示
delay(5);
}
void LCD_SetCursor(unsigned char row, unsigned char col) {
unsigned char addr;
if (row == 0)
addr = 0x80 + col;
else
addr = 0xC0 + col;
LCD_WriteCmd(addr);
}
void LCD_WriteString(const char *str) {
while (*str != '\0') {
LCD_WriteData(*str);
str++;
}
}
void main() {
unsigned int brightness;
char str[16];
BH1750_Init();
LCD_Init();
LCD_SetCursor(0, 0);
LCD_WriteString("Light Intensity:");
while (1) {
brightness = BH1750_ReadData();
sprintf(str, "%04d lx", brightness);
LCD_SetCursor(1, 0);
LCD_WriteString(str);
delay(1000); // 延时1秒
}
}
```
以上代码中,使用了I2C总线通信协议来连接BH1750光照强度传感器和51单片机。通过BH1750_Init()函数初始化传感器,然后使用BH1750_ReadData()函数读取亮度值。读取到的亮度值通过LCD_WriteString()函数显示在LCD1602上。
需要注意的是,具体的硬件连接及LCD1602的驱动方式可能会有所不同,你需要根据自己的硬件情况进行适当的修改。
阅读全文