飞行小丑 2023-03-15 17:42 采纳率: 50%
浏览 38
已结题

51单片机模块遇到的问题

我在使用51单片机以及GY-30光强传感器实现测量光强并显示到1602液晶屏上时出现了一些问题,由于是初学者,并未学习的很扎实,所以多次改变代码依旧没有发现问题所在,主要问题是Light可以显示,但是光强传感器测得的数据在液晶屏上是乱码,显示不出来,想向各位咨询一下,以下是代码

#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Êý¾ÝÒý½Å¶¨Òå
sbit      LCD1602_RS=P1^0;   //LCD1602ÃüÁî¶Ë¿Ú        
sbit      LCD1602_RW=P1^1;   //LCD1602ÃüÁî¶Ë¿Ú        
sbit      LCD1602_E=P1^5;   //LCD1602ÃüÁî¶Ë¿Ú 

#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 InitLcd1602();
void Init_BH1750(void);

void LcdWriteDat(unsigned char dat);
void LcdWriteCmd(unsigned char cmd);
void LcdSetCursor(unsigned char x, unsigned char y);
void LcdShowStr(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()
{  
  uchar temp;
    uchar wan,qian,bai,shi,ge;
    unsigned char *light[6];
  delay_nms(100);        //ÑÓʱ100ms    
  InitLcd1602();       //³õʼ»¯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);         //¼ÆËãÊý¾ÝºÍÏÔʾ
        wan = *light[0];
        qian = *light[1];
        bai = *light[2];
        shi = *light[3];
        ge = *light[4];
        
        
        LcdShowStr(0,0,"Light:");

    LcdShowStr(7,0,light[0]);     //ÏÔʾÊý¾Ý
    LcdShowStr(8,0,light[1]);  
    LcdShowStr(9,0,light[2]); 
    LcdShowStr(10,0,light[3]); 
      LcdShowStr(11,0,light[4]); 

      LcdShowStr(13,0,'l'); ////ÏÔʾÊýµ¥Î»
      LcdShowStr(14,0,'x');  
            
  }
} 


```lcd1602.c
#include<reg52.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;

/* µÈ´ýÒº¾§×¼±¸ºÃ */
void LcdWaitReady()
{
    unsigned char sta;
    
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //¶Áȡ״̬×Ö
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7µÈÓÚ1±íʾҺ¾§Õý棬Öظ´¼ì²âÖ±µ½ÆäµÈÓÚ0Ϊֹ
}        
/*******************************/

/* ÏòLCD1602Òº¾§Ð´ÈëÒ»×Ö½ÚÃüÁcmd-´ýдÈëÃüÁîÖµ */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}

/* ÏòLCD1602Òº¾§Ð´ÈëÒ»×Ö½ÚÊý¾Ý£¬dat-´ýдÈëÊý¾ÝÖµ */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}

/* ÉèÖÃÏÔʾRAMÆðʼµØÖ·£¬Ò༴¹â±êλÖã¬(x,y)-¶ÔÓ¦ÆÁÄ»ÉϵÄ×Ö·û×ø±ê */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
    
    if (y == 0)  //ÓÉÊäÈëµÄÆÁÄ»×ø±ê¼ÆËãÏÔʾRAMµÄµØÖ·
        addr = 0x00 + x;  //µÚÒ»ÐÐ×Ö·ûµØÖ·´Ó0x00Æðʼ
    else
        addr = 0x40 + x;  //µÚ¶þÐÐ×Ö·ûµØÖ·´Ó0x40Æðʼ
    LcdWriteCmd(addr | 0x80);  //ÉèÖÃRAMµØÖ·
}

/* ÔÚÒº¾§ÉÏÏÔʾ×Ö·û´®£¬(x,y)-¶ÔÓ¦ÆÁÄ»ÉϵÄÆðʼ×ø±ê£¬
   str-×Ö·û´®Ö¸Õë*/
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);   //ÉèÖÃÆðʼµØÖ·
    while (*str!='\0')         //Á¬ÐøдÈëlen¸ö×Ö·ûÊý¾Ý
    {
        LcdWriteDat(*str++);
    }
}

/*³õʼ»¯Òº¾§*/
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2ÏÔʾ£¬5*7µãÕó£¬8λÊý¾Ý½Ó¿Ú
    LcdWriteCmd(0x0C);  //ÏÔʾÆ÷¿ª£¬¹â±ê¹Ø±Õ
    LcdWriteCmd(0x06);  //ÎÄ×Ö²»¶¯£¬µØÖ·×Ô¶¯+1
    LcdWriteCmd(0x01);  //ÇåÆÁ        
}    






  • 写回答

2条回答 默认 最新

  • qllaoda 2023-03-15 17:53
    关注

    你要显示的数值是希望存在light这个数组里,但这个数组实际上从未被赋值。你的conversion函数把结果存在了 ge shi bai qian wan里,但你在conversion之后居然又对这几个变量赋值,而且还是从light取,这个就有点莫名其妙了,写反了吧。
    而且你的赋值还是通过指针取值,这个完全是乱来嘛。
    结构乱就不纠正了,先直接改吧, light数组就不要了。
    LcdShowStr(7,0,light[0]);
    LcdShowStr(8,0,light[1]);
    LcdShowStr(9,0,light[2]);
    LcdShowStr(10,0,light[3]);
    LcdShowStr(11,0,light[4]);
    改为
    LcdShowStr(7,0,wan);
    LcdShowStr(8,0,qian);
    LcdShowStr(9,0,bai);
    LcdShowStr(10,0,shi);
    LcdShowStr(11,0,ge);

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同