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

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条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 航班订票系统函数无法运行
      • ¥20 VS2022无法启动程序,如何解决?(语言-c++|开发工具-visual studio)
      • ¥15 c语言可以做出完整的吗有人看看吗
      • ¥15 电脑流氓插件处理方法
      • ¥15 问一下这个可调恒流源电路用哪个电源接口比较好,想用tapec接口仅作为电源接口这个引脚怎么连啊
      • ¥30 Abaqus做建模的时候网格没办法收敛是为什么?
      • ¥15 车牌识别摄像镜头,httppost,nodejs
      • ¥20 腾讯云托管与本地测试 GET请求获取返回值 完全不同
      • ¥15 edge跟谷歌浏览器的默认搜索引擎无法修改,如何解决?
      • ¥15 access数据库出错