照度稳定可调LED台灯
1.照度探测仪部分
包含lcd和传感器部分 还额外加了蓝牙以及语音播报
#include"STC12C5A60S2.h"
#include"lcd12864.h"
#include<stdio.h>
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define SlaveAddress 0x46
typedef unsigned char BYTE;
typedef unsigned short WORD;
float base_value,temp1=0,temp2=0;
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
int dis_data; //变量
int base_on=0;
void delaynms(unsigned int k);
void lcdinit();
void Init_BH1750(void);void conversion(uint temp_data);void Single_Write_BH1750(uchar REG_Address); //单个写入数据
unsigned char Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_BH1750(); //连续的读取内部寄存器数据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 bofangyuyin();sbit SCL=P2^1; //IIC时钟引脚定义
sbit SDA=P2^0; //IIC数据引脚定义sbit Facker=P0^0;
sbit LED=P3^4;sbit RST=P0^3;
sbit Data=P0^2;sbit KEY=P0^1;sbit VCC=P2^2;
/*-------------蓝牙部分--------------*/
uchar blue_buf,flag=0;
bit receiveFlag=0;
uchar lux[5]={0x31,0x32,0x33,0x34,0x35};
uchar change[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar note[10]={" NowLux: "};
int m,blue_temp;void delay10us(uint di) //约为8.4us
{uint i,j;for(i=di;i>0;i--)for(j=5;j>0;j--);
}void potter_config()
{SCON=0x50; //设定串口工作方式PCON=0x00; //波特率不倍增 TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率EA=1;ES = 1; //允许串口中断TL1=0xfd;TH1=0xfd; //波特率9600TR1=1;
}void senddata(uchar dat)
{SBUF =dat;while(!TI);TI = 0;
}/*------------------------------------------*/void delaynms(uint n) //实际0.16毫秒
{uint i=0,j=0;for(i=0;i<n;i++)for(j=0;j<123;j++);
}void delay2us(uint t) //实际2.2us
{unsigned int i;for(i=t;i>0;i--){_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();}
}void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
{ wan=temp_data/10000;temp_data=temp_data%10000; //取余运算qian=temp_data/1000;temp_data=temp_data%1000; //取余运算bai=temp_data/100 ;temp_data=temp_data%100; //取余运算shi=temp_data/10 ;temp_data=temp_data%10; //取余运算ge=temp_data;
}void BH1750_Start()
{SDA = 1; //拉高数据线SCL = 1; //拉高时钟线delay2us(3); //原来延时5usSDA = 0; //产生下降沿delay2us(3); //延时SCL = 0; //拉低时钟线
}void BH1750_Stop()
{SDA = 0; //拉低数据线SCL = 1; //拉高时钟线delay2us(3); //延时SDA = 1; //产生上升沿delay2us(3); //延时
}void BH1750_SendACK(bit ack)
{SDA = ack; //写应答信号SCL = 1; //拉高时钟线delay2us(3); //延时SCL = 0; //拉低时钟线delay2us(3); //延时
}bit BH1750_RecvACK()
{SCL = 1; //拉高时钟线delay2us(3); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线delay2us(3); //延时return CY;
}void BH1750_SendByte(BYTE dat)
{BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线delay2us(3); //延时SCL = 0; //拉低时钟线delay2us(3); //延时}BH1750_RecvACK();
}BYTE BH1750_RecvByte()
{BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线delay2us(3); //延时dat |= SDA; //读数据 SCL = 0; //拉低时钟线delay2us(3); //延时}return dat;
}void Single_Write_BH1750(uchar REG_Address)
{BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //内部寄存器地址,// BH1750_SendByte(REG_data); //内部寄存器数据,BH1750_Stop(); //发送停止信号
}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(); //停止信号delaynms(32);//每毫秒实际上只有0.16ms
}void Init_BH1750()
{Single_Write_BH1750(0x01);
}void Fack()
{ LED=0;Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelaynms(1125); //延时180msif(base_on==0)//后面记得清0{ Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据base_value=(float)dis_data*1.0;base_on=1;}Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据dis_data=(float)dis_data*1.0;if((dis_data>=base_value)&&(dis_data<=(1.16*base_value))){temp1=(base_value+(dis_data-base_value)*0.2);}else if((dis_data<base_value)&&(dis_data>=(0.84*base_value))){temp1=(base_value+(dis_data-base_value)*0.2);}elsetemp1=dis_data;conversion(temp1); //计算数据和显示line_disp("Nowlux:",1); lcd_setwindow(1,0);lcd_writedata('0'+wan);lcd_writedata('0'+qian); lcd_writedata('0'+bai); lcd_writedata('0'+shi); lcd_writedata('0'+ge); lcd_setwindow(3,8);
}void common()
{ base_on=0;LED=1;Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelaynms(1125); //延时180msMultiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据dis_data =(float)dis_data*1.0;if(dis_data<=200){temp2=dis_data/1.5;}elsetemp2=dis_data;conversion(temp2); //计算数据和显示line_disp("Nowlux:",1); lcd_setwindow(1,0);lcd_writedata('0'+wan);lcd_writedata('0'+qian); lcd_writedata('0'+bai); lcd_writedata('0'+shi); lcd_writedata('0'+ge); lcd_setwindow(3,8);
}
void lux_list_change()//将得到的temp放到数组lux里
{lux[0]=change[wan];lux[1]=change[qian];lux[2]=change[bai];lux[3]=change[shi];lux[4]=change[ge];
}
/*--------------语音部分---------------------*/void Command(uchar dat)
{ unsigned char i;bit B_DATA; //传输数据一位Data = 0;delaynms(5); //拉低至少5msB_DATA = dat&0X01;for(i=0;i<8;i++){Data = 1; //拉高数据传输线,准备传输数据if(B_DATA==0){ /*表示逻辑电平0*/delay10us(24); // 延时200usData = 0;delay10us(72); // 延时600us}else{ /*表示逻辑电平1*/delay10us(72);Data = 0;delay10us(24);}dat = dat>>1;B_DATA = dat&0X01;}Data = 1;
}void bofangyuyin()
{
Command(0x01);
delaynms(5000);
}void main()
{ VCC=1;potter_config();delaynms(625);lcdinit(); //初始化LCDInit_BH1750(); //初始化BH1750delaynms(500);bofangyuyin();while(1) //循环{ if(Facker==0){delaynms(5000);Fack();} //延时5000*0.16else{common();}}
}void potter() interrupt 4
{ ES = 0; //关闭串行中断RI = 0; //清除串行接受标志位blue_buf = SBUF; //从串口缓冲区取得数据 switch(blue_buf){case 0x31: flag=1; //返回当前照度数值的指令for(m=0;m<10;m++){ blue_temp=note[m];senddata(blue_temp);}lux_list_change();for(m=0;m<5;m++){ blue_temp=lux[m];senddata(blue_temp);}break;}ES = 1; //允许串口中断
}
2.台灯部分
可以自动调节DAC的输出值改变灯光的亮度,设有四个照度传感器,取四个传感器的平均值作为照度值。可以显示数值,但我注释了关于显示部分。
#include"STC12C5A60S2.h"
#include"lcd12864.h"
#include<stdio.h>
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define SlaveAddress 0x46
typedef unsigned char BYTE;
typedef unsigned short WORD;//================DAC部分=====================================
#define DataLoadA 0X10
#define DataLoadB 0X24
typedef union{uchar max16;uchar s[2];
}Max538;
//-------------------------------------------------
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
float base_value;
int dis_data; //变量
int dis_data_1, dis_data_2, dis_data_3,dis_data_4 ; //变量
void delaynms(unsigned int k);
void lcdinit();
void conversion(uint temp_data);
//==========A1部分函数声明====================================
void A1_Init_BH1750(void);
void A1_Single_Write_BH1750(uchar REG_Address); //单个写入数据
unsigned char A1_Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void A1_Multiple_Read_BH1750(); //连续的读取内部寄存器数据
void A1_BH1750_Start(); //起始信号
void A1_BH1750_Stop(); //停止信号
void A1_BH1750_SendACK(bit ack); //应答ACK
bit A1_BH1750_RecvACK(); //读ack
void A1_BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE A1_BH1750_RecvByte(); //IIC单个字节读//==========A2部分函数声明==================================
void A2_Init_BH1750(void);
void A2_Single_Write_BH1750(uchar REG_Address); //单个写入数据
unsigned char A2_Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void A2_Multiple_Read_BH1750(); //连续的读取内部寄存器数据
void A2_BH1750_Start(); //起始信号
void A2_BH1750_Stop(); //停止信号
void A2_BH1750_SendACK(bit ack); //应答ACK
bit A2_BH1750_RecvACK(); //读ack
void A2_BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE A2_BH1750_RecvByte(); //IIC单个字节读
unsigned int DAC_out=0x4b;//原4a//==========A3部分函数声明====================================
void A3_Init_BH1750(void);
void A3_Single_Write_BH1750(uchar REG_Address); //单个写入数据
unsigned char A3_Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void A3_Multiple_Read_BH1750(); //连续的读取内部寄存器数据
void A3_BH1750_Start(); //起始信号
void A3_BH1750_Stop(); //停止信号
void A3_BH1750_SendACK(bit ack); //应答ACK
bit A3_BH1750_RecvACK(); //读ack
void A3_BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE A3_BH1750_RecvByte(); //IIC单个字节读//==========A4部分函数声明====================================
void A4_Init_BH1750(void);
void A4_Single_Write_BH1750(uchar REG_Address); //单个写入数据
unsigned char A4_Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void A4_Multiple_Read_BH1750(); //连续的读取内部寄存器数据
void A4_BH1750_Start(); //起始信号
void A4_BH1750_Stop(); //停止信号
void A4_BH1750_SendACK(bit ack); //应答ACK
bit A4_BH1750_RecvACK(); //读ack
void A4_BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE A4_BH1750_RecvByte(); //IIC单个字节读float temp;float temp_1,temp_2,temp_3,temp_4;
void initBH1750();void DAC8532WriteValue(uchar Channel,int Value);sbit SCL1=P2^0; //IIC时钟引脚定义
sbit SDA1=P2^1; //IIC数据引脚定义sbit SCL2=P2^2;
sbit SDA2=P2^3;sbit SCL3=P2^4;
sbit SDA3=P2^5;sbit SCL4=P2^6;
sbit SDA4=P2^7;sbit SDI = P0^5;//din
sbit SCLK_DAC= P0^6;
sbit CS = P0^7;//syncsbit key1=P0^0;
sbit key2=P0^1;sbit lock=P0^3;int base_on=0;
int k;
void delaynms(uint n) //实际0.16毫秒
{uint i=0,j=0;for(i=0;i<n;i++)for(j=0;j<123;j++);
}void delay2us(uint t) //实际2.2us
{unsigned int i;for(i=t;i>0;i--){_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();}
}void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
{ wan=temp_data/10000;temp_data=temp_data%10000; //取余运算qian=temp_data/1000;temp_data=temp_data%1000; //取余运算bai=temp_data/100 ;temp_data=temp_data%100; //取余运算shi=temp_data/10 ;temp_data=temp_data%10; //取余运算ge=temp_data;
}//==============================以下为A1部分函数体==============================void A1_BH1750_Start(){SDA1 = 1; //拉高数据线SCL1 = 1; //拉高时钟线delay2us(3); //原来延时5usSDA1 = 0; //产生下降沿delay2us(3); //延时SCL1 = 0; //拉低时钟线}void A1_BH1750_Stop(){SDA1 = 0; //拉低数据线SCL1 = 1; //拉高时钟线delay2us(3); //延时SDA1 = 1; //产生上升沿delay2us(3); //延时}void A1_BH1750_SendACK(bit ack){SDA1 = ack; //写应答信号SCL1 = 1; //拉高时钟线delay2us(3); //延时SCL1 = 0; //拉低时钟线delay2us(3); //延时}bit A1_BH1750_RecvACK(){SCL1 = 1; //拉高时钟线delay2us(3); //延时CY = SDA1; //读应答信号SCL1 = 0; //拉低时钟线delay2us(3); //延时return CY;}void A1_BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA1 = CY; //送数据口SCL1 = 1; //拉高时钟线delay2us(3); //延时SCL1 = 0; //拉低时钟线delay2us(3); //延时}A1_BH1750_RecvACK();}BYTE A1_BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA1 = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL1 = 1; //拉高时钟线delay2us(3); //延时dat |= SDA1; //读数据 SCL1 = 0; //拉低时钟线delay2us(3); //延时}return dat;}void A1_Single_Write_BH1750(uchar REG_Address){A1_BH1750_Start(); //起始信号A1_BH1750_SendByte(SlaveAddress); //发送设备地址+写信号A1_BH1750_SendByte(REG_Address); //内部寄存器地址,//A1_BH1750_SendByte(REG_data); //内部寄存器数据,A1_BH1750_Stop(); //发送停止信号}void A1_Multiple_read_BH1750(void){ uchar i; A1_BH1750_Start(); //起始信号A1_BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF{BUF[i] = A1_BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){A1_BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ A1_BH1750_SendACK(0); //回应ACK}}A1_BH1750_Stop(); //停止信号delaynms(32);//每毫秒实际上只有0.16ms}//初始化BH1750void A1_Init_BH1750(){A1_Single_Write_BH1750(0x01); }//==============================以下为A2部分函数体==============================void A2_BH1750_Start(){SDA2 = 1; //拉高数据线SCL2 = 1; //拉高时钟线delay2us(3); //原来延时5usSDA2 = 0; //产生下降沿delay2us(3); //延时SCL2 = 0; //拉低时钟线}void A2_BH1750_Stop(){SDA2 = 0; //拉低数据线SCL2 = 1; //拉高时钟线delay2us(3); //延时SDA2 = 1; //产生上升沿delay2us(3); //延时}void A2_BH1750_SendACK(bit ack){SDA2 = ack; //写应答信号SCL2 = 1; //拉高时钟线delay2us(3); //延时SCL2 = 0; //拉低时钟线delay2us(3); //延时}bit A2_BH1750_RecvACK(){SCL2 = 1; //拉高时钟线delay2us(3); //延时CY = SDA2; //读应答信号SCL2 = 0; //拉低时钟线delay2us(3); //延时return CY;}void A2_BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA2 = CY; //送数据口SCL2 = 1; //拉高时钟线delay2us(3); //延时SCL2 = 0; //拉低时钟线delay2us(3); //延时}A2_BH1750_RecvACK();}BYTE A2_BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA2 = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL2 = 1; //拉高时钟线delay2us(3); //延时dat |= SDA2; //读数据 SCL2 = 0; //拉低时钟线delay2us(3); //延时}return dat;}void A2_Single_Write_BH1750(uchar REG_Address){A2_BH1750_Start(); //起始信号A2_BH1750_SendByte(SlaveAddress); //发送设备地址+写信号A2_BH1750_SendByte(REG_Address); //内部寄存器地址,//A2_BH1750_SendByte(REG_data); //内部寄存器数据,A2_BH1750_Stop(); //发送停止信号}void A2_Multiple_read_BH1750(void){ uchar i; A2_BH1750_Start(); //起始信号A2_BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF{BUF[i] = A2_BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){A2_BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ A2_BH1750_SendACK(0); //回应ACK}}A2_BH1750_Stop(); //停止信号delaynms(32);//每毫秒实际上只有0.16ms}//初始化BH1750void A2_Init_BH1750(){A2_Single_Write_BH1750(0x01); }
//==============================以下为A3部分函数体==============================void A3_BH1750_Start(){SDA3 = 1; //拉高数据线SCL3 = 1; //拉高时钟线delay2us(3); //原来延时5usSDA3 = 0; //产生下降沿delay2us(3); //延时SCL3 = 0; //拉低时钟线}void A3_BH1750_Stop(){SDA3 = 0; //拉低数据线SCL3 = 1; //拉高时钟线delay2us(3); //延时SDA3 = 1; //产生上升沿delay2us(3); //延时}void A3_BH1750_SendACK(bit ack){SDA3 = ack; //写应答信号SCL3 = 1; //拉高时钟线delay2us(3); //延时SCL3 = 0; //拉低时钟线delay2us(3); //延时}bit A3_BH1750_RecvACK(){SCL3 = 1; //拉高时钟线delay2us(3); //延时CY = SDA3; //读应答信号SCL3 = 0; //拉低时钟线delay2us(3); //延时return CY;}void A3_BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA3 = CY; //送数据口SCL3 = 1; //拉高时钟线delay2us(3); //延时SCL3 = 0; //拉低时钟线delay2us(3); //延时}A3_BH1750_RecvACK();}BYTE A3_BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA3 = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL3 = 1; //拉高时钟线delay2us(3); //延时dat |= SDA3; //读数据 SCL3 = 0; //拉低时钟线delay2us(3); //延时}return dat;}void A3_Single_Write_BH1750(uchar REG_Address){A3_BH1750_Start(); //起始信号A3_BH1750_SendByte(SlaveAddress); //发送设备地址+写信号A3_BH1750_SendByte(REG_Address); //内部寄存器地址,//A3_BH1750_SendByte(REG_data); //内部寄存器数据,A3_BH1750_Stop(); //发送停止信号}void A3_Multiple_read_BH1750(void){ uchar i; A3_BH1750_Start(); //起始信号A3_BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF{BUF[i] = A3_BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){A3_BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ A3_BH1750_SendACK(0); //回应ACK}}A3_BH1750_Stop(); //停止信号delaynms(32);//每毫秒实际上只有0.16ms}//初始化BH1750void A3_Init_BH1750(){A3_Single_Write_BH1750(0x01); }//==============================以下为A4部分函数体==============================void A4_BH1750_Start(){SDA4 = 1; //拉高数据线SCL4 = 1; //拉高时钟线delay2us(3); //原来延时5usSDA4 = 0; //产生下降沿delay2us(3); //延时SCL4 = 0; //拉低时钟线}void A4_BH1750_Stop(){SDA4 = 0; //拉低数据线SCL4 = 1; //拉高时钟线delay2us(3); //延时SDA4 = 1; //产生上升沿delay2us(3); //延时}void A4_BH1750_SendACK(bit ack){SDA4 = ack; //写应答信号SCL4 = 1; //拉高时钟线delay2us(3); //延时SCL4 = 0; //拉低时钟线delay2us(3); //延时}bit A4_BH1750_RecvACK(){SCL4 = 1; //拉高时钟线delay2us(3); //延时CY = SDA4; //读应答信号SCL4 = 0; //拉低时钟线delay2us(3); //延时return CY;}void A4_BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA4 = CY; //送数据口SCL4 = 1; //拉高时钟线delay2us(3); //延时SCL4 = 0; //拉低时钟线delay2us(3); //延时}A4_BH1750_RecvACK();}BYTE A4_BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA4 = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL4 = 1; //拉高时钟线delay2us(3); //延时dat |= SDA4; //读数据 SCL4 = 0; //拉低时钟线delay2us(3); //延时}return dat;}void A4_Single_Write_BH1750(uchar REG_Address){A4_BH1750_Start(); //起始信号A4_BH1750_SendByte(SlaveAddress); //发送设备地址+写信号A4_BH1750_SendByte(REG_Address); //内部寄存器地址,//A4_BH1750_SendByte(REG_data); //内部寄存器数据,A4_BH1750_Stop(); //发送停止信号}void A4_Multiple_read_BH1750(void){ uchar i; A4_BH1750_Start(); //起始信号A4_BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF{BUF[i] = A4_BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){A4_BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ A4_BH1750_SendACK(0); //回应ACK}}A4_BH1750_Stop(); //停止信号delaynms(32);//每毫秒实际上只有0.16ms}//初始化BH1750void A4_Init_BH1750(){A4_Single_Write_BH1750(0x01); }//================DAC部分=====================================
void delay_10us()//延时10us
{_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}void DACSendData(uchar dat,void(*pf)(void))
{uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++){SCLK_DAC = 0;pf();SDI = (dat & 0x80); //SDI = (dat << BitCnt & 0x80);SCLK_DAC = 1;pf();dat <<= 1;}SCLK_DAC = 0;
}
//16Bit DAC
void DAC8532WriteValue(uchar Channel,int dat)
{Max538 MAX;MAX.max16=dat;CS = 0;if(Channel==0){ DACSendData(DataLoadA,delay_10us);}else {DACSendData(DataLoadB,delay_10us);}DACSendData(MAX.s[0],delay_10us);DACSendData(MAX.s[1],delay_10us);CS = 1;
}void initBH1750()
{A1_Single_Write_BH1750(0x01); // power onA2_Single_Write_BH1750(0x01); // power onA3_Single_Write_BH1750(0x01); // power onA4_Single_Write_BH1750(0x01); // power onA1_Single_Write_BH1750(0x10); // H- resolution modeA2_Single_Write_BH1750(0x10); // H- resolution modeA3_Single_Write_BH1750(0x10); // H- resolution modeA4_Single_Write_BH1750(0x10); // H- resolution mode}void adapt_mode()
{ //延时180msif(base_on==0)//读出并设立基础值{ initBH1750();delaynms(1125); A1_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_1=BUF[0];dis_data_1=(dis_data_1<<8)+BUF[1];//合成数据,即光照数据dis_data_1=(float)dis_data_1/1.0;A2_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_2=BUF[0];dis_data_2=(dis_data_2<<8)+BUF[1];//合成数据,即光照数据dis_data_2=(float)dis_data_2/1.0;A3_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_3=BUF[0];dis_data_3=(dis_data_3<<8)+BUF[1];//合成数据,即光照数据dis_data_3=(float)dis_data_3/1.0;A4_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_4=BUF[0];dis_data_4=(dis_data_4<<8)+BUF[1];//合成数据,即光照数据dis_data_4=(float)dis_data_4/1.0;temp=(dis_data_1+dis_data_2+dis_data_3+dis_data_4)/4;//取平均值base_value=temp;base_on=1;}A1_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_1=BUF[0];dis_data_1=(dis_data_1<<8)+BUF[1];//合成数据,即光照数据dis_data_1=(float)dis_data_1/1.0;A2_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_2=BUF[0];dis_data_2=(dis_data_2<<8)+BUF[1];//合成数据,即光照数据dis_data_2=(float)dis_data_2/1.0;A3_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_3=BUF[0];dis_data_3=(dis_data_3<<8)+BUF[1];//合成数据,即光照数据dis_data_3=(float)dis_data_3/1.0;A4_Multiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data_4=BUF[0];dis_data_4=(dis_data_4<<8)+BUF[1];//合成数据,即光照数据dis_data_4=(float)dis_data_4/1.0;/* if(((dis_data_1-dis_data_3)>=200)||((dis_data_3-dis_data_1)>=200))//1,3方向上的光{temp=((dis_data_2+dis_data_4)/2)*1.2;//取平均值}else if(((dis_data_4-dis_data_2)>=200)||((dis_data_2-dis_data_4)>=200))//2,4d方向上的光{temp=((dis_data_1+dis_data_3)/2)*1.2;//取平均值}else*/temp=(dis_data_1+dis_data_2+dis_data_3+dis_data_4)/4;if((temp>=base_value*1.03)&&(DAC_out>=80)){DAC_out=DAC_out-0.5;DAC8532WriteValue(1,DAC_out);/*temp=(dis_data_1+dis_data_2+dis_data_3+dis_data_4)/4;if((temp<base_value*1.03)||(lock==1))break;*/}else if((temp<=base_value*0.97)&&(DAC_out<=254)){DAC_out=DAC_out+1;DAC8532WriteValue(1,DAC_out);/* temp=(dis_data_1+dis_data_2+dis_data_3+dis_data_4)/4;if((temp>base_value*0.97)||(lock==1))break;*/}
}void keyscan()
{if(key1==0){ delaynms(10);if(key1==0)k=1;while(key1==0);}if(key2==0){delaynms(10);if(key2==0)k=2;while(key2==0);}}void common()
{base_on=0;keyscan();delaynms(100);DAC8532WriteValue(1,DAC_out);if(k==1){ if(DAC_out<250)//原245{DAC_out+=5;DAC8532WriteValue(1,DAC_out);k=0;}}if((k==2)){if(DAC_out>80){ DAC_out-=10;DAC8532WriteValue(1,DAC_out);k=0;}} }void main()
{ delaynms(625);lcdinit(); //初始化LCDinitBH1750();while(1) //循环{ if(lock==0){adapt_mode();}else{common();}}
}
照度稳定可调LED台灯相关推荐
- 照度稳定可调 LED 台灯(K 题)【高职高专组】-- 2021 年全国大学生电子设计竞赛
照度稳定可调 LED 台灯(K 题)[高职高专组]-- 2021 年全国大学生电子设计竞赛 一 任务 二 要求 1.基本要求 2.发挥部分 三 说明 四 评分标准 优秀作品开源参考(来源立创开源平台) ...
- 2021电赛国一——K题照度稳定可调LED台灯
目录 一.数字显示照度表 1.1.效果图 1.2.简介及程序 二.台灯整体程序 2.1.程序流程图 2.2.主函数main 2.3.自动调节程序 三.手机APP 3.1.手机APP界面效果图 3.2. ...
- Led台灯对眼睛好吗?2022双十一不伤眼的护眼灯推荐
很多人对led台灯有许多误解,其实比起传统的白炽灯.节能灯等等,led灯才是真正的对眼睛好.传统台灯通过的电流几乎都是交流电,而比较好的led台灯却是低压直流输电,几乎没有频闪危害.Led灯也没有传统 ...
- led台灯哪个牌子质量好?2022最新的台灯牌子排名
众所周知,现在绝大部分台灯都是使用led灯珠作为发光源,led台灯作为主流的选择,在光线舒适度.光线调控性.台灯售价.显色与防护.节能环保等方面都是非常出色的,远超以前的传统白炽灯.那么现在市面上le ...
- 【拆机】触摸感应LED台灯
一.产品外观 可折叠触摸式LED台灯,底座上方有一个感应触摸按键,三档亮度可调,通电后连续触摸分别为:开灯低亮.中亮.高亮.关灯.台灯不带电池,通过5V/2A电源适配器从底座尾部DC孔供电.底座与支撑 ...
- 灯珠电路图_可充电led台灯电路图
充电式LED台灯的电路图 电路如上图所示.接通电源,交流220V电压经电容C1降压限流.整流桥桥式整流及电容C2滤波后,产生一个直流电压通过二极管VD给4V的蓄电池充电.蓄电池的充电电流主要由电容C1 ...
- 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯
基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯仿真设计 (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C ...
- rg1 蓝光危害rg0_新国标:你的LED台灯防蓝光危害评估结果是RG0吗?
在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧.其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2 ...
- rg1 蓝光危害rg0_新国标: 你的LED台灯防蓝光危害评估结果是RG0吗?
在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧.其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2 ...
最新文章
- 怎么知道 网站是否直接明文保存密码_忘记账号密码 浏览器记住了 怎么找回密码?...
- 西南这座城,脸,比北上广还有用
- JQuery中checkbox勾选/取消勾选的诡异问题(attr和prop)
- Linux运维:查看磁盘空间的大小
- SDR与DDR的区别
- [20150913]文件检查点_热备份.txt
- 简明的wifi通信协议介绍
- three.js自定义材质各向异性
- 使用Java实现身份证真假校验
- 上海公积金网上提取_为什么提取上海公积金租房这么简单?
- 自然语言处理--HMM.MEMM,CRF(三)
- Google 人工智能基本原则
- 抖音最近很火的游戏直播:挤地铁教程+源码+软件下载
- 乐高机器人走进图书馆活动方案_欢迎参加“乐高机器人创意搭建赛”活动
- 重启服务器:docker重启,docker内部mysql怎么重启启动
- 抖音数据分析(基于播放、点赞、投稿、背景音乐)--pyecharts可视化
- java回忆录—神奇的进制世界
- 线上支付,出款和收款
- 华为开发者联盟怎么升级鸿蒙,怎么升级鸿蒙系统
- tomcat 绑定花生壳免费域名