找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9365|回復(fù): 17
收起左側(cè)

51單片機(jī)TSL2561光強(qiáng)檢測(cè)程序 12864液晶顯示

  [復(fù)制鏈接]
ID:446267 發(fā)表于 2018-12-17 19:06 | 顯示全部樓層 |閱讀模式
51單片機(jī)12864液晶tsl2561光強(qiáng)傳感器,調(diào)試成功
195207m4nidndzic5i455n.jpg
單片機(jī)源程序如下:
  1. #include
  2. #include
  3. #include

  4. /*********************************************
  5. 下均為IIC和光強(qiáng)所需程序

  6. **********************************************/
  7. #include
  8. //設(shè)備讀寫(xiě)地址



  9. ////命令控制寄存器
  10. #define CONTROL 0x80
  11. #define TIMING        0x81
  12. #define        DATA0LOW 0x8C
  13. #define        DATA0HIGH 0x8D
  14. #define        DATA1LOW  0x8E
  15. #define        DATA1HIGH 0x8F

  16. //TSL2561地址


  17. typedef signed   int  sint;
  18. typedef unsigned long u32;

  19. uint DataLow0,DataHigh0,DataLow1,DataHigh1;
  20. float ratioc;
  21. sint Lux=0;
  22. uchar command,temp;
  23. uint Channel1,Channel0;



  24. void i2c_delay()                //10us
  25. {
  26.         unsigned char a,b;
  27.         for(b=1;b>0;b--)
  28.                 for(a=2;a>0;a--);

  29. }







  30. //初始化延時(shí)函數(shù)
  31. void init_delay(void)
  32. {
  33.     static time =10000;
  34.         while(time--);
  35. }

  36.   //初始化函數(shù)

  37. void i2c_init(void)
  38. {
  39.         i2c_scl = 1;//釋放時(shí)鐘線
  40.         init_delay();
  41.         i2c_sda = 1;//釋放數(shù)據(jù)線
  42.         init_delay();
  43. }


  44. //起始信號(hào)
  45. void i2c_start(void)
  46. {
  47.         i2c_sda=1;
  48.         i2c_delay();
  49.         i2c_scl=1;
  50.         i2c_delay();
  51.         i2c_sda=0;
  52.         i2c_delay();
  53.         i2c_scl=0;
  54.         i2c_delay();
  55. }
  56. //停止信號(hào)
  57. void i2c_stop(void)
  58. {
  59.           i2c_sda = 0;
  60.         i2c_delay();
  61.           i2c_scl = 1;
  62.          i2c_delay();
  63.           i2c_sda = 1;
  64.         i2c_delay();
  65. }



  66. uchar write_byte(unsigned char dat)
  67. {
  68.         unsigned char a=0,b=0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。               
  69.         for(a=0;a<8;a++)//要發(fā)送8位,從最高位開(kāi)始
  70.         {
  71.                 i2c_sda=dat>>7;         //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào)
  72.                 dat=dat<<1;
  73.                 i2c_delay();
  74.                 i2c_scl=1;
  75.                 i2c_delay();//建立時(shí)間>4.7us
  76.                 i2c_scl=0;
  77.                 i2c_delay();//時(shí)間大于4us               
  78.         }
  79.         i2c_sda=1;
  80.         i2c_delay();
  81.         i2c_scl=1;
  82.         while(i2c_sda)//等待應(yīng)答,也就是等待從設(shè)備把SDA拉低
  83.         {
  84.                 b++;
  85.                 if(b>200)         //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
  86.                 {
  87.                         i2c_scl=0;
  88.                         i2c_delay();
  89.                         return 0;
  90.                 }
  91.         }
  92.         i2c_scl=0;
  93.         i2c_delay();
  94.          return 1;               
  95. }




  96. unsigned char read_byte()
  97. {
  98.         unsigned char a=0,dat=0;
  99.         i2c_sda=1;                        //起始和發(fā)送一個(gè)字節(jié)之后SCL都是0
  100.         i2c_delay();
  101.         for(a=0;a<8;a++)//接收8個(gè)字節(jié)
  102.         {
  103.                 i2c_scl=1;
  104.                 i2c_delay();
  105.                 dat<<=1;
  106.                 dat|=i2c_sda;
  107.                 i2c_delay();
  108.                 i2c_scl=0;
  109.                 i2c_delay();
  110.         }
  111.         return dat;               
  112. }





  113. //TSL2561寫(xiě)函數(shù)
  114. //-------------------------------------------------
  115. void TSL2561_Write(uchar command,uchar date)
  116. {
  117.         i2c_start();
  118.         write_byte(SLAVE_ADDR_WR);
  119.         //respons();
  120.         write_byte(command);
  121.         //respons();
  122.         write_byte(date);
  123.         //respons();
  124.         i2c_stop();
  125. }
  126. //讀函數(shù)
  127. //-------------------------------------------------
  128. uchar TSL2561_Read(uchar command)
  129. {
  130.         uchar date;
  131.         i2c_start();
  132.         write_byte(SLAVE_ADDR_WR);
  133.           //respons();
  134.         write_byte(command);
  135.         //respons();
  136.         i2c_start();
  137.         write_byte(SLAVE_ADDR_WR+1);
  138.         //respons();
  139.         date=read_byte();
  140.         i2c_stop();
  141.         return date;
  142. }

  143. //------------------------------------------
  144. //讀取光照強(qiáng)度
  145. sint Read_Light(void)
  146. {
  147.    
  148.         DataLow0 = TSL2561_Read(DATA0LOW);
  149.         DataHigh0 = TSL2561_Read(DATA0HIGH);
  150.         Channel0 = 256*DataHigh0 + DataLow0;
  151.         
  152.         //------------------------------
  153.         DataLow1 = TSL2561_Read(DATA1LOW);
  154.         DataHigh1 = TSL2561_Read(DATA1HIGH);
  155.         Channel1 = 256*DataHigh1 + DataLow1;
  156.         
  157.         //---------------------------------
  158.         //Calculating Lux         for tmb封裝
  159.         ratioc  =         Channel1/Channel0;
  160.         if (0 < ratioc <= 0.50)  Lux = 0.0304 * Channel0 - 0.062 * Channel0 *pow((Channel1/Channel0) ,1.4 );
  161.     if (0.50 < ratioc <= 0.61) Lux = 0.0224 *Channel0 - 0.031 * Channel1;
  162.     if (0.61 < ratioc <= 0.80 )Lux = 0.0128 * Channel0 - 0.0153 * Channel1;
  163.     if (0.80 < ratioc <= 1.30) Lux = 0.00146 * Channel0 - 0.00112 * Channel1;
  164.     if (ratioc > 1.30) Lux = 0;
  165.         return Lux;
  166. }


  167. //直接調(diào)用
  168. void tsl2561_Init(void)
  169. {
  170.         i2c_init();                                        //i2c初始化
  171.         TSL2561_Write(CONTROL,0x03);        //啟動(dòng)原件
  172.         init_delay();                                                //防止數(shù)據(jù)出錯(cuò)
  173.     TSL2561_Write(TIMING,0x02);                //積分時(shí)間
  174.         //TSL2561_Write(0xC6,0x30);                //中斷           
  175. }







  176. /********************************
  177. 主函數(shù)main
  178. **********************************/
  179. void main()
  180. {
  181.         uchar i=0;
  182.         uchar code DIS1[]={"光強(qiáng)1:"},code DIS2[]={"光強(qiáng)R-L:"},code DIS3[]={"通道0:"},code DIS4[]={"通道1:"};
  183.         uint ge,shi,bai,qian,wan,W1,Q1,B1,S1,G1,W0,Q0,B0,S0,G0;
  184.         sint CH1,RL,CH0;                                   //16位

  185.         tsl2561_Init();
  186.         LcdInit();
  187.         LcdWriteCom(0x80);
  188.         while(DIS1[i]!='')
  189.             LcdWriteData(DIS1[i++]);
  190.         i=0;

  191.         LcdWriteCom(0x90);
  192.         while(DIS1[i]!='')
  193.             LcdWriteData(DIS2[i++]);
  194.         i=0;

  195.         LcdWriteCom(0x88);
  196.         while(DIS1[i]!='')
  197.             LcdWriteData(DIS3[i++]);
  198.         i=0;

  199.         LcdWriteCom(0x98);
  200.         while(DIS1[i]!='')
  201.             LcdWriteData(DIS4[i++]);
  202.         
  203.         while(1)
  204.         {
  205.                

  206.                 RL=Read_Light();         //讀取光強(qiáng)        
  207.                
  208.                 CH0=Channel0;         
  209.                 CH1=Channel1;

  210.                 LcdWriteCom(0x90);                 
  211.                 wan=RL/10000;
  212.                 qian=RL%10000/1000;
  213.                 bai=RL%10000%1000/100;
  214.                 shi=RL%10000%1000%100/10;
  215.                 ge=RL%10000%1000%100%10;               
  216.                 LcdWriteData(0x30+wan);
  217.                 LcdWriteData(0x30+qian);
  218.                 LcdWriteData(0x30+bai);
  219. ……………………

  220. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
光強(qiáng)程序12864改善2成功無(wú)應(yīng)答程序.zip (54.32 KB, 下載次數(shù): 160)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2018-12-17 19:09 | 顯示全部樓層
補(bǔ)全原理圖或者詳細(xì)說(shuō)明一下電路連接即可獲得100+黑幣
回復(fù)

使用道具 舉報(bào)

ID:450241 發(fā)表于 2018-12-19 21:01 來(lái)自手機(jī) | 顯示全部樓層
請(qǐng)問(wèn)一下,代碼里的slave_addr_wr是0
回復(fù)

使用道具 舉報(bào)

ID:450241 發(fā)表于 2018-12-19 21:03 來(lái)自手機(jī) | 顯示全部樓層
請(qǐng)問(wèn)一下代碼里的slave_addr_wr是0x72么?我照這樣測(cè)試后,發(fā)現(xiàn)液晶一直顯示00022,沒(méi)有變化(我自己換了1602的顯示)
回復(fù)

使用道具 舉報(bào)

ID:446267 發(fā)表于 2018-12-24 13:08 | 顯示全部樓層
Cedar_924 發(fā)表于 2018-12-19 21:03
請(qǐng)問(wèn)一下代碼里的slave_addr_wr是0x72么?我照這樣測(cè)試后,發(fā)現(xiàn)液晶一直顯示00022,沒(méi)有變化(我自己換了1602 ...

wr是0x72,用的是12864液晶,接線自己參考12864中文資料,你說(shuō)的這個(gè)00022是有應(yīng)答程序respons()函數(shù)的版本,我試過(guò)等待應(yīng)答程序加進(jìn)去就是00022,所以不行
回復(fù)

使用道具 舉報(bào)

ID:446267 發(fā)表于 2018-12-24 13:18 | 顯示全部樓層
Cedar_924 發(fā)表于 2018-12-19 21:03
請(qǐng)問(wèn)一下代碼里的slave_addr_wr是0x72么?我照這樣測(cè)試后,發(fā)現(xiàn)液晶一直顯示00022,沒(méi)有變化(我自己換了1602 ...

我這帖子下面有調(diào)試好的51單片機(jī)液晶12864的tsl2561程序 壓縮包
回復(fù)

使用道具 舉報(bào)

ID:453467 發(fā)表于 2018-12-24 14:58 | 顯示全部樓層
無(wú)應(yīng)答為什么要把時(shí)鐘線寫(xiě)0?

                if(b>200)         //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
                {
                        i2c_scl=0;
                        i2c_delay();
                        return 0;
                }
回復(fù)

使用道具 舉報(bào)

ID:446267 發(fā)表于 2018-12-24 18:05 | 顯示全部樓層
iseesx 發(fā)表于 2018-12-24 14:58
無(wú)應(yīng)答為什么要把時(shí)鐘線寫(xiě)0?

                if(b>200)         //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗, ...

強(qiáng)行結(jié)束上一次數(shù)據(jù)的接收,
回復(fù)

使用道具 舉報(bào)

ID:446267 發(fā)表于 2018-12-24 18:06 | 顯示全部樓層
iseesx 發(fā)表于 2018-12-24 14:58
無(wú)應(yīng)答為什么要把時(shí)鐘線寫(xiě)0?

                if(b>200)         //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗, ...

因?yàn)檎G闆r下接收一次是不會(huì)超過(guò)2000us的,
回復(fù)

使用道具 舉報(bào)

ID:500275 發(fā)表于 2019-4-15 13:53 | 顯示全部樓層
response函數(shù)為什么要注釋掉,沒(méi)有response可以嗎?
回復(fù)

使用道具 舉報(bào)

ID:446267 發(fā)表于 2019-4-18 19:47 | 顯示全部樓層
ghost1150 發(fā)表于 2019-4-15 13:53
response函數(shù)為什么要注釋掉,沒(méi)有response可以嗎?

我這個(gè)用的51注釋了可以正常運(yùn)行,其他的單片機(jī)就不知道了
回復(fù)

使用道具 舉報(bào)

ID:552184 發(fā)表于 2019-6-2 20:26 | 顯示全部樓層
這個(gè)有和TSL2561的連接的電路圖嗎
回復(fù)

使用道具 舉報(bào)

ID:107923 發(fā)表于 2019-6-17 17:47 | 顯示全部樓層

這個(gè)有和TSL2561的連接的電路圖嗎
回復(fù)

使用道具 舉報(bào)

ID:640113 發(fā)表于 2019-11-12 17:10 | 顯示全部樓層
TSL2561的中斷引腳接在哪里
回復(fù)

使用道具 舉報(bào)

ID:640113 發(fā)表于 2019-11-12 17:11 | 顯示全部樓層
TSL2561的中斷引腳接在哪里
回復(fù)

使用道具 舉報(bào)

ID:662064 發(fā)表于 2020-5-5 21:51 | 顯示全部樓層
怎么處理光敏電阻傳遞的信號(hào)啊
回復(fù)

使用道具 舉報(bào)

ID:843718 發(fā)表于 2021-4-12 11:08 | 顯示全部樓層
樓主,你顯示的光照強(qiáng)度和照度計(jì)相似嗎?為什么我的比照度計(jì)顯示的要低很多
回復(fù)

使用道具 舉報(bào)

ID:147329 發(fā)表于 2022-4-3 19:31 | 顯示全部樓層
大神~膜拜,下載好好學(xué)習(xí)下,看評(píng)論區(qū)中顯示有很多經(jīng)驗(yàn)性的處理代碼,比如時(shí)鐘線拉低~~~
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表