|
51單片機12864液晶tsl2561光強傳感器,調試成功
195207m4nidndzic5i455n.jpg (107.91 KB, 下載次數: 113)
下載附件
2019-4-23 01:45 上傳
單片機源程序如下:
- #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)
2018-12-17 19:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|