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

LM75A的数字温度计的设计

时间:11-21 来源:互联网 点击:

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);
}
}


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

网站地图

Top