您的位置 首页 新能源

DS18B20温度传感器64位ROM地址读取(STC89C52)

最近在做一个温度监测系统,采用DS18B20数字温度传感器,要用到64位ROM地址匹配,在网上查了一些资料,编写了DS18b20的64位ROM地址读取的程

最近在做一个温度监测体系,选用DS18B20数字温度传感器,要用到64位ROM地址匹配,在网上查了一些材料,编写了DS18b20的64位ROM地址读取的程序,LCD1602显现。共享给我们,有什么缺乏请我们留言。

程序代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitlcdrw=P1^1;//LCD1602读/写挑选H/L

sbitlcdrs=P1^0;//LCD1602数据/指令挑选H/L

sbitlcden=P2^5;//LCD1602使能

sbitds=P2^2;//温度传感器信号线

ucharcodetable[]=”NO.1:.C”;

ucharcodetable1[]=”“;

uchardatafCode[8];

inttemp;//整型温度数据

floatf_temp;//浮点型温度数据

uchartflag;//温度正负标志

//*****************LCD1602*******************************

voiddelay(uintz)//延时函数延时z毫秒

{

uintx,y;

for(x=z;x>0;x–)

for(y=110;y>0;y–);

}

voidwrite_com(ucharcom)//lcd1602写指令

{

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}//lcd1602写数据

voidwrite_date(uchardate)

{

lcdrs=1;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidinit1602()//初始化LCD1602

{

uchari;

lcdrw=0;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(i=0;i<13;i++)

{

write_date(table[i]);

delay(5);

}

write_com(0x80+0x40);

for(i=0;i<13;i++)

{

write_date(table1[i]);

delay(5);

}

write_com(0x80+11);

write_date(0xdf);

write_com(0x80+0x40+11);

write_date(0xdf);

}

//*******************DS18B20****************************

voiddsreset()//DS18B20复位,初始化函数

{

uinti;

ds=0;

i=103;

while(i>0)

i–;

ds=1;

i=4;

while(i>0)

i–;

}

bittempreadbit()//读一位数据函数

{

uinti;

bitdat;

ds=0;

i++;

ds=1;

i++;

i++;

dat=ds;

i=8;

while(i>0)

i–;

returndat;

}

uchartempread()//读一字节数据函数

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tempreadbit();

dat=(j<<7)|(dat>>1);

}

returndat;

}

voidtempwrite(uchardat)//向DS18B20写一字节数据函数

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)//写1

{

ds=0;

i++;i++;

ds=1;

i=8;

while(i>0)

i–;

}

else//写0

{

ds=0;

i=8;

while(i>0)

i–;

ds=1;

i++;i++;

}

}

}

voidtempchange()//DS18B20开端获取温度并转化

{

dsreset();

delay(1);

tempwrite(0xcc);//写越过读ROM指令

tempwrite(0x44);//写温度转化指令

}

uintget_temp()

{

uchara,b;

dsreset();

delay(1);

tempwrite(0xcc);//写“越过读ROM”指令

tempwrite(0xbe);//写“读内部RAM中9字节的温度数据”指令

a=tempread();//读高8位

b=tempread();//读低8位

temp=b;

temp<<=8;

temp=temp|a;//两个字节合为一个字节

if(temp<0x0fff)

tflag=0;//正值标识符

else

{

temp=~temp+1;

tflag=1;//负值标识符

}

f_temp=temp*0.0625;//温度在寄存器中为12位,分辩路为0.0625

temp=f_temp*10+0.5;//乘以10表明小数点后边只取一位,加0.5是四舍五入

//f_temp=f_temp+0.05;

returntemp;//temp是整型

}

voidwrite_wendu(ucharaddress,uchardate)//写温度

{

write_com(address);

write_date(date);

}

voiddisplay()//显现函数

{

uintw1,w2,w3,w4;

w1=get_temp()/1000;//百位

w2=get_temp()00/100;//十位

w3=get_temp()0/10;//个位

w4=get_temp();//小数点位

if(tflag==0)

write_wendu(0x80+5,0×20);//不显现正号

else

write_wendu(0x80+5,0x2d);//显现负号

if(w1==0)

{

write_wendu(0x80+6,0×20);//百位为0,不显现

if((w1==0)&&(w2==0))

write_wendu(0x80+7,0×20);//百位,十位都为0,不显现

else

write_wendu(0x80+7,0×30+w2);

write_wendu(0x80+8,0×30+w3);

write_wendu(0x80+10,0×30+w4);

}

else

{

write_wendu(0x80+6,0×30+w1);

write_wendu(0x80+7,0×30+w2);

write_wendu(0x80+8,0×30+w3);

write_wendu(0x80+10,0×30+w4);

}

}

voidDispCode()//读取ROM

{

uinti,xulie;

dsreset();

delay(1);

tempwrite(0x33);

for(i=0;i<8;i++)

{

fCode[i]=tempread();

}

write_com(0x80+0x40);

for(i=0;i<8;i++)

{

xulie=fCode[i]>>4;//显现高四位

xulie=xulie*1.0;

if(xulie<10)

write_date(0x30+xulie);

else

write_date(0x37+xulie);

xulie=fCode[i]&0x0f;//显现低四位

xulie=xulie*1.0;

if(xulie<10)

write_date(0x30+xulie);

else

write_date(0x37+xulie);

}

}

//************************************************

voidmain()//主函数

{

init1602();

DispCode();

while(1)

{//searchrom();

tempchange();

display();

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/258260.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部