//***************************************
// BH1750FVI IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 参考宏晶网站24c04通信程序
// 时间:2011年4月20日
//****************************************
#include <REG51.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P3^2; //IIC时钟引脚定义
sbit SDA=P3^3; //IIC数据引脚定义
int flag=0;
sbit dula=P2^6;
sbit wela=P2^7;
int i,j;
int a=99;
//float data;
char *string="abde";
char str[]="daodanjishui";
unsigned char ldat;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;
void delayms(unsigned int w){
for(i=w;i>0;i--)
for(j=110;j>0;j--);
}
//void display(unsigned char bai,unsigned char shi,unsigned char ge){
void display(int bai,int shi,int ge){
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
}
void init(){//串口初始化
PCON |=0X80; //电源管理寄存器,是否波特率倍增,SMOD=1,串口方式为123的时候波特率加倍
//PCON=0x00;//设置SMOD=0
SCON=0x50;//串口控制寄存器,等价于SM0=0,SM1=1,SM2=0,串口方式一通信
TMOD=0X20; //设置定时器1为模式2,做为波特率发生器,8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1
TL1=0xFF; //57600波特率的初值,板子使用11.0592M晶振,初值=256-12000000/32/12/2400
TH1=0xFF; //
//TH1=0xfd;//设置波特率为9600
//TL1=0xfd;
TI = 1;//向CPU发送串口中断申请,直接使用printf必须加入此句才能实现发送
//IE=0x90; //CPU允许中断,串行允许中断�
//REN=1;//允许串口接收中断�
//EA=1;//开全局中断
//ES=1;//串口中断允许
TR1=1; //启动波特率发生器
}
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
int data1,ge1,shi1,bai1; //显示变量
int dis_data; //变量
void delay_nms(unsigned int k);
void Init_BH1750(void);
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微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用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 = 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); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
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); //发送设备地址+读信号
REG_data=BH1750_RecvByte(); //读出寄存器数据
BH1750_SendACK(1);
BH1750_Stop(); //停止信号
ret
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
51单片机用用IO口模拟I2C总线驱动GY-30 光照强度模块测量周围的光照强度,给单片机串口发送一个任意字符串就可以触发单片机采集一个光照强度值,打印到电脑的串口调试助手,同时单片机的数码管也显示光照强度值,由于数码管显示是动态显示的,所以数据采集和显示必须分开,否则数码管是不能正常显示的。采集回来的光照强度根据程序设定的逻辑会适当点亮P1口的LED灯的数量以控制光照强度在一个稳定的范围。
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机的光照强度测量与调节的照明系统(原理图+源码+教程).zip (24个子文件)
基于51单片机的光照强度测量与调节的照明系统(原理图+源码+教程)
.DS_Store 6KB
光强度模块.jpg 25KB
接线图.docx 992KB
BH1750FVI.pdf 386KB
光照传感器手动数码管显示系统
.DS_Store 6KB
STC_BH1750
STC51_BH1750.hex 12KB
STARTUP.LST 11KB
STC51_BH1750_uvproj.bak 14KB
STC51_BH1750_uvopt.bak 6KB
STC51_BH1750.uvproj 14KB
STC51_BH1750_Opt.Bak 1KB
STC51_BH1750.uvgui.Administrator 69KB
STC51_BH1750.M51 24KB
STC51_BH1750_Uv2.Bak 0B
STC51_BH1750.plg 368B
STARTUP.A51 5KB
STC51_BH1750.build_log.htm 1KB
STC_BH1750.c 11KB
STC_BH1750.LST 19KB
STC51_BH1750.lnp 55B
STARTUP.OBJ 749B
STC_BH1750.OBJ 19KB
STC51_BH1750.uvopt 6KB
STC51_BH1750 20KB
共 24 条
- 1
资源评论
MarcoPage
- 粉丝: 3457
- 资源: 4283
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功