DSB多点测温C程序Word下载.doc
《DSB多点测温C程序Word下载.doc》由会员分享,可在线阅读,更多相关《DSB多点测温C程序Word下载.doc(11页珍藏版)》请在冰点文库上搜索。
j<
100;
j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P2=com;
delay1ms
(1);
EN=1;
voidwr_dat(unsignedchardat)//写数据//
;
RS=1;
P2=dat;
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
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
//拉高
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>
i--)
{DQ=0;
DQ=wdata&
0x01;
delay_18B20(10);
DQ=1;
wdata>
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);
//*跳过读序列号*/
ds1820wr(0x44);
//*启动温度转换*/
//*跳过读序列号*/
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_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;
8;
{
fCode[i]=ds1820rd();
}
wr_com(0x80+0x40);
for(i=0;
{
temp=fCode[i]>
4;
//显示高四位
if(temp<
10)
wr_dat(temp+0x30);
else
wr_dat(temp+0x37);
temp=fCode[i]&
0x0f;
//显示低四位
if(temp<
wr_dat(temp+0x30);
}
/********************主程序***********************************/
voidmain()
{
init_play();
//初始化显示
DispCode();
//系列号显示
delay1ms(1000);
while
(1)
{//read_temp();
//读取温度
//ds1820disp();
//显示
程序二:
匹配序列号,并读温度。
#include<
intrins.h>
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};
//摄氏温度符号
voiddelay1ms(uintms)//延时1毫秒(不够精确的)
{uinti,j;
voidwr_com(ucharcom)//写指令//
voidwr_dat(uchardat)//写数据//
voidwr_new() 、//写新字符
uchari;
wr_com(0x40);
for(i=0;
{
wr_dat(table[i]);
}
{ delay1ms(15);
wr_com(0x38);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
wr_new();
wr_com(0x80);
wr_dat('
A'
);
wr_com(0x81);
:
'
wr_com(0x89);
wr_dat(0x00);
wr_com(0x8a);
C'
wr_com(0xc9);
、、//摄氏温度字符
wr_com(0xca);
wr_com(0xc0);
B'
wr_com(0xc1);
/******************************ds1820程序***************************************/
voiddelay_18B20(uinti)//延时1微秒
{ucharx=0;
DQ=1;
delay_18B20(4);
DQ=0;
delay_18B20(100);
delay_18B20(40);
}
uchardat=0;
for(i=0;
{DQ=0;
voidds1820wr(uchardat)/*写数据*/
{ uchari=0;
for(i=0;
i<
i++)
{DQ=0;
DQ=dat&
delay_18B20(10);
DQ=1;
dat>
}
voidb20_Matchrom(uchara) //匹配ROM
charj;
ds1820wr(0x55);
//发送匹配ROM命令
if(a==1)
for(j=0;
j++)
ds1820wr(str1[j]);
//发送18B20的序列号,先发送低字节
if(a==2)
ds1820wr(str2[j]);
read_temp(ucharz)/*读取温度值并转换*/
{ uchara,b;
floattt;
ds1820rst();
ds1820wr(0xcc);
、//读序列号
if(z==1)
b20_Matchrom
(1);
//匹配ROM1
if(z==2)
b20_Matchrom
(2);
//匹配ROM 2
ds1820wr(0x44);
delay1ms(5);
//读序列号
//匹配ROM1
//匹配ROM 2
ds1820wr(0xbe);
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
tvalue=tvalue|a;
tflag=0;
{ tvalue=~tvalue+1;
tflag=1;
}
tt=tvalue*0.0625;
tvalue=tt*10;
return(tvalue);
/*****************显示函数******************************/
voidds1820disp(ucharz)//温度值显示
if(z==1)
{
wr_com(0x82);
wr_com(0x83);
wr_com(0x84);
wr_com(0x85);
wr_com(0x86);
wr_com(0x87);
if(z==2)
wr_com(0xc6);
wr_com(0xc7);
lcd_init();
while
(1)
read_temp
(1);
ds1820disp
(1);
read_temp
(2);
ds1820disp
(2);
// delay1ms(10000);