找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7350|回复: 9
打印 上一主题 下一主题
收起左侧

基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例

  [复制链接]
跳转到指定楼层
楼主
       基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器、51单片机最小系统、1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的。100%可用。是GY-30数字光照传感器运用一个比较好的实例。







基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序

#include  <REG51.H>        
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library        
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int        
#define   DataPort P0         //LCD1602数据端口
sbit          SCL=P1^0;      //IIC时钟引脚定义
sbit            SDA=P1^1;      //IIC数据引脚定义
sbit      LCM_RS=P2^0;   //LCD1602命令端口               
sbit      LCM_RW=P2^1;   //LCD1602命令端口               
sbit      LCM_EN=P2^2;   //LCD1602命令端口

#define          SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef   unsigned char BYTE;
typedef   unsigned short WORD;

BYTE    BUF[8];                         //接收数据缓存区              
uchar   ge,shi,bai,qian,wan;            //显示变量
int     dis_data;                       //变量

void delay_nms(unsigned int k);
void InitLcd();
void Init_BH1750(void);

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);

void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start();                    //起始信号
void BH1750_Stop();                     //停止信号
void BH1750_SendACK(bit ack);           //应答ACK
bit  BH1750_RecvACK();                  //读ack
void BH1750_SendByte(BYTE dat);         //IIC单个字节写
BYTE BH1750_RecvByte();                 //IIC单个字节读

//-----------------------------------

//*********************************************************
void conversion(uint temp_data)  //  数据转换出 个,十,百,千,万
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余运算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余运算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余运算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余运算
    ge=temp_data+0x30;         
}

//毫秒延时**************************
void delay_nms(unsigned int k)        
{                                                
unsigned int i,j;                                
for(i=0;i<k;i++)
{                        
for(j=0;j<121;j++)                        
{;}}                                                
}

/*******************************/
void WaitForEnable(void)        
{                                       
DataPort=0xff;               
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);        
LCM_EN=0;                                
}                                       
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
if(Attribc)WaitForEnable();        
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();        
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       
/*******************************/
void WriteDataLCM(uchar dataW)
{                                       
WaitForEnable();               
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();        
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               
/***********************************/
void InitLcd()                                
{                        
WriteCommandLCM(0x38,1);        
WriteCommandLCM(0x08,1);        
WriteCommandLCM(0x01,1);        
WriteCommandLCM(0x06,1);        
WriteCommandLCM(0x0c,1);
}                        
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                                
Y&=1;                                                
X&=15;                                                
if(Y)X|=0x40;                                       
X|=0x80;                        
WriteCommandLCM(X,0);               
WriteDataLCM(DData);               
}                                                

/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}

/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信号
**************************************/
void BH1750_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}

/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    BH1750_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}

//*********************************

.....................................................................................................由于程序较长,需要的请自行下载附件。

全部资料51hei下载地址:
基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例.rar (111.51 KB, 下载次数: 259)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:150257 发表于 2019-6-6 19:38 | 只看该作者
学到了
回复

使用道具 举报

板凳
ID:595457 发表于 2019-8-5 11:49 | 只看该作者
您好,请问不能完全显示是什么原因呢?我的显示屏上只显示LI
回复

使用道具 举报

地板
ID:34643 发表于 2019-8-10 22:15 | 只看该作者
leego 发表于 2019-8-5 11:49
您好,请问不能完全显示是什么原因呢?我的显示屏上只显示LI

检查一下传感器做对没有?
回复

使用道具 举报

5#
ID:613975 发表于 2019-9-20 11:36 来自手机 | 只看该作者
AT89C52可以替换51的不?
回复

使用道具 举报

6#
ID:613975 发表于 2019-9-20 11:44 来自手机 | 只看该作者
可以用单片机AT89C52替换51单片机吗?
回复

使用道具 举报

7#
ID:627258 发表于 2019-10-21 10:58 来自手机 | 只看该作者
用bh1750 和bh1750 fvi 一样吗
回复

使用道具 举报

8#
ID:627258 发表于 2019-10-21 15:00 来自手机 | 只看该作者
12c5a60s2 的单片机可以用吗,还有我是gy302,显示屏是1602a 的,我用了你的程序没有出来,不知道是那部分的原因
回复

使用道具 举报

9#
ID:627258 发表于 2019-10-21 16:11 来自手机 | 只看该作者
我线接错了,但是接完之后只有个light 000001x
回复

使用道具 举报

10#
ID:690525 发表于 2020-6-20 15:44 | 只看该作者
你好 为什么我下载完程序 一会有用一会没用,就是上电后几次都有用 再上电几次又没反应了也没显示,然后再反复上电几次或十几次又有用了 这是怎么回事 求教@=@
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表