BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.docx
- 文档编号:14190624
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:13
- 大小:16.63KB
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.docx
《BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.docx》由会员分享,可在线阅读,更多相关《BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.docx(13页珍藏版)》请在冰点文库上搜索。
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版
//***************************************
//BH1750FVIIIC测试程序
//使用单片机STC89C51
//晶振:
11.0592M
//显示:
LCD1602
//作者:
diceszjQQ:
15023134
//编译环境KeiluVision2
//****************************************
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDataPortP0//LCD1602数据端口
sbitSCL=P1^0;//IIC时钟引脚定义
sbitSDA=P1^1;//IIC数据引脚定义
sbitLCM_RS=P2^4;//LCD1602命令端口
sbitLCM_RW=P2^5;//LCD1602命令端口
sbitLCM_EN=P2^6;//LCD1602命令端口
#defineSlaveAddress0x46//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
//ALTADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
BYTEBUF[8];//接收数据缓存区
ucharge,shi,bai,qian,wan;//显示变量
intdis_data;//变量
voiddelay_nms(unsignedintk);
voidInitLcd();
voidInit_BH1750(void);
voidWriteDataLCM(uchardataW);
voidWriteCommandLCM(ucharCMD,ucharAttribc);
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidconversion(uinttemp_data);
voidSingle_Write_BH1750(ucharREG_Address);//单个写入数据
ucharSingle_Read_BH1750(ucharREG_Address);//单个读取内部寄存器数据
voidMultiple_Read_BH1750();//连续的读取内部寄存器数据
//------------------------------------
voidDelay5us();
voidDelay5ms();
voidBH1750_Start();//起始信号
voidBH1750_Stop();//停止信号
voidBH1750_SendACK(bitack);//应答ACK
bitBH1750_RecvACK();//读ack
voidBH1750_SendByte(BYTEdat);//IIC单个字节写
BYTEBH1750_RecvByte();//IIC单个字节读
//-----------------------------------
//*********************************************************
voidconversion(uinttemp_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;
}
//毫秒延时**************************
voiddelay_nms(unsignedintk)
{
unsignedinti,j;
for(i=0;i { for(j=0;j<121;j++) {;}} } /*******************************/ voidWaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } /*******************************/ voidWriteCommandLCM(ucharCMD,ucharAttribc) { if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /*******************************/ voidWriteDataLCM(uchardataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /***********************************/ voidInitLcd() { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); } /***********************************/ voidDisplayOneChar(ucharX,ucharY,ucharDData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } /************************************** 延时5微秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数,注意时钟过快时需要修改 当改用1T的MCU时,请调整此延时函数 **************************************/ voidDelay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** 延时5毫秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数 当改用1T的MCU时,请调整此延时函数 **************************************/ voidDelay5ms() { WORDn=560; while(n--); } /************************************** 起始信号 **************************************/ voidBH1750_Start() { SDA=1;//拉高数据线 SCL=1;//拉高时钟线 Delay5us();//延时 SDA=0;//产生下降沿 Delay5us();//延时 SCL=0;//拉低时钟线 } /************************************** 停止信号 **************************************/ voidBH1750_Stop() { SDA=0;//拉低数据线 SCL=1;//拉高时钟线 Delay5us();//延时 SDA=1;//产生上升沿 Delay5us();//延时 } /************************************** 发送应答信号 入口参数: ack(0: ACK1: NAK) **************************************/ voidBH1750_SendACK(bitack) { SDA=ack;//写应答信号 SCL=1;//拉高时钟线 Delay5us();//延时 SCL=0;//拉低时钟线 Delay5us();//延时 } /************************************** 接收应答信号 **************************************/ bitBH1750_RecvACK() { SCL=1;//拉高时钟线 Delay5us();//延时 CY=SDA;//读应答信号 SCL=0;//拉低时钟线 Delay5us();//延时 returnCY; } /************************************** 向IIC总线发送一个字节数据 **************************************/ voidBH1750_SendByte(BYTEdat) { BYTEi; for(i=0;i<8;i++)//8位计数器 { dat<<=1;//移出数据的最高位 SDA=CY;//送数据口 SCL=1;//拉高时钟线 Delay5us();//延时 SCL=0;//拉低时钟线 Delay5us();//延时 } BH1750_RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ BYTEBH1750_RecvByte() { BYTEi; BYTEdat=0; SDA=1;//使能内部上拉,准备读取数据, for(i=0;i<8;i++)//8位计数器 { dat<<=1; SCL=1;//拉高时钟线 Delay5us();//延时 dat|=SDA;//读数据 SCL=0;//拉低时钟线 Delay5us();//延时 } returndat; } //********************************* voidSingle_Write_BH1750(ucharREG_Address) { BH1750_Start();//起始信号 BH1750_SendByte(SlaveAddress);//发送设备地址+写信号 BH1750_SendByte(REG_Address);//内部寄存器地址, //BH1750_SendByte(REG_data);//内部寄存器数据, BH1750_Stop();//发送停止信号 } //********单字节读取***************************************** /* ucharSingle_Read_BH1750(ucharREG_Address) {ucharREG_data; BH1750_Start();//起始信号 BH1750_SendByte(SlaveAddress);//发送设备地址+写信号 BH1750_SendByte(REG_Address);//发送存储单元地址,从0开始 BH1750_Start();//起始信号 BH1750_SendByte(SlaveAddress+1);//发送设备地址+读信号 REG_data=BH1750_RecvByte();//读出寄存器数据 BH1750_SendACK (1); BH1750_Stop();//停止信号 returnREG_data; } */ //********************************************************* // //连续读出BH1750内部数据 // //********************************************************* voidMultiple_read_BH1750(void) {uchari; 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进行修改**** voidInit_BH1750() { Single_Write_BH1750(0x01); } //********************************************************* //主程序******** //********************************************************* voidmain() { floattemp; delay_nms(100);//延时100ms InitLcd();//初始化LCD Init_BH1750();//初始化BH1750 while (1)//循环 { Single_Write_BH1750(0x01);//poweron Single_Write_BH1750(0x10);//H-resolutionmode 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);//计算数据和显示 DisplayOneChar(0,0,'L'); DisplayOneChar(1,0,'i'); DisplayOneChar(2,0,'g'); DisplayOneChar(3,0,'h'); DisplayOneChar(4,0,'t'); DisplayOneChar(5,0,': '); DisplayOneChar(7,0,wan);//显示数据 DisplayOneChar(8,0,qian); DisplayOneChar(9,0,bai); DisplayOneChar(10,0,shi); DisplayOneChar(11,0,ge); DisplayOneChar(13,0,'l');//显示数单位 DisplayOneChar(14,0,'x'); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BH1750 数字 强度 测试仪 设计 LCD1602 显示 51 单片机 语言 程序 完整版