|
51单片机12864液晶tsl2561光强传感器,调试成功
单片机源程序如下:
- #include
- #include
- #include
- /*********************************************
- 下均为IIC和光强所需程序
- **********************************************/
- #include
- //设备读写地址
- ////命令控制寄存器
- #define CONTROL 0x80
- #define TIMING 0x81
- #define DATA0LOW 0x8C
- #define DATA0HIGH 0x8D
- #define DATA1LOW 0x8E
- #define DATA1HIGH 0x8F
- //TSL2561地址
-
- typedef signed int sint;
- typedef unsigned long u32;
- uint DataLow0,DataHigh0,DataLow1,DataHigh1;
- float ratioc;
- sint Lux=0;
- uchar command,temp;
- uint Channel1,Channel0;
- void i2c_delay() //10us
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=2;a>0;a--);
- }
- //初始化延时函数
- void init_delay(void)
- {
- static time =10000;
- while(time--);
- }
- //初始化函数
- void i2c_init(void)
- {
- i2c_scl = 1;//释放时钟线
- init_delay();
- i2c_sda = 1;//释放数据线
- init_delay();
- }
- //起始信号
- void i2c_start(void)
- {
- i2c_sda=1;
- i2c_delay();
- i2c_scl=1;
- i2c_delay();
- i2c_sda=0;
- i2c_delay();
- i2c_scl=0;
- i2c_delay();
- }
- //停止信号
- void i2c_stop(void)
- {
- i2c_sda = 0;
- i2c_delay();
- i2c_scl = 1;
- i2c_delay();
- i2c_sda = 1;
- i2c_delay();
- }
- uchar write_byte(unsigned char dat)
- {
- unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
- for(a=0;a<8;a++)//要发送8位,从最高位开始
- {
- i2c_sda=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
- dat=dat<<1;
- i2c_delay();
- i2c_scl=1;
- i2c_delay();//建立时间>4.7us
- i2c_scl=0;
- i2c_delay();//时间大于4us
- }
- i2c_sda=1;
- i2c_delay();
- i2c_scl=1;
- while(i2c_sda)//等待应答,也就是等待从设备把SDA拉低
- {
- b++;
- if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
- {
- i2c_scl=0;
- i2c_delay();
- return 0;
- }
- }
- i2c_scl=0;
- i2c_delay();
- return 1;
- }
- unsigned char read_byte()
- {
- unsigned char a=0,dat=0;
- i2c_sda=1; //起始和发送一个字节之后SCL都是0
- i2c_delay();
- for(a=0;a<8;a++)//接收8个字节
- {
- i2c_scl=1;
- i2c_delay();
- dat<<=1;
- dat|=i2c_sda;
- i2c_delay();
- i2c_scl=0;
- i2c_delay();
- }
- return dat;
- }
- //TSL2561写函数
- //-------------------------------------------------
- void TSL2561_Write(uchar command,uchar date)
- {
- i2c_start();
- write_byte(SLAVE_ADDR_WR);
- //respons();
- write_byte(command);
- //respons();
- write_byte(date);
- //respons();
- i2c_stop();
- }
- //读函数
- //-------------------------------------------------
- uchar TSL2561_Read(uchar command)
- {
- uchar date;
- i2c_start();
- write_byte(SLAVE_ADDR_WR);
- //respons();
- write_byte(command);
- //respons();
- i2c_start();
- write_byte(SLAVE_ADDR_WR+1);
- //respons();
- date=read_byte();
- i2c_stop();
- return date;
- }
- //------------------------------------------
- //读取光照强度
- sint Read_Light(void)
- {
-
- DataLow0 = TSL2561_Read(DATA0LOW);
- DataHigh0 = TSL2561_Read(DATA0HIGH);
- Channel0 = 256*DataHigh0 + DataLow0;
-
- //------------------------------
- DataLow1 = TSL2561_Read(DATA1LOW);
- DataHigh1 = TSL2561_Read(DATA1HIGH);
- Channel1 = 256*DataHigh1 + DataLow1;
-
- //---------------------------------
- //Calculating Lux for tmb封装
- ratioc = Channel1/Channel0;
- if (0 < ratioc <= 0.50) Lux = 0.0304 * Channel0 - 0.062 * Channel0 *pow((Channel1/Channel0) ,1.4 );
- if (0.50 < ratioc <= 0.61) Lux = 0.0224 *Channel0 - 0.031 * Channel1;
- if (0.61 < ratioc <= 0.80 )Lux = 0.0128 * Channel0 - 0.0153 * Channel1;
- if (0.80 < ratioc <= 1.30) Lux = 0.00146 * Channel0 - 0.00112 * Channel1;
- if (ratioc > 1.30) Lux = 0;
- return Lux;
- }
- //直接调用
- void tsl2561_Init(void)
- {
- i2c_init(); //i2c初始化
- TSL2561_Write(CONTROL,0x03); //启动原件
- init_delay(); //防止数据出错
- TSL2561_Write(TIMING,0x02); //积分时间
- //TSL2561_Write(0xC6,0x30); //中断
- }
- /********************************
- 主函数main
- **********************************/
- void main()
- {
- uchar i=0;
- uchar code DIS1[]={"光强1:"},code DIS2[]={"光强R-L:"},code DIS3[]={"通道0:"},code DIS4[]={"通道1:"};
- uint ge,shi,bai,qian,wan,W1,Q1,B1,S1,G1,W0,Q0,B0,S0,G0;
- sint CH1,RL,CH0; //16位
- tsl2561_Init();
- LcdInit();
- LcdWriteCom(0x80);
- while(DIS1[i]!='')
- LcdWriteData(DIS1[i++]);
- i=0;
- LcdWriteCom(0x90);
- while(DIS1[i]!='')
- LcdWriteData(DIS2[i++]);
- i=0;
- LcdWriteCom(0x88);
- while(DIS1[i]!='')
- LcdWriteData(DIS3[i++]);
- i=0;
- LcdWriteCom(0x98);
- while(DIS1[i]!='')
- LcdWriteData(DIS4[i++]);
-
- while(1)
- {
-
- RL=Read_Light(); //读取光强
-
- CH0=Channel0;
- CH1=Channel1;
- LcdWriteCom(0x90);
- wan=RL/10000;
- qian=RL%10000/1000;
- bai=RL%10000%1000/100;
- shi=RL%10000%1000%100/10;
- ge=RL%10000%1000%100%10;
- LcdWriteData(0x30+wan);
- LcdWriteData(0x30+qian);
- LcdWriteData(0x30+bai);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
光强程序12864改善2成功无应答程序.zip
(54.32 KB, 下载次数: 160)
|
评分
-
查看全部评分
|