LM75A的数字温度计的设计

发布者:EnigmaticSoul最新更新时间:2016-04-08 来源: eefocus关键字:LM75A  数字温度计 手机看文章 扫描二维码
随时随地手机看文章
LM75A是PHILPS公司生产的数字温度传感器及看门狗。通过片内集成的带隙温度传感器和∑-△数摸转换器来实现数字温度的测量,并通过该温度传感器为用户提供温度超限报警输出。LM75A内部包含多个数据寄存器:(1)配置寄器(Conf):用来存储器件的配置,如:器件工作模式、OS工作模式、OS极性和OS故障队列;(2)温度寄存器(Temp):用于存储读取的数字温度;(3)设定点寄存器(Tos&Thyst):用来存储可编程的过热关断和滞后限制。器件通过2线的串行I2C总线接口与控制器通信。LM75A包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时挂8个LM75A而无需其他硬件的支持

CPU:STC89C54RD+
晶震:11.0592M
A0 A1 A2 均接地 地址设置为0 OS脚和INT0相连并通过10K上拉到VCC;当转换温度超过极限温度,输出中断蜂鸣器报警;刷新数码管显示温度 共5位前一位表示正负温度后三位为温度125 - -55 最后一位为0.1度 最高可精确到0.125 数码管图略定时器100MS采集温度一次

[转载]LM75A的数字温度计的设计

 

#include
#include
#include

sbit xiaoshu=P2^0;   //COM口
sbit ge=P2^1;
sbit shi=P2^3;
sbit bai=P2^4;
sbit fh=P2^5;
sbit SDA_LM75=P1^0;   //数据
sbit SCL_LM75=P1^1;
sbit BP=P2^1;
bit dp=0;
unsigned char JS=0;


#define     LED     P0   //8位数码管 动态时时刷新

#define CONF   0X01  //配置寄存器
#define TEMP   0X00  //温度寄存器 只读
#define ALARM  0X03  //超温关闭极限寄存器默认5000H
#define DELAY  0X02  //滞后寄存器默认4B00H
#define WADDR   0X90  //写地址
#define RADDR   0X91  //读地址

unsigned int tempdata=0; //全局变量申明温度

unsigned char code tab[]={ 0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x40};//共阴
                        //0,    1,                9
//unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
                        //0,    1,                9

unsigned char code tabdp[]={ 0xbf,0xb0,0xed,0xf9,0xf2,0xdb,0xdf,0xb1,0xff,0xfb,0xc0};//共阴带小数点
                        //0,    1,                9
//unsigned char tabdp[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳


void delay_xms(unsigned int count) //延时函数
{
register unsigned char j;
while (count --)
{
for (j=0;j<125;j++) //约1MS
{
}
}
}


void Led_Display(unsigned int i,bit mode)             //显示函数
{
   if(mode)
   LED = 0x40;  //共阴负
   //LED=0xBF;  
   else
   LED = 0x00;
   //LED= 0XFF;
   fh = 1;
   bai = 0;
   shi = 0;
   ge = 0;
   xiaoshu=0;
   delay_xms(1);
   LED = tab[i/1000];
   i%=1000;
   fh = 0;
   bai = 1;
   shi = 0;
   ge = 0;
   xiaoshu=0;
   delay_xms(1);
   LED = tab[i/100];
   i%=100;
   fh=0;
   bai = 0;
   shi = 1;
   ge = 0;
   xiaoshu=0;
   delay_xms(1);
   LED = tabdp[i/10];   //带小数点
   fh=0;
   bai = 0;
   shi = 0;
   ge = 1;
   xiaoshu=0;
   delay_xms(1);
   LED = tab[i%10];
   fh=0;
   bai = 0;
   shi = 0;
   ge = 0;
   xiaoshu=1;
   delay_xms(1);
}

void delay(void) //延时函数
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void start_lm75(void)//起始
{
SDA_LM75=1;
SCL_LM75=1;
delay();
SDA_LM75=0;
delay();
SCL_LM75=0;
}

void stop_lm75(void)//停止
{
SDA_LM75=0;
SCL_LM75=1;
delay();
SDA_LM75=1;
delay();
SCL_LM75=0;
}

void Check_Ack(void) //检查应答信号
{
SDA_LM75=1;
SCL_LM75=1;
F0=0;
delay();
if(SDA_LM75) //如果数据为高 置位非应答标志FO
F0=1;        //通用标志位 PSW状态寄存器
SCL_LM75=0;  //准备下一变化数据
}

void Ack(void) //发响应信号
{
SDA_LM75=0;
delay();
SCL_LM75=1;
delay();
SCL_LM75=0;
}

void no_Ack(void) //发非响应信号
{
SDA_LM75=1;
SCL_LM75=0;
delay();
SCL_LM75=1; //迫使数据传输结束
delay();
}

void send_byte(unsigned char temp) //发送一字节数据
{
unsigned char i=8;
while(i--)
{
  SDA_LM75=(bit)(temp&0x80);
  SCL_LM75=1;
  delay();
  SCL_LM75=0;
  temp<<=1;
}
SCL_LM75=0;
delay();
SDA_LM75=1; //释放SDA数据线
}

unsigned char read_byte(void) //读一字节数据
{
unsigned char i=8;
unsigned char temp;
while(i--)
{
  temp<<=1;
  if(SDA_LM75)
  temp++;
  SCL_LM75=1;
  delay();
  SCL_LM75=0;
}
SCL_LM75=0;
delay();
SDA_LM75=1; //释放SDA数据线
return (temp);
}

void Write_chardata(unsigned char addr,unsigned char tempdata)//写配置寄存器
{
start_lm75();
send_byte(WADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
send_byte(addr);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
send_byte(tempdata);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
delay();
stop_lm75();
}

void Write_intdata(unsigned char addr,unsigned int tempdata)//写16位寄存器
{
unsigned char datahigh;
unsigned char datalow;
datahigh=(unsigned char)(tempdata>>8);
datalow=(unsigned char)(tempdata&0x00FF);
start_lm75();
send_byte(WADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
send_byte(addr);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
send_byte(datahigh);
send_byte(datalow);
Check_Ack();
if(F0)
{
  no_Ack();
  return;
}
Ack();
delay();
stop_lm75();
}

unsigned char read_chardata(unsigned char addr) //读8位寄存器
{
unsigned char temp;
start_lm75();
send_byte(WADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
send_byte(addr);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
send_byte(RADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
temp=read_byte();
stop_lm75();
return (temp);
}

unsigned int read_intdata(unsigned char addr) //读16位寄存器
{
unsigned char temphigh,templow;
start_lm75();
send_byte(WADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
send_byte(addr);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
send_byte(RADDR);
Check_Ack();
if(F0)
{
  no_Ack();
  return 0;
}
Ack();
temphigh=read_byte();
templow=(read_byte())&0xe0;
stop_lm75();
if(!(temphigh&0x80))
{
 dp=0;
return (((temphigh<<8)|templow)>>5);
}
else
{
 dp=1;
return (0x800-((temphigh<<8)|templow)>>5);
}
}

void initial() // 初始化LM75A
{
Write_chardata(CONF,0X20); //0S中断模式,温度转换正常模式
Write_intdata(ALARM,0x3300); //100度极限 由高9位有效位组成 BIT15为1表示为负为0表示为正超过100度 触发外部中断0
Write_intdata(DELAY,0X4A80); // 95度后不报警
}


void int0_int() interrupt 0 using 1 // 外部中断0服务函数
{
BP=0;
delay_xms(1000);
BP=1;
delay_xms(1000);
}
void t0_int() interrupt 1 using 1 //定时器0中断服务函数
{
 TR0=0;
 TH0=0xdc;  // 10MS中断初值
 TL0=0xff;
 TR0=1;
 JS++;
 if(JS>10)     //加到10为100MS
 {
 JS=0;
  tempdata=read_intdata(TEMP);  //采集数据
  tempdata=(tempdata/8)*10;   //转换为温度
 }
}

void main() // 入口函数
{
IP=0X01;
TMOD=0X01;
TH0=0xdc;  // 10MS中断初值
TL0=0xff;
IT0=0;  //外部中断0采用电平触发

ET0=1;
TR0=1;  //开放定时器0中断
EX0=1;
EA=1;
initial();
while(1)
{
  if(dp)
  Led_Display(tempdata,1);
  else
  Led_Display(tempdata,0);
}
}


关键字:LM75A  数字温度计 引用地址:LM75A的数字温度计的设计

上一篇:一种简单51单片机电子密码锁设计
下一篇:TEA5767的简单收音机设计

推荐阅读最新更新时间:2024-03-16 14:49

采用AD590数字温度计电路设计
   电路工作原理: 本电路是通过应用AD590专用集成温度传感器制成的温度计,具有结构简单、使用可靠、精度高的特点,100V的交流电压通过变压器T1、整流桥堆UR和电容器C1后,得到一直流电压,再通过可调稳压器电路μA723C为温度传感器AD590提供稳定的工作电压。 AD590温度传感器是一种新型的电流输出型温度传感器,由多个参数相同的三极管和电阻构成。当传感器两端加有某一特定的直流工作电压时,如果该温度传感器的的温度1摄氏度时,则传感器的输出电流变化1μA。 传感器的变化电流通过电阻器R5和可变电阻器RP2,转换为电压信号,输出到数字表头,通过数字表显示出温度的变化。集成电路IC选用AD590型温度传感器。本电路其它元器件没
[电源管理]
采用AD590<font color='red'>数字温度计</font>电路设计
数字温度计和控温器DS1625DigitalThermometerandThermostatDS1625LiNing
    摘要: DS1625 是美国 DALLAS 公司出品的数字温度计和控温器。用户可自行设定温度报警的上下限,具有较强的温度控制功能。可广泛应用于工业控温系统、消费产品、温度计以及其它温度测控系统。文中介绍了该芯片的主要特性和工作原理。     关键词:温度计;控温器;串行接口; DS1625     1 .概述     DS1625 是美国 DALLAS 公司研制的数字温度计和控温器。它可输出 9 位温度值,当所测温度超过用户设定的温度上限 时,测温报警端 输出有效报警电平,直到温度降低到低于用户设定的温度下限。由于 DS1625 存在一定的时间滞后,因而它有较强的抗干扰能力。在 DS1
[测试测量]
基于DS1620和AT89C2051的数字温度计
1 DS1620芯片介绍      DS1620是一片8引脚的片内建有温度测量并转换为数字值的集成电路,他集温度传感、温度数据转换与传输、温度控制等功能于一体。测温范围:-55~+125℃,精度为0.5℃。该芯片非常容易与单片机连接,实现温度的测控应用,单独做温度控制器使用时,可不用外加其他辅助元件。   引脚功能及排列如图1所示。   其中:RST,CLK/CONV及DQ为三线串行通信线;DQ为数据输入输出端。当RST保持高电平,对应CLK/CONV时钟脉冲的上升沿处,DQ可按位输入各种控制指令及数据,在CLK/CONV时钟脉冲的下降沿处开始按位输出9 B温度值,分2个字节输出,最低位(LSB)在最先输出,先输出的
[测试测量]
由单片机和多片DS1820组成的多点温度测控系统
1 概述 DS1820 是美国DALLAS公司生产的单线数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,特别适合于构成多点温度测控系统,可直接将温度转化成串行数字信号供微机处理,而且每片DS1820都有唯一的产品号并可存入其ROM中,以使在构成大型温度测控系统时在单线上挂任意多个 DS1820芯片。从DS1820读出或写入DS1820信息仅需要一根口线,共读写及温度变换功率来源于数据总线,该总线本身也可以向所挂接的 DS1820供电,而无需额处电源。DS1820能提供九位温度读数,它无需任何外围硬件即可方便地构成温度检测系统。 2 DS1820的工作原理 DS1820采用3脚PR-3
[单片机]
由单片机和多片DS1820组成的多点温度测控系统
51单片机利用IIC总线对LM75A温度进行读取
#include INTRINS.H #include ..\config\c8051f350.h #include ..\config\const.h #include ..\driver\system.h #include ..\driver\other.h #define IIC_WRITE 0 #define IIC_READ 1 #define VREF 24380 static unsigned long sysclk=24500000; sbit SDA=P0^0; sbit SCL=P0^1; sbit led=P1^2; void Delay_us(unsigned int times){ unsigned i
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved