找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7528|回复: 17
打印 上一主题 下一主题
收起左侧

51单片机TSL2561光强检测程序 12864液晶显示

  [复制链接]
跳转到指定楼层
楼主
51单片机12864液晶tsl2561光强传感器,调试成功

单片机源程序如下:
  1. #include
  2. #include
  3. #include

  4. /*********************************************
  5. 下均为IIC和光强所需程序

  6. **********************************************/
  7. #include
  8. //设备读写地址



  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. //初始化延时函数
  31. void init_delay(void)
  32. {
  33.     static time =10000;
  34.         while(time--);
  35. }

  36.   //初始化函数

  37. void i2c_init(void)
  38. {
  39.         i2c_scl = 1;//释放时钟线
  40.         init_delay();
  41.         i2c_sda = 1;//释放数据线
  42.         init_delay();
  43. }


  44. //起始信号
  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. //停止信号
  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,一个机器周期为1us,最大延时255us。               
  69.         for(a=0;a<8;a++)//要发送8位,从最高位开始
  70.         {
  71.                 i2c_sda=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
  72.                 dat=dat<<1;
  73.                 i2c_delay();
  74.                 i2c_scl=1;
  75.                 i2c_delay();//建立时间>4.7us
  76.                 i2c_scl=0;
  77.                 i2c_delay();//时间大于4us               
  78.         }
  79.         i2c_sda=1;
  80.         i2c_delay();
  81.         i2c_scl=1;
  82.         while(i2c_sda)//等待应答,也就是等待从设备把SDA拉低
  83.         {
  84.                 b++;
  85.                 if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
  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;                        //起始和发送一个字节之后SCL都是0
  100.         i2c_delay();
  101.         for(a=0;a<8;a++)//接收8个字节
  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写函数
  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. //读函数
  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. //读取光照强度
  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. //直接调用
  168. void tsl2561_Init(void)
  169. {
  170.         i2c_init();                                        //i2c初始化
  171.         TSL2561_Write(CONTROL,0x03);        //启动原件
  172.         init_delay();                                                //防止数据出错
  173.     TSL2561_Write(TIMING,0x02);                //积分时间
  174.         //TSL2561_Write(0xC6,0x30);                //中断           
  175. }







  176. /********************************
  177. 主函数main
  178. **********************************/
  179. void main()
  180. {
  181.         uchar i=0;
  182.         uchar code DIS1[]={"光强1:"},code DIS2[]={"光强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();         //读取光强        
  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
光强程序12864改善2成功无应答程序.zip (54.32 KB, 下载次数: 154)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-17 19:09 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:450241 发表于 2018-12-19 21:01 来自手机 | 只看该作者
请问一下,代码里的slave_addr_wr是0
回复

使用道具 举报

地板
ID:450241 发表于 2018-12-19 21:03 来自手机 | 只看该作者
请问一下代码里的slave_addr_wr是0x72么?我照这样测试后,发现液晶一直显示00022,没有变化(我自己换了1602的显示)
回复

使用道具 举报

5#
ID:446267 发表于 2018-12-24 13:08 | 只看该作者
Cedar_924 发表于 2018-12-19 21:03
请问一下代码里的slave_addr_wr是0x72么?我照这样测试后,发现液晶一直显示00022,没有变化(我自己换了1602 ...

wr是0x72,用的是12864液晶,接线自己参考12864中文资料,你说的这个00022是有应答程序respons()函数的版本,我试过等待应答程序加进去就是00022,所以不行
回复

使用道具 举报

6#
ID:446267 发表于 2018-12-24 13:18 | 只看该作者
Cedar_924 发表于 2018-12-19 21:03
请问一下代码里的slave_addr_wr是0x72么?我照这样测试后,发现液晶一直显示00022,没有变化(我自己换了1602 ...

我这帖子下面有调试好的51单片机液晶12864的tsl2561程序 压缩包
回复

使用道具 举报

7#
ID:453467 发表于 2018-12-24 14:58 | 只看该作者
无应答为什么要把时钟线写0?

                if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
                {
                        i2c_scl=0;
                        i2c_delay();
                        return 0;
                }
回复

使用道具 举报

8#
ID:446267 发表于 2018-12-24 18:05 | 只看该作者
iseesx 发表于 2018-12-24 14:58
无应答为什么要把时钟线写0?

                if(b>200)         //如果超过2000us没有应答发送失败, ...

强行结束上一次数据的接收,
回复

使用道具 举报

9#
ID:446267 发表于 2018-12-24 18:06 | 只看该作者
iseesx 发表于 2018-12-24 14:58
无应答为什么要把时钟线写0?

                if(b>200)         //如果超过2000us没有应答发送失败, ...

因为正常情况下接收一次是不会超过2000us的,
回复

使用道具 举报

10#
ID:500275 发表于 2019-4-15 13:53 | 只看该作者
response函数为什么要注释掉,没有response可以吗?
回复

使用道具 举报

11#
ID:446267 发表于 2019-4-18 19:47 | 只看该作者
ghost1150 发表于 2019-4-15 13:53
response函数为什么要注释掉,没有response可以吗?

我这个用的51注释了可以正常运行,其他的单片机就不知道了
回复

使用道具 举报

12#
ID:552184 发表于 2019-6-2 20:26 | 只看该作者
这个有和TSL2561的连接的电路图吗
回复

使用道具 举报

13#
ID:107923 发表于 2019-6-17 17:47 | 只看该作者

这个有和TSL2561的连接的电路图吗
回复

使用道具 举报

14#
ID:640113 发表于 2019-11-12 17:10 | 只看该作者
TSL2561的中断引脚接在哪里
回复

使用道具 举报

15#
ID:640113 发表于 2019-11-12 17:11 | 只看该作者
TSL2561的中断引脚接在哪里
回复

使用道具 举报

16#
ID:662064 发表于 2020-5-5 21:51 | 只看该作者
怎么处理光敏电阻传递的信号啊
回复

使用道具 举报

17#
ID:843718 发表于 2021-4-12 11:08 | 只看该作者
楼主,你显示的光照强度和照度计相似吗?为什么我的比照度计显示的要低很多
回复

使用道具 举报

18#
ID:147329 发表于 2022-4-3 19:31 | 只看该作者
大神~膜拜,下载好好学习下,看评论区中显示有很多经验性的处理代码,比如时钟线拉低~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表