基于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);
}