找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LM75A温度传感器的应用电路 程序 中文资料

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-2-24 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 51黑黑黑 于 2016-3-3 00:55 编辑

(一)LM75A概述
LM75A 是一个高速I2C接口的温度传感器,可以在-55℃~+125℃的温度范围内将温度直接转换为数字信号,并可实现0.125℃的精度。MCU可以通过I2C总线直接读取其内部寄存器中的数据,并可通过I2C对4 个数据寄存器进行操作,以设置成不同的工作模式。LM75A有3 个可选的逻辑地址管脚,使得同一总线上可同时连接8 个器件而不发生地址冲突。LM75A 可配置成不同的工作模式。它可设置成在正常工作模式下周期性地对环境温度进行监控,或进入关断模式来将器件功耗降至最低。OS输出有2 种可选的工作模式:OS比较器模式和OS 中断模式,OS 输出可选择高电平或低电平有效。正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后阈值为75℃。低功耗设计,工作电流典型值为250uA,掉电模式为3.5uA;宽工作电压范围:2.8V~5.5V。
(二)  LM75A管脚

(三)LM75A内部寄存器
1温度寄存器Temp(地址0x00
温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。这两个字节中只有11位用来存放分辨率为0.125℃的Temp数据(以二进制补码数据的形式),如下表所示。对于8位的I2C总线来说,只要从LM75A的“00地址”连续读两个字节即可(温度的高8位在前)。

下表给出了一些Temp数据和温度值的例子。


2配置寄存器(地址0x01

配置寄存器为8 位可读写寄存器,其位功能分配如下表所示。

B7-B5:保留,默认为0
B4-B3:用来编程OS故障队列。
0011代表的值为1246,默认值为0
B2:用来选择OS极性。
B2=0OS低电平有效(默认);
B2=1OS高电平有效。
B1:选择OS工作模式。
B1=0,配置成比较器模式,直接控制外围电路;
B1=1OS控制输出功能配置成中断模式,以通知MCU进行相应处理。
B0:选择器件工作模式。
B0=0LM75A处于正常工作模式(默认);
B0=1LM75A进入关断模式。
3滞后寄存器Thyst0x02
滞后寄存器是读/写寄存器,也称为设定点寄存器,提供了温度控制范围的下限温度。每次转换结束后,Temp数据(取其高9 位)将会与存放在该寄存器中的数据相比较,当环境温度低于此温度的时候,LM75A将根据当前模式(比较、中断)控制OS 引脚作出相应反应。该寄存器都包含2 个8 位的数据字节,但2 个字节中,只有9 位用来存储设定点数据(分辨率为0.5℃的二进制补码),其数据格式如下表所示,默认为75℃。

4、超过温关断阈值寄存器Tos0x03
超温关断寄存器提供了温度控制范围的上限温度。每次转换结束后,Temp数据(取其高9位)将会与存放在该寄存器中的数据相比较,当环境温度高于此温度的时候,LM75A将根据当前模式(比较、中断)控制OS引脚作出相应反应。其数据格式如表 4 所示,默认为80℃。
(四)OS输出
OS输出为开漏输出口。为了观察到这个输出的状态,需要接一个外部上拉电阻,其阻值应当足够大(高达200kΩ),以减少温度读取误差。OS输出可通过编程配置寄存器的B2位设置为高或低有效。如下图所示,为LM75A在不同模式下OS 引脚对温度作出的响应。OS 设为低有效。

可以看出,当LM75A工作在比较器模式时,当温度高于Tos时,OS输出低电平。此时采取了降温措施,启动降温设备(如风扇),直到温度再降到Thyst,则停止降温,因此在这种模式下,LM75A可以直接控制外部电路来保持环境温度;而在中断模式,则在温度高于Tos或低于Thyst 时产生中断。注意:在中断模式下,只有当MCU 对LM75A 进行读操作后,其中断信号才会消失(图中OS 变为高电平)。
(五)I2C串行接口
在主控器的控制下,LM75A可以通过SCL和SDA作为从器件连接到I2C总线上。主控器必须提供SCL时钟信号,可以通过SDA读出器件数据或将数据写入到器件中。注意:必须在SCL和SDA端分别连接一个外部上拉电阻,阻值大约为10kΩ。LM75A从地址(7位地址)的低3位可由地址引脚A2、A1和A0的逻辑电平来决定。地址的高4位预先设置为‘1001’。下表给出了器件的完整地址,从表中可以看出,同一总线上可连接8个器件而不会产生地址冲突。由于输入管脚SCL、SDA、A2-A0内部无偏置,因此在任何应用中它们都不能悬空(这一点很重要)。
(六)温度测量电路

(七)51单片机源码
ORG0000             ;
               AJMP  L0
               ORG   000BH
               ORG 0013H;外部中断P3.3INT0入口地址
               ORG   001BH
               MOV P1,#0AAH
               RETI

               ORG 0025h
               T_SCL EQUP3.5;
               T_SDA EQUP3.4;

   L0:        MOV TMOD, #11H
              MOV 8CH, #3CH
               MOV 8AH,#0B0H
               CLREA               ; CPU总中断请求
QL:          MOV A,#00H
               MOVR2,#66D     ;清数据区;;
               MOV R0,#18H
QRAM:     MOV  @R0,  A
               INC  R0
               DJNZ  R2,  QRAM
               MOV R2,#00H
               ACALL TMP
               AJMP QL
TMP:       PUSH PSW
           LCALLSTA
           MOV A,#90H   ;写命令
           CALL I2C_SEND
           MOV  A,#00h               ; 温度寄存器地址00
           CALL I2C_SEND
           CALL STOP
;温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。这两个字节中只有11位用来存放分辨率为0.125℃的Temp数据
;(以二进制补码数据的形式),如表1所示。对于8位的I2C总线来说,只要从LM75A的“00;地址”连续读两个字节即可(温度的高8位在前)
           LCALLSTA
           MOV A,#91H   ;读命令
           CALL I2C_SEND
           LCALLRDBYT
           MOV2FH,A
           LCALLMACK
           LCALLRDBYT
           MOV30H,A
           LCALLMNACK
           LCALLSTOP
           MOVA,2FH
           JNBACC.7,ZH1    ;最高位是0为零是正温度转ZH1
           SETB 20H.7      ;保存正负温度标志 ;最高位是1为零下温度取反加1                                   
           MOV A,2FH         ;例如温度是-54.875度,源码=1100 1001001XXXXX 例如温度72.75,30h=48h,31h=40h,加在一起是01001000(=30H)010xxxxx=(31H)
           CPL A            ;00110110=(30H)
           MOV 2FH,A         ;高位取反
           MOV A,30H         ;低位取反110XXXXX
           CPL A            ;110XXXXXX=(31H)
           MOV30H,A
           MOV A,#01H     ;10110111=B7
           ADDA,30H
           MOV30H,A
           CLR A
           ADDC A,2FH     ;例如温度是-54.875度=-439*.125,补码649h,-649h=1 110 0100 1001
           MOV 2FH,A     ;结果是32h=01,33h=b7,合并成1b7h取反=00110110110,加1=00110110111为正码1b7h=439,39*.125=54.875         
ZH1:       MOV R2,#5
ZH2:       MOV A,2FH
           CLR C
           RRC A        ;低位进C 01001000的0进C
           MOV2FH,A
           MOVA,30H
           RRC A         ;C进高位 0010xxxx
           MOV30H,A
           DJNZR2,ZH2
           MOVR1,#2FH            ;送显示
           MOV R4,#2
           LCALL XS
           POPPSW
           RET

STA:       SETB SDA    ;启动
           SETBSCL
           CALLWAIT;NOP
           NOP
           CLRSDA
           CALLWAIT;NOP
           NOP
           CLRSCL
           RET

STOP:      CLR SDA        ;停止
           SETBSCL
           CALLWAIT;NOP
           NOP
           SETBSDA
           CALLWAIT;NOP
           NOP
           CLRSCL
           RET

MACK:      CLR SDA        ;发送应答位
           SETBSCL
           CALLWAIT;NOP
           NOP
           CLRSCL
           SETBSDA
           RET

MNACK:     SETB SDA        ;发送非应答信号
           SETBSCL
           CALLWAIT
           NOP
           CLRSCL
           CLRSDA
           RET

RDBYT:         MOV R0,#08H        ;接收一个字节数据子程序,占用:R0,R2,C
RLP:           SETBSDA
RLP8:          SETB SCL
                  NOP           ;大于4微秒
              CALL WAIT
              MOV C,SDA
      RLC A
              CLR SCL
              CALL WAIT
              DJNZ R0,RLP8
RLP1:          RET
WAIT:
           MOV R6,#5
       again:
           DJNZ R6,again
           RET

I2C_SEND:
           MOV R1,#8      ;
      next_out:
           CLR  SCL             ;
           SETB SDA             ;
           RLC  A               ;
           JC   wr_one          ;
           CLR  SDA             ;
      wr_one:
           LCALL WAIT           ;
           SETB SCL             ;
           LCALL WAIT            ;
           DJNZ R1, next_out     ;
           CLR  SCL             ;
           CALL WAIT            ;
           SETB SDA             ;
           LCALL I2C_ACK
           RET

I2C_ACK:                        ;应答
           SETB SCL
           ACALLWAIT
NACK:
           JNB  SDA, YACK       ;
           JMP  NACK
YACK:
           ACALLWAIT
           CLR  SCL
          RET

XS:                  MOV R3, #9
XS1:                 MOV R5,#0FFH
  DIS                MOV DPTR, #0FC0H
                      MOV A, @R1
                      ANL A, #0F0H
                      SWAP A
                        MOVCA, @A+DPTR
                      MOV P0,A
                         SETB  P2.1
                      ACALL YS1
                      CLR p2.1
                      MOV A, @R1
                      ANL  A, #0FH
                        MOVCA, @A+DPTR
                      MOV P0,A
                     SETB  P2.0
                     ACALL YS1
                     CLR p2.0
J6:                  DJNZ R5,DIS
                      DJNZR3,DIS
                      INCR1
                      CLR P2.0
                      CLR P2.1
                      ACALLDELAY2
                      DJNZR4,XS
                     RET

YS1:                MOV     7FH,   #0FFH
YS22:               DJNZ    7FH,   YS22
                      RET

DELAY:          MOV   R5,#88H
DEL:               NOP
                     DJNZ  R5,DEL
                     RET

DELAY2:         MOV   R6, #0FFH
DE:                 ACALL DELAY
                     DJNZ R6,DE
                     RET
     ORG 0FC0H
DB 3FH
DB 03H
DB 6DH
DB 67H
DB 53H
DB 76H,7EH,23H
DB 7FH,77H,73H,5EH,3CH
DB 4FH,0FCH,78H
END

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

使用道具 举报

沙发
ID:926716 发表于 2021-5-24 22:57 | 只看该作者
请问如果用51单片机只是单纯的实时读取LM75A数据,LM75A的SDA和SCL连接51单片机除P0外的引脚时,需要在他们之间串联一个上拉电阻吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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