51单片机驱动BH1750FVI光照LCD液晶显示

发布者:科技独行者最新更新时间:2015-04-29 来源: 51hei关键字:51单片机  BH1750FVI  LCD液晶显示 手机看文章 扫描二维码
随时随地手机看文章
BH1750FVI是基于IIC协议的器件,单片机是STC89C52,晶振是11.0592MHZ,显示部分是LCD1602液晶屏,不同的工作环境,需要调整此函数,当改用1T的MCU时,请调整此延时函数。程序都是详细注释,大家有福了!

#include   
#include      //Keil library 
#include     //Keil library 
#include 
#define   uchar unsigned char
#define   uint unsigned int 
#define   DataPort P0  //LCD1602数据端口
sbit   SCL=P2^0;      //IIC时钟引脚定义
sbit     SDA=P2^1;      //IIC数据引脚定义
sbit      LCM_RS=P1^0;   //LCD1602命令端口  
sbit      LCM_RW=P1^1;   //LCD1602命令端口  
sbit      LCM_EN=P1^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 {   
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);  
}      
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
}
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();                 //延时
}[page]

/**************************************
接收应答信号
**************************************/
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;
}

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

void Single_Write_BH1750(uchar REG_Address)
{
    BH1750_Start();                  //起始信号
    BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
    BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  //  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
    BH1750_Stop();                   //发送停止信号
}

//********单字节读取*****************************************
/*
uchar Single_Read_BH1750(uchar REG_Address)
{  uchar REG_data;
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号
    BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始 
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    REG_data=BH1750_RecvByte();              //读出寄存器数据
 BH1750_SendACK(1);  
 BH1750_Stop();                           //停止信号
    return REG_data;
}
*/
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read_BH1750(void)
{   uchar i; 
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
 
  for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
        if (i == 3)
        {

           BH1750_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {  
          BH1750_SendACK(0);                //回应ACK
       }
   }

    BH1750_Stop();                          //停止信号
    Delay5ms();
}


//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
   Single_Write_BH1750(0x01);

}
//*********************************************************
//主程序********
//*********************************************************
void main()

   float temp;
   delay_nms(200);     //延时200ms 
   InitLcd();           //初始化LCD
   Init_BH1750();       //初始化BH1750
 
  while(1)              //循环
  {

    Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode

     delay_nms(180);              //延时180ms

    Multiple_Read_BH1750();       //连续读出数据,存储在BUF中

    dis_data=BUF[0];
    dis_data=(dis_data<<8)+BUF[1];//合成数据
   
    temp=(float)dis_data/1.2;

    conversion(temp);         //计算数据和显示
 DisplayOneChar(0,0,'L');
 DisplayOneChar(1,0,'i');
 DisplayOneChar(2,0,'g');
 DisplayOneChar(3,0,'h');
 DisplayOneChar(4,0,'t');
    DisplayOneChar(5,0,':');

    DisplayOneChar(7,0,wan); //显示数据
    DisplayOneChar(8,0,qian); 
    DisplayOneChar(9,0,bai);
    DisplayOneChar(10,0,shi);
 DisplayOneChar(11,0,ge);

 DisplayOneChar(13,0,'l'); ////显示数单位
 DisplayOneChar(14,0,'x');            
  }
}

关键字:51单片机  BH1750FVI  LCD液晶显示 引用地址:51单片机驱动BH1750FVI光照LCD液晶显示

上一篇:交流稳压电源模拟采样stc单片机程序
下一篇:一种单片机独立按键检测思路

推荐阅读最新更新时间:2024-03-16 14:00

51单片机复习程序例举001
1、点亮闪烁的LED灯。 #include reg52.h sbit LED00=P0^0; //位定义,定义单片机引脚 void delay(int t) { int i , j ; for(i = 0 ; i 100*t ; i++) { for(j = 0 ; j 125 ; j++) { ; } } } void main(void) { while(1) { LED00 = 0 ; //此开发板是低电平点亮 delay(5) ; LE
[单片机]
51单片机存储器结构介绍(2)
数据存储器 数据存储器也称为随机存取数据存储器。数据存储器分为内部数据存储和外部数据存储。MCS-51内部RAM有128或256个字节的用户数据存储(不同的型号有分别),片外最多可扩展64KB的RAM,构成两个地址空间,访问片内RAM用 MOV 指令,访问片外RAM用 MOVX 指令。它们是用于存放执行的中间结果和过程数据的。MCS-51的数据存储器均可读写,部分单元还可以位寻址。 MCS-51单片机的内部数据存储器在物理上和逻辑上都分为两个地址空间,即: 数据存储器空间(低128单元); 特殊功能寄存器空间(高128单元); 这两个空间是相连的,从用户角度而言,低128单元才是真正的数据存储器。下面我们就来详细的与
[单片机]
<font color='red'>51单片机</font>存储器结构介绍(2)
51单片机心形流水灯源程序
用stc89c51单片机做的心形流水灯效果非常棒,下面是实物图: 背面: 原理图我就不画了4个p口全部接上led灯即可,下面是控制程序: #include at89x52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar code table0 ={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//P0-P7依次点亮 uchar code table1 ={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//P0-P7依次熄灭 uch
[单片机]
<font color='red'>51单片机</font>心形流水灯源程序
开发51单片机操作系统注意事项
51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。 1 开发平台的选择和论证 开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。 在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。 首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。这
[单片机]
开发<font color='red'>51单片机</font>操作系统注意事项
51单片机中断设置
外部中断系统框图: 这些中断请求源的中断请求标志位分别有特殊功能寄存器TCON和SCON的响应位锁存 1、TCON寄存器 与中断有关的是低四位。 1)IT0和 IT1——外中断请求触发标志位: 0——为低电平触发; 1——为下降沿触发 可由软件置位和清除 2)IE0 和 IE1——外部中断请求标志位 1——表示有中断请求,CPU要响应中断请求,跳向中断服务程序,按优先级处理中断程序,跳入中断服务程序时,由硬件清0; 0——表示没有中断请求。 复位值TCON都为0。 SCON为串口控制寄存器,详见串口。 2、中断允许寄存器IE,可以位寻址,复位为0: 各位为1时允许相应位的中断,为0时禁止响
[单片机]
51单片机学习笔记7 -- 超声波测距
1.超声波 蝙蝠和某些海洋动物都能够利用高频率的声音进行回声定位或信息交流。它们能通过口腔或鼻腔把从喉部产生的超声波发射出去,利用折回的声波来定向,并判定附近物体的位置、大小以及是否在移动。超声波是一种频率高于20000赫兹的声波,它的方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远,可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大于人的听觉上限而得名。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹(Hz)。我们人类耳朵能听到的声波频率为20Hz-20000Hz。因此,我们把频率高于20000赫兹的声波称为“超声波”。通常用于医学诊断的超声波频率为1
[单片机]
<font color='red'>51单片机</font>学习笔记7 -- 超声波测距
基于51单片机的音量控制电路与程序设计
1 引言 本文介绍的音量控制IC为M62429,市面上有很多类似的产品,例如:FM62429、CD62429、CSC62429等。其实,掌握了一两种IC的编程方法,稍作改动就很容易移植到其它产品上。M62429是日本三菱公司的音量控制IC,音量调节范围是0~-83dB,控制精度每步1dB,内部电路如图一(详见M62429的使用手册)。 图一 M62429内部电路 2 硬件电路 根据图一而设计的电路如图二。 图二中已省略了单片机与功放连接的其他电路,只剩下AT89C52的晶振部分、与M62429相关的电路、控制音量必需的按键电路等,加上电源之后,该电路可以独立工作。由于AT89C52真正的串口已用于其他用途,
[单片机]
基于<font color='red'>51单片机</font>的音量控制电路与程序设计
基于51单片机的调光控制器设计
1 调光控制器设计 在日常生活中,我们常常需要对灯光的亮度进行调节。本调光控制器通过单片机控制双向可控硅的导通来实现白炽灯(纯阻负载)亮度的调整。双向可控硅的特点是导通后即使触发信号去掉,它仍将保持导通;当负载电流为零(交流电压过零点)时,它会自动关断。所以需要在交流电的每个半波期间都要送出触发信号,触发信号的送出时间就决定了灯泡的亮度。 调光的实现方式就是在过零点后一段时间才触发双向可控硅开关导通,这段时间越长,可控硅导通的时间越短,灯的亮度就越低;反之,灯就越亮。 这就要求要提取出交流电压的过零点,并以此为基础,确定触发信号的送出时间,达到调光的目的。 1.1 硬件部分 本调光控制器的框图如下:
[单片机]
基于<font color='red'>51单片机</font>的调光控制器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved