DSB多点测温C程序.doc

上传人:b****1 文档编号:230308 上传时间:2022-10-07 格式:DOC 页数:11 大小:35KB
下载 相关 举报
DSB多点测温C程序.doc_第1页
第1页 / 共11页
DSB多点测温C程序.doc_第2页
第2页 / 共11页
DSB多点测温C程序.doc_第3页
第3页 / 共11页
DSB多点测温C程序.doc_第4页
第4页 / 共11页
DSB多点测温C程序.doc_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

DSB多点测温C程序.doc

《DSB多点测温C程序.doc》由会员分享,可在线阅读,更多相关《DSB多点测温C程序.doc(11页珍藏版)》请在冰豆网上搜索。

DSB多点测温C程序.doc

DS18B20多点测温

由于本人在前两天找DS18B20多点测温(51C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人的知识,重新写了这个程序。

其中包括程序一:

单个读序列号。

程序二,匹配并且读两个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

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

当前位置:首页 > 考试认证 > IT认证

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

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