飞行小丑 2023-03-18 16:21 采纳率: 50%
浏览 51

基于51单片机测试光照

基于51单片机以及光照传感器GY-30测量光照强度,并使用12864液晶屏显示的过程中,发现12864液晶屏上的光照强度变得十分大,并且会有负数出现,不清楚原因,想咨询一下是为什么会产生这种情况,测出的数据都已经超过6位数了,而且拿光照的时候数值会往上增加,但是拿开光的时候,数值还会增加或者不产生变化。
以下是代码:

#include  <reg52.h>    
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library    
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int    
#define   LCD1602_DB P0     //LCD1602Êý¾Ý¶Ë¿Ú
sbit        SCL=P3^7;      //IICʱÖÓÒý½Å¶¨Òå
sbit        SDA=P3^6;      //IICÊý¾ÝÒý½Å¶¨Òå

#define      SlaveAddress   0x46 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT  ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä
                              //ALT  ADDRESSÒý½Å½ÓµØʱµØַΪ0x46£¬½ÓµçԴʱµØַΪ0xB8
typedef   unsigned char BYTE;
typedef   unsigned short WORD;

BYTE    BUF[8];                         //½ÓÊÕÊý¾Ý»º´æÇø          
unsigned char ge,shi,bai,qian,wan;            //ÏÔʾ±äÁ¿
int     dis_data;                       //±äÁ¿

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

void LcdDat(unsigned char dat);                      //1602Òº¾§ÆÁдÈëÊý¾Ý
void LcdCmd(unsigned char cmd);                      //дÈëÃüÁî
void LcdPos(unsigned char x, unsigned char y);      //ÊäÈëµØÖ·
void LcdShow(unsigned char x, unsigned char y, unsigned char *str);   //Êä³öÊý¾Ý
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++)            
{;}}                        
}

/*
ÑÓʱ5΢Ãë
²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý£¬×¢ÒâʱÖÓ¹ý¿ìʱÐèÒªÐÞ¸Ä
µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý
*/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
}

/*
ÑÓʱ5ºÁÃë
²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý
µ±¸ÄÓÃ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 = 0;                    //À­¸ßʱÖÓÏß
    Delay5us();                 //ÑÓʱ
    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;
}


void Single_Write_BH1750(uchar REG_Address)
{
    BH1750_Start();                  //ÆðʼÐźÅ
    BH1750_SendByte(SlaveAddress);   //·¢ËÍÉ豸µØÖ·+дÐźÅ
    BH1750_SendByte(REG_Address);    //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬
  //  BH1750_SendByte(REG_data);       //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬
    BH1750_Stop();                   //·¢ËÍÍ£Ö¹ÐźÅ
}

//Á¬Ðø¶Á³öBH1750ÄÚ²¿Êý¾Ý
void Multiple_read_BH1750(void)
{   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();                          //Í£Ö¹ÐźÅ
    Delay5ms();
}


//³õʼ»¯BH1750£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä****
void Init_BH1750()
{
   Single_Write_BH1750(0x01);  

}

void main()
{ 
  char light[6];    
  uchar temp;
  delay_nms(100);        //ÑÓʱ100ms    
  InitLcd12864();       //³õʼ»¯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);         //¼ÆËãÊý¾ÝºÍÏÔʾ        
        sprintf(light,"%d",temp);
        LcdShow(0,0,"Light:");

    LcdShow(0,3,light);

      LcdShow(0,6,'l');     //ÏÔʾÊýµ¥Î»
      LcdShow(0,7,'x');  
            
  }
} 


#include<reg52.h>

#define DB P0
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^5;

void Delay1ms(unsigned char c)
{
    while(c--);
}

void LcdReady()
{                               //²é¿´Òº¾§µ±Ç°×´Ì¬
    unsigned char stage;
    DB = 0xFF;
    RS = 0;                                    //RSΪ0ÊÇÑ¡ÔñÃüÁî¶Ë
    RW = 1;                                    //RWΪ1ÊǶÁÃüÁî
    while(1)
    {
        E = 1;
        stage = DB;
        E = 0;
        if((stage&0x80)==0)
            break;                                 //Èç¹ûÊÇ0´ú±íÒº¾§ÆÁÏÖÔÚ¿ÕÏУ¬
    }
}

void LcdCmd(unsigned char cmd)
{
    LcdReady();
    RS = 0;
    RW = 0;                                   //RWΪ0ÊÇдÃüÁî
    E = 1;
    Delay1ms(5);
    DB = cmd;                                 
    E = 0;
}

void LcdDat(unsigned char dat)
{
    LcdReady();
    RS = 1;                                    //RSΪ1Ñ¡ÔñÊý¾Ý
    RW = 0;                                    //RWΪ0ÊÇдÃüÁî
    E = 1;
    Delay1ms(5);
    DB = dat;   
    E = 0;
}

//void Lcd12864_Clear(void)
//{
//    unsigned char i, j;
//    LcdCmd(0x34);
//    for(i = 0;i < 32; i++)
//    {
//        LcdCmd(0x80+i);
//        LcdCmd(0x80);
//        for(j = 0; j < 32; j++)
//            LcdDat(0xFF);
//    }
//    LcdCmd(0x36);
//    LcdCmd(0x30);
//}

void LcdPos(unsigned char x, unsigned char y)    //Ñ¡ÔñÒº¾§ÆÁ32¿éÇøÓò£¬²¢ÏÔʾ×Ö·û
{
    unsigned char pos;
    
    switch(x)
    {
        case 0: pos = 0x80; break;
        case 1: pos = 0x90; break;
        case 2: pos = 0x88; break;
        case 3: pos = 0x98; break;
        default: break;
    }
    pos = pos + y;
    LcdCmd(pos);
}


void LcdShow(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdPos(x,y);
    while(*str != '\0')
        LcdDat(*str++);
}

void InitLcd12864()
{
    LcdCmd(0x02);
    LcdCmd(0x80);
    LcdCmd(0x34);
    LcdCmd(0x30);
    LcdCmd(0x0C);
    LcdCmd(0x01);
}

  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-03-18 16:39
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    根据您提供的代码,我看到有一段与LCD1602显示有关的代码,但是没有看到涉及到GY-30光照传感器的代码。因此,我无法确定您的代码是否存在问题,导致LCD显示异常和负数出现。如果您能够提供更详细的代码,我将更有信心帮助您解决问题。
    ·
    此外,关于光照传感器返回的数据,您提到在有光照的情况下,数值会往上增加,但是拿开光的时候,数值还会增加或者不产生变化。这可能是由于光照传感器的灵敏度和环境光线的变化引起的。可以考虑在代码中添加一些滤波算法,以消除这种噪声。
    ·
    最后,如果您需要帮助解决代码问题,建议提供更多的代码和硬件连接信息,以便更好地理解您的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥20 看图片)删除这个自动化录屏脚本就一直报错找不到脚本文件,如何解决?(相关搜索:bat文件)
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件