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台灯相关推荐

  1. 照度稳定可调 LED 台灯(K 题)【高职高专组】-- 2021 年全国大学生电子设计竞赛

    照度稳定可调 LED 台灯(K 题)[高职高专组]-- 2021 年全国大学生电子设计竞赛 一 任务 二 要求 1.基本要求 2.发挥部分 三 说明 四 评分标准 优秀作品开源参考(来源立创开源平台) ...

  2. 2021电赛国一——K题照度稳定可调LED台灯

    目录 一.数字显示照度表 1.1.效果图 1.2.简介及程序 二.台灯整体程序 2.1.程序流程图 2.2.主函数main 2.3.自动调节程序 三.手机APP 3.1.手机APP界面效果图 3.2. ...

  3. Led台灯对眼睛好吗?2022双十一不伤眼的护眼灯推荐

    很多人对led台灯有许多误解,其实比起传统的白炽灯.节能灯等等,led灯才是真正的对眼睛好.传统台灯通过的电流几乎都是交流电,而比较好的led台灯却是低压直流输电,几乎没有频闪危害.Led灯也没有传统 ...

  4. led台灯哪个牌子质量好?2022最新的台灯牌子排名

    众所周知,现在绝大部分台灯都是使用led灯珠作为发光源,led台灯作为主流的选择,在光线舒适度.光线调控性.台灯售价.显色与防护.节能环保等方面都是非常出色的,远超以前的传统白炽灯.那么现在市面上le ...

  5. 【拆机】触摸感应LED台灯

    一.产品外观 可折叠触摸式LED台灯,底座上方有一个感应触摸按键,三档亮度可调,通电后连续触摸分别为:开灯低亮.中亮.高亮.关灯.台灯不带电池,通过5V/2A电源适配器从底座尾部DC孔供电.底座与支撑 ...

  6. 灯珠电路图_可充电led台灯电路图

    充电式LED台灯的电路图 电路如上图所示.接通电源,交流220V电压经电容C1降压限流.整流桥桥式整流及电容C2滤波后,产生一个直流电压通过二极管VD给4V的蓄电池充电.蓄电池的充电电流主要由电容C1 ...

  7. 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯

    基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯仿真设计 (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C ...

  8. rg1 蓝光危害rg0_新国标:你的LED台灯防蓝光危害评估结果是RG0吗?

    在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧.其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2 ...

  9. rg1 蓝光危害rg0_新国标: 你的LED台灯防蓝光危害评估结果是RG0吗?

    在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧.其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2 ...

最新文章

  1. 怎么知道 网站是否直接明文保存密码_忘记账号密码 浏览器记住了 怎么找回密码?...
  2. 西南这座城,脸,比北上广还有用
  3. JQuery中checkbox勾选/取消勾选的诡异问题(attr和prop)
  4. Linux运维:查看磁盘空间的大小
  5. SDR与DDR的区别
  6. [20150913]文件检查点_热备份.txt
  7. 简明的wifi通信协议介绍
  8. three.js自定义材质各向异性
  9. 使用Java实现身份证真假校验
  10. 上海公积金网上提取_为什么提取上海公积金租房这么简单?
  11. 自然语言处理--HMM.MEMM,CRF(三)
  12. Google 人工智能基本原则
  13. 抖音最近很火的游戏直播:挤地铁教程+源码+软件下载
  14. 乐高机器人走进图书馆活动方案_欢迎参加“乐高机器人创意搭建赛”活动
  15. 重启服务器:docker重启,docker内部mysql怎么重启启动
  16. 抖音数据分析(基于播放、点赞、投稿、背景音乐)--pyecharts可视化
  17. java回忆录—神奇的进制世界
  18. 线上支付,出款和收款
  19. 华为开发者联盟怎么升级鸿蒙,怎么升级鸿蒙系统
  20. tomcat 绑定花生壳免费域名

热门文章

  1. composer设置镜像
  2. vue项目引入高德地图
  3. STM32F103移植FreeRTOS
  4. 433MHz通信 发F115 收SYN480R
  5. 做自媒体如何快速实现财务自由
  6. js 原生cookie封装
  7. 本地局域网HTTPS解决方案 CA证书
  8. ubuntu安装有道词典
  9. Unity3D项目升级URP
  10. UNITY 5.2.1 发行说明 中文版