我在使用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); //ÇåÆÁ
}