微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LM75A的数字温度计的设计

LM75A的数字温度计的设计

时间:11-21 来源:互联网 点击:
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采集温度一次

#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, 2 3 4 5 6 7 8 9
//unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//0, 1, 2 3 4 5 6 7 8 9

unsigned char code tabdp[]={ 0xbf,0xb0,0xed,0xf9,0xf2,0xdb,0xdf,0xb1,0xff,0xfb,0xc0};//共阴带小数点
//0, 1, 2 3 4 5 6 7 8 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();
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top