DS18B20多点测温.docx

上传人:b****8 文档编号:10646798 上传时间:2023-02-22 格式:DOCX 页数:17 大小:17.23KB
下载 相关 举报
DS18B20多点测温.docx_第1页
第1页 / 共17页
DS18B20多点测温.docx_第2页
第2页 / 共17页
DS18B20多点测温.docx_第3页
第3页 / 共17页
DS18B20多点测温.docx_第4页
第4页 / 共17页
DS18B20多点测温.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

DS18B20多点测温.docx

《DS18B20多点测温.docx》由会员分享,可在线阅读,更多相关《DS18B20多点测温.docx(17页珍藏版)》请在冰豆网上搜索。

DS18B20多点测温.docx

DS18B20多点测温

DS18B20多点测温(读序列,匹配序列,51C程序,1602显示)

程序一:

单个读序列号。

程序二,匹配并且读两个DS18B20,当然,读多个与读两个基本原理一样,只要加上其序列号等即可。

本程序所有显示都是用LCD1602显示。

程序一:

度序列号,并用1602显示,1602从左到右分别是低到高位。

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^7;//ds18b20与单片机连接口

sbitRS=P3^0;

sbitRW=P3^1;

sbitEN=P3^2;

unsignedcharcodestr1[]={""};

unsignedcharcodestr2[]={""};

ucharfCode[8];

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

/*************************lcd1602程序**************************/

voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)

{unsignedinti,j;

for(i=0;i

for(j=0;j<100;j++);

}

voidwr_com(unsignedcharcom)//写指令//

{delay1ms

(1);

RS=0;

RW=0;

EN=0;

P2=com;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidwr_dat(unsignedchardat)//写数据//

{delay1ms

(1);;

RS=1;

RW=0;

EN=0;

P2=dat;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidlcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

voiddisplay(unsignedchar*p)//显示//

{

while(*p!

='\0')

{

wr_dat(*p);

p++;

delay1ms

(1);

}

}

voidinit_play()//初始化显示

{lcd_init();

wr_com(0x80);

display(str1);

wr_com(0xc0);

display(str2);

}

/******************************ds1820*********************/

voiddelay_18B20(unsignedinti)//延时1微秒

{

while(i--);

}

voidds1820rst()/*ds1820复位*/

{ucharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{uchari=0;

for(i=8;i>0;i--)

{DQ=0;

DQ=wdata&0x01;

delay_18B20(10);

DQ=1;

wdata>>=1;

}

}

read_temp()/*读取温度值并转换*/

{uchara,b;

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

 

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

voidds1820disp()//温度值显示

{ucharflagdat;

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:

-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

wr_com(0xc0);

wr_dat(flagdat);//显示符号位

wr_com(0xc1);

wr_dat(disdata[0]);//显示百位

wr_com(0xc2);

wr_dat(disdata[1]);//显示十位

wr_com(0xc3);

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);

wr_dat(0x2e);//显示小数点

wr_com(0xc5);

wr_dat(disdata[3]);//显示小数位

}

voidDispCode()

{

unsignedchari,temp;

ds1820rst();

ds1820wr(0x33);

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

{

fCode[i]=ds1820rd();

}

wr_com(0x80+0x40);

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

{

temp=fCode[i]>>4;//显示高四位

if(temp<10)

wr_dat(temp+0x30);

else

wr_dat(temp+0x37);

temp=fCode[i]&0x0f;//显示低四位

if(temp<10)

wr_dat(temp+0x30);

else

wr_dat(temp+0x37);

}

}

/********************主程序***********************************/

voidmain()

{

init_play();//初始化显示

DispCode();//系列号显示

delay1ms(1000);

while

(1)

{//read_temp();//读取温度

//ds1820disp();//显示

;}

}

程序二:

匹配序列号,并读温度。

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitRS=P3^0;

sbitRW=P3^1;

sbitEN=P3^2;

sbitDQ=P3^7;

ucharcodestr1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18};//ROM1

ucharcodestr2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54};//ROM2

ucharcodetable[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//摄氏温度符号

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

/*************************lcd1602程序**************************/

voiddelay1ms(uintms)//延时1毫秒(不够精确的)

{uinti,j;

for(i=0;i

for(j=0;j<100;j++);

}

voidwr_com(ucharcom)//写指令//

{delay1ms

(1);

RS=0;

RW=0;

EN=0;

P2=com;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidwr_dat(uchardat)//写数据//

{delay1ms

(1);;

RS=1;

RW=0;

EN=0;

P2=dat;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidwr_new()、//写新字符

{

uchari;

wr_com(0x40);

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

{

wr_dat(table[i]);

}

}

voidlcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

wr_new();

wr_com(0x80);

wr_dat('A');

wr_com(0x81);

wr_dat(':

');

wr_com(0x89);

wr_dat(0x00);

wr_com(0x8a);

wr_dat('C');

wr_com(0xc9);

wr_dat(0x00);、、//摄氏温度字符

wr_com(0xca);

wr_dat('C');

wr_com(0xc0);

wr_dat('B');

wr_com(0xc1);

wr_dat(':

');

}

/******************************ds1820程序***************************************/

voiddelay_18B20(uinti)//延时1微秒

{

while(i--);

}

 

voidds1820rst()/*ds1820复位*/

{ucharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{uchari=0;

uchardat=0;

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

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(uchardat)/*写数据*/

{uchari=0;

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

{DQ=0;

DQ=dat&0x01;

delay_18B20(10);

DQ=1;

dat>>=1;

}

}

voidb20_Matchrom(uchara)//匹配ROM

{

charj;

ds1820wr(0x55);//发送匹配ROM命令

if(a==1)

{

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

ds1820wr(str1[j]);//发送18B20的序列号,先发送低字节

}

if(a==2)

{

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

ds1820wr(str2[j]);//发送18B20的序列号,先发送低字节

}

}

read_temp(ucharz)/*读取温度值并转换*/

{uchara,b;

floattt;

ds1820rst();

ds1820wr(0xcc);、//读序列号

ds1820rst();

if(z==1)

{

b20_Matchrom

(1);//匹配ROM1

}

if(z==2)

{

b20_Matchrom

(2);//匹配ROM2

}

ds1820wr(0x44);//*启动温度转换*/

delay1ms(5);

ds1820rst();

ds1820wr(0xcc);//读序列号

ds1820rst();

if(z==1)

{

b20_Matchrom

(1);//匹配ROM1

}

if(z==2)

{

b20_Matchrom

(2);//匹配ROM2

}

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{tvalue=~tvalue+1;

tflag=1;

}

tt=tvalue*0.0625;

tvalue=tt*10;

return(tvalue);

}

/*****************显示函数******************************/

voidds1820disp(ucharz)//温度值显示

{ucharflagdat;

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:

-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

if(z==1)

{

wr_com(0x82);

wr_dat(flagdat);//显示符号位

wr_com(0x83);

wr_dat(disdata[0]);//显示百位

wr_com(0x84);

wr_dat(disdata[1]);//显示十位

wr_com(0x85);

wr_dat(disdata[2]);//显示个位

wr_com(0x86);

wr_dat(0x2e);//显示小数点

wr_com(0x87);

wr_dat(disdata[3]);//显示小数位

}

if(z==2)

{

wr_com(0xc2);

wr_dat(flagdat);//显示符号位

wr_com(0xc3);

wr_dat(disdata[0]);//显示百位

wr_com(0xc4);

wr_dat(disdata[1]);//显示十位

wr_com(0xc5);

wr_dat(disdata[2]);//显示个位

wr_com(0xc6);

wr_dat(0x2e);//显示小数点

wr_com(0xc7);

wr_dat(disdata[3]);//显示小数位

}

}

/********************主程序***********************************/

voidmain()

{

lcd_init();//初始化显示

while

(1)

{

read_temp

(1);//读取温度

ds1820disp

(1);//显示

read_temp

(2);//读取温度

ds1820disp

(2);//显示

//delay1ms(10000);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1