收藏 分享(赏)

BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc

上传人:精品资料 文档编号:10761160 上传时间:2020-01-07 格式:DOC 页数:8 大小:41.50KB
下载 相关 举报
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc_第1页
第1页 / 共8页
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc_第2页
第2页 / 共8页
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc_第3页
第3页 / 共8页
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc_第4页
第4页 / 共8页
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、/*/ BH1750FVI IIC 测试程序/ 使用单片机 STC89C51 / 晶振:11.0592M/ 显示:LCD1602/ 作者:dice szj QQ:15023134/ 编译环境 Keil uVision2/*#include #include /Keil library #include /Keil library#include #define uchar unsigned char#define uint unsigned int#define DataPort P0 /LCD1602 数据端口sbit SCL=P10; /IIC 时钟引脚定义sbit SDA=P11; /I

2、IC 数据引脚定义sbit LCM_RS=P24; /LCD1602 命令端口sbit LCM_RW=P25; /LCD1602 命令端口sbit LCM_EN=P26; /LCD1602 命令端口 #define SlaveAddress 0x46 /定义器件在 IIC 总线中的从地址,根据 ALT ADDRESS 地址引脚不同修改/ALT ADDRESS 引脚接地时地址为 0x46,接电源时地址为 0xB8typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF8; /接收数据缓存区 uchar ge,shi,bai,q

3、ian,wan; /显示变量int dis_data; /变量void delay_nms(unsigned int k);void InitLcd();void Init_BH1750(void);void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_BH1750(uchar REG_Address

4、); /单个写入数据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); /应答 ACKbit BH1750_RecvACK(); /读 ackvoid BH1750_SendByte(BYTE dat); /IIC 单个字节

5、写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

6、%10; /取余运算ge=temp_data+0x30; /毫秒延时*void delay_nms(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);/*/void WaitForEnable(void)DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPortLCM_EN=0;/*/void WriteCommandLCM(uchar CMD,uchar Attribc)if(Attribc)WaitForEnable

7、();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;/*/void WriteDataLCM(uchar dataW)WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;/*/void InitLcd()WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x0

8、1,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);/*/void DisplayOneChar(uchar X,uchar Y,uchar DData)YXif(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/*延时 5 微秒(STC90C52RC12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用 1T 的 MCU 时,请调整此延时函数*/void Delay5us()_nop_();_nop_();_nop_();_nop_();_nop_();_

9、nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/*延时 5 毫秒(STC90C52RC12M)不同的工作环境,需要调整此函数当改用 1T 的 MCU 时,请调整此延时函数*/void Delay5ms()WORD n = 560;while (n-);/*起始信号*/void BH1750_Start()SDA = 1; /拉高数据线SCL = 1; /拉高时钟线Delay5us(); /延时SDA = 0; /产生下降沿Delay5us(); /延时SCL = 0;

10、 /拉低时钟线/*停止信号*/void BH1750_Stop()SDA = 0; /拉低数据线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()

11、; /延时CY = SDA; /读应答信号SCL = 0; /拉低时钟线Delay5us(); /延时return CY;/*向 IIC 总线发送一个字节数据*/void BH1750_SendByte(BYTE dat)BYTE i;for (i=0; i8; i+) /8 位计数器dat = 1; /移出数据的最高位SDA = CY; /送数据口SCL = 1; /拉高时钟线Delay5us(); /延时SCL = 0; /拉低时钟线Delay5us(); /延时BH1750_RecvACK();/*从 IIC 总线接收一个字节数据*/BYTE BH1750_RecvByte()BYTE

12、i;BYTE dat = 0;SDA = 1; /使能内部上拉, 准备读取数据,for (i=0; i8; 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); /

13、内部寄存器地址,/ BH1750_SendByte(REG_data); /内部寄存器数据,BH1750_Stop(); /发送停止信号/*单字节读取*/*uchar Single_Read_BH1750(uchar REG_Address) uchar REG_data;BH1750_Start(); /起始信号BH1750_SendByte(SlaveAddress); /发送设备地址 +写信号BH1750_SendByte(REG_Address); /发送存储单元地址,从 0 开始BH1750_Start(); /起始信号BH1750_SendByte(SlaveAddress+1);

14、 /发送设备地址 +读信号REG_data=BH1750_RecvByte(); /读出寄存器数据BH1750_SendACK(1); BH1750_Stop(); /停止信号return REG_data; */*/连续读出 BH1750 内部数据/*void Multiple_read_BH1750(void) uchar i;BH1750_Start(); /起始信号BH1750_SendByte(SlaveAddress+1); /发送设备地址 +读信号for (i=0; i3; i+) /连续读取 2 个地址数据,存储中 BUFBUFi = BH1750_RecvByte(); /B

15、UF0存储 0x32 地址中的数据if (i = 3)BH1750_SendACK(1); /最后一个数据需要回 NOACKelseBH1750_SendACK(0); /回应 ACKBH1750_Stop(); /停止信号Delay5ms();/初始化 BH1750,根据需要请参考 pdf 进行修改*void Init_BH1750()Single_Write_BH1750(0x01); /*/主程序*/*void main() float temp;delay_nms(100); /延时 100msInitLcd(); /初始化 LCDInit_BH1750(); /初始化 BH1750w

16、hile(1) /循环 Single_Write_BH1750(0x01); / power onSingle_Write_BH1750(0x10); / H- resolution modedelay_nms(180); /延时 180msMultiple_Read_BH1750(); /连续读出数据,存储在 BUF 中dis_data=BUF0;dis_data=(dis_data8)+BUF1; /合成数据,即光照数据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);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报