[讨论] 【FR4133搞机】i2c温度传感器

ljj3166   2015-12-4 00:07 楼主
IMG_20151201_185318095.jpg
这块片子从Ti那申请到手
吃灰快一年了
想着FR4133没有伴儿
放出来陪着耍耍
IIC接口的温度传感器
工作时45μA,关断时0.3μA
正常温度范围-20°C至+85°C时,误差在0.5°C

我撸
  1. void Write(uchar address,uchar date)
  2. {
  3.        start();                   //启动信号
  4.        wr_byte(WRDADDS);   //I2C器件地址,寻址写
  5.        while(respons());                     //应答信号
  6.        wr_byte(address);   //选择单元地址
  7.        while(respons());                    //应答信号
  8.        wr_byte(date);              //写数据
  9.        while(respons());                  //应答信号
  10.        stop();                          //停止信号
  11. }

  12. uchar Read(uchar address)
  13. {
  14.        uint temp;
  15.        start();                   //开始信号
  16.        wr_byte(WRDADDS);   //I2C器件地址,寻址写
  17.        while(respons());                     //应答信号
  18.        wr_byte(address);   //选择单元地址 信号
  19.        while(respons());                   //应答信号
  20.        start();                   //重发启动信号
  21.        wr_byte(RDDADDS);   //I2C器件地址,寻址读
  22.        while(respons());                   //应答信号
  23.        temp = rd_byte();   //读数据(函数返回值)
  24.        stop();                          //停止信号
  25.        return temp;
  26. }
  27. void ack_master()
  28. {
  29.         SDA_OUT;
  30.         SDA_L;
  31.         delay();
  32.         SCL_H;
  33.         delay();
  34.         SCL_L;
  35.         delay();
  36.         SDA_H;
  37.         delay();
  38. }

  39. uint Read_temprature(uchar address)
  40. {
  41.        uint temp;
  42.        start();                   //开始信号
  43.        wr_byte(WRDADDS);   //I2C器件地址,寻址写
  44.        while(respons());                     //应答信号
  45.        wr_byte(address);   //选择单元地址 信号
  46.        while(respons());                   //应答信号
  47.        stop();
  48.        start();                   //重发启动信号
  49.        wr_byte(RDDADDS);   //I2C器件地址,寻址读
  50.        while(respons());                   //应答信号
  51.        temp = rd_byte()<<8;   //读数据(函数返回值)
  52.        ack_master();
  53.        temp |= rd_byte();
  54.        ack_master();
  55.        stop();                          //停止信号
  56.         return temp;
  57. }

  58. void start()
  59. {                SDA_OUT;
  60.        SDA_H;
  61.        delay();
  62.        SCL_H;
  63.        delay();
  64.        SDA_L;
  65.        delay();
  66.        SCL_L;
  67.        delay();
  68. }

  69. void stop()
  70. {        SDA_OUT;
  71.        SDA_L;
  72.        delay();
  73.        SCL_H;
  74.        delay();
  75.        SDA_H;
  76.        delay();
  77. }

  78. uchar respons()
  79. {
  80.        uchar temp=0;
  81.        SDA_OUT;
  82.        SDA_H;
  83.        delay();
  84.        SCL_H;
  85.        delay();
  86.        SDA_IN;
  87.        if(P5IN&BIT2)
  88.                      {temp = 0x01;}
  89.                      else{temp = 0x00;}
  90.        SCL_L;
  91.        delay();
  92.        return temp;
  93. }

  94. void wr_byte(uchar date)
  95. {
  96.        uchar i;
  97.        for(i=0;i<8;i++)
  98.        {
  99.                SDA_OUT;
  100.               if(date&0x80)
  101.               {
  102.               SDA_H;}
  103.               else {SDA_L;}
  104.               delay();
  105.               SCL_H;
  106.               delay();
  107.               SCL_L;
  108.               delay();
  109.               date=date<<1;
  110.        }
  111. }

  112. uchar rd_byte()
  113. {
  114.        uchar i,temp,tempx;
  115.        for(i=0;i<8;i++)
  116.        {
  117.                SDA_IN;
  118.               SCL_H;
  119.               delay();
  120.               if(P5IN&BIT2)
  121.               {tempx = 0x01;}
  122.               else{tempx = 0x00;}
  123.               temp=(temp<<1)|tempx;
  124.               delay();
  125.               SCL_L;
  126.               delay();
  127.        }
  128.        return temp;
  129. }

  130. void delay()
  131. {
  132.         __delay_cycles(8);
  133. }
一些定义
  1. #define SCL_OUT        P5DIR |= BIT3;
  2. #define SDA_IN        P5DIR &= ~BIT2;
  3. #define SDA_OUT        P5DIR |= BIT2;
  4. #define SDA_H        P5OUT |= BIT2;
  5. #define SDA_L        P5OUT &= ~BIT2;
  6. #define SCL_H        P5OUT |= BIT3;
  7. #define SCL_L        P5OUT &= ~BIT3;
  8. uchar WRDADDS= 0x90  ;         /*宏定义I2C器件地址,寻址写*/
  9. uchar RDDADDS =0x91 ;            /*宏定义I2C器件地址,寻址读*/



QQ截图20151203235354.jpg
有仿真就是方便

哟哟切克闹,温度玩起来
  1. while(1)
  2.     {
  3.             Write(0x00,0x00);
  4.             __delay_cycles(10000);
  5.                        num = Read_temprature(0x00);
  6.                        temprature = (num>>4)*0.0625;
  7.                        if(temprature>25.0)
  8.                        {P3OUT &= ~BIT0;}
  9.                        else {P3OUT |= BIT0;}
  10.     }

我按我按我按
fsa.gif

可惜用库的硬件IIC
没有搞定
有空再来

So TM what......?

回复评论 (7)

“IIC接口的温度传感器
工作时45μA,关断时0.3μA”
是手册上的理论值,还是串联万用表实测的?
喝最烈的酒,..DIY最实用的东西
点赞  2015-12-4 08:31
TMP75性能不错的,就是性价比不高
点赞  2015-12-4 09:31
TMP75性能不错
点赞  2015-12-4 10:01
引用: lidonglei1 发表于 2015-12-4 08:31
“IIC接口的温度传感器
工作时45μA,关断时0.3μA”
是手册上的理论值,还是串联万用表实测的?

惭愧惭愧,手册上的
So TM what......?
点赞  2015-12-4 13:13
引用: dcexpert 发表于 2015-12-4 09:31
TMP75性能不错的,就是性价比不高

是有点贵
So TM what......?
点赞  2015-12-4 13:14
引用: damiaa 发表于 2015-12-4 10:01
TMP75性能不错

Tmp1xx的更不错
So TM what......?
点赞  2015-12-4 13:15

挺不错,和ds18b20相比,也有自己的优点。

      我们专门研发了一线总线采集模块LCT2662M,还有仪表LCT2201C,可以采集常用的一线总线器件ds18b20,还有模拟量ds2438等。支持64个ds18b20同时采集。输出rs485总线,便于和电脑等终端通讯,常用于粮库粮仓测温,煤筒仓测温,水蓄冷测温等等。

  

北京长信物联科技有限公司 专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。 www.lct2000.cn QQ:1930227091
点赞  2019-9-27 23:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复