STC单片机控制BH1750测量光照强度程序
来源:互联网 发布:奶奶抱走红网络 编辑:程序博客网 时间:2024/05/10 05:18
/****备注:此程序最低值为00212lux,时序可能还有一些问题,有时候乱改的话还会出现一直是00212或者00000的情况,****/
/****且数据变化是不连续的00212,00425,00639,00852,01065等等****/
/****2016.10.18日补充:后来发现是BH1750_Write_Byte最后6句写的不对****/
/****2016.10.18日补充:通过修改BH1750_Write_Byte函数的最后6句,程序已经能够正常测试****/#include<reg51.h>#include <intrins.h>bit write=0;sbit SDA=P2^0;sbit SCL=P2^1;typedef unsigned char BYTE;BYTE BUF[8];unsigned char num;unsigned char a,b,sec,count;unsigned char ge,shi,bai,qian,wan; //显示变量int dis_data,dis_data1; //变量void conversion(unsigned int 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 NOP(){_nop_();_nop_();_nop_();_nop_();_nop_();}void Delay(unsigned int i){unsigned int j,k;for(j=i;j>0;j--)for(k=110;k>0;k--);}void BH1750_Start(){SDA=1;NOP();SCL=1;NOP();SDA=0;NOP();SCL=0;NOP();}void BH1750_Stop(){SDA=0;NOP();SCL=1;NOP();SDA=1;NOP();}void BH1750_Write_Byte(unsigned char dat){unsigned char i,temp;temp=dat;for(i=0;i<8;i++){temp=temp<<1;SDA=CY;NOP();SCL=1;NOP();SCL=0;NOP(); }SDA=0; //注意:以下6句不可少,否则读到的数据是不正常的,如00212等NOP();SCL=1;NOP();SCL=0; NOP();}unsigned char BH1750_Read_Byte(){unsigned char i,x=0;SDA=1;NOP();for(i=0;i<8;i++){x=x<<1;SCL=1;NOP();x=x|SDA;SCL=0;NOP(); } return x;}void Responds(){ SDA=0; NOP(); SCL=1; NOP(); SCL=0; NOP();}void No_Responds(){ SDA=1; NOP(); SCL=1; NOP(); SCL=0; NOP();}void Single_Write_BH1750(unsigned char reg_address){BH1750_Start();BH1750_Write_Byte(0x46);//No_Responds(); //此语句不可少,否则返回的数值不会变化BH1750_Write_Byte(reg_address);//No_Responds(); //此语句不可少,否则返回的数值不会变化,2016.10.12日加BH1750_Stop();}void Multiple_Read_BH1750(void){unsigned char i;BH1750_Start();BH1750_Write_Byte(0x47);for(i=0;i<2;i++) //连续读取2个地址数据,存储中BUF { BUF[i]=BH1750_Read_Byte(); //BUF[0]存储0x32地址中的数据 if (i == 1) { No_Responds(); //最后一个数据需要回NOACK } else { Responds(); //回应ACK } } BH1750_Stop(); //停止信号 Delay(5);}void BH1750_init(){Single_Write_BH1750(0x01);}void uart_init(){ TMOD=0x20; TH1=0xfd; TL1=0xfd; SCON=0x50; TR1=1; SCON=0x50; }void uart_putchar(unsigned char dat){SBUF=dat; //把数据送给sbuf缓存器中while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环TI=0; //到了,TI清为0}void uart_printf(unsigned char *buff){while(*buff) uart_putchar(*buff++);}void main(){float temp;unsigned char str[5];uart_init();BH1750_init();while(1){Single_Write_BH1750(0x01);Single_Write_BH1750(0x10);Delay(180);Multiple_Read_BH1750();dis_data=BUF[0]; dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据 temp=(float)dis_data/1.2; conversion(temp); //计算数据和显示 str[0]=wan; str[1]=qian; str[2]=bai; str[3]=shi; str[4]=ge; uart_printf("light:");Delay(2000); uart_printf(str);Delay(2000); uart_printf(" lx\r\n");Delay(2000); }}
显示界面及原理图如下所示:
硬件上直接接四根线就行,VCC,GND,SDA,SCL。
1 0
- STC单片机控制BH1750测量光照强度程序
- STC单片机控制PCA9554A程序
- 光照强度测量
- STC单片机程序-按键
- STC单片机的DS18B20的C程序
- STC单片机程序下载问题汇总
- STC单片机免下电加载程序方法
- STC单片机免下电加载程序方法
- STC单片机按键扫描程序演示
- STC单片机程序下载失败总结
- stc单片机ad转换程序心得
- stc单片机“全自动下载”(程序版)
- stc单片机不断电下载程序
- STC单片机使用RS485下载程序方法
- STC 51单片机程序下载失败总结
- 【Arduino】使用光敏电阻测量光照强度
- STC单片机红外遥控器读码、发射程序
- 电机转速信号的单片机测量程序
- JQuery迭代json中的MAP
- 基于registry2搭建私有仓库
- 自动化测试从0到1
- Uva 455 Periodic Strings
- fedora 安装网易云音乐成功却无法启动的问题
- STC单片机控制BH1750测量光照强度程序
- C语言 将一个整形数字二进制位进行奇偶交换
- 解决TortoiseGit每次Pull或者Push都需要输用户名密码问题
- 元素之和最接近 0 的区间(部分和)
- SVN分支和合并(trunk、branches、tags)
- eclipse maven 导出项目依赖的jar包
- LeetCode 135 Candy (贪心 构造)
- cocos2d-x-2.1.4 在安卓平台编译
- java--Struts2的There is no Action mapped for namespace错误