最近在做一個(gè)溫度監(jiān)測(cè)系統(tǒng),采用DS18B20數(shù)字溫度傳感器,要用到64位ROM地址匹配,在網(wǎng)上查了一些資料,編寫(xiě)了DS18b20的64位ROM地址讀取的程序,LCD1602顯示。分享給大家,有什么不足請(qǐng)大家留言。本文引用地址:http://www.ljygm.com/article/201611/321814.htm程序代碼:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrw=P1^1;//LCD1602讀/寫(xiě)選擇H/L
sbitlcdrs=P1^0;//LCD1602數(shù)據(jù)/命令選擇H/L
sbitlcden=P2^5;//LCD1602使能
sbitds=P2^2;//溫度傳感器信號(hào)線
ucharcodetable[]="NO.1:.C";
ucharcodetable1[]="";
uchardatafCode[8];
inttemp;//整型溫度數(shù)據(jù)
floatf_temp;//浮點(diǎn)型溫度數(shù)據(jù)
uchartflag;//溫度正負(fù)標(biāo)志
//*****************LCD1602*******************************
voiddelay(uintz)//延時(shí)函數(shù)延時(shí)z毫秒
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//lcd1602寫(xiě)指令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}//lcd1602寫(xiě)數(shù)據(jù)
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復(fù)位,初始化函數(shù)
{
uinti;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bittempreadbit()//讀一位數(shù)據(jù)函數(shù)
{
uinti;
bitdat;
ds=0;
i++;
ds=1;
i++;
i++;
dat=ds;
i=8;
while(i>0)
i--;
returndat;
}
uchartempread()//讀一字節(jié)數(shù)據(jù)函數(shù)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
returndat;
}
voidtempwrite(uchardat)//向DS18B20寫(xiě)一字節(jié)數(shù)據(jù)函數(shù)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//寫(xiě)1
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)
i--;
}
else//寫(xiě)0
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;i++;
}
}
}
voidtempchange()//DS18B20開(kāi)始獲取溫度并轉(zhuǎn)換
{
dsreset();
delay(1);
tempwrite(0xcc);//寫(xiě)跳過(guò)讀ROM指令
tempwrite(0x44);//寫(xiě)溫度轉(zhuǎn)換指令
}
uintget_temp()
{
uchara,b;
dsreset();
delay(1);
tempwrite(0xcc);//寫(xiě)“跳過(guò)讀ROM”指令
tempwrite(0xbe);//寫(xiě)“讀內(nèi)部RAM中9字節(jié)的溫度數(shù)據(jù)”指令
a=tempread();//讀高8位
b=tempread();//讀低8位
temp=b;
temp<<=8;
temp=temp|a;//兩個(gè)字節(jié)合為一個(gè)字節(jié)
if(temp<0x0fff)
tflag=0;//正值標(biāo)識(shí)符
else
{
temp=~temp+1;
tflag=1;//負(fù)值標(biāo)識(shí)符
}
f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨路為0.0625
temp=f_temp*10+0.5;//乘以10表示小數(shù)點(diǎn)后面只取一位,加0.5是四舍五入
//f_temp=f_temp+0.05;
returntemp;//temp是整型
}
voidwrite_wendu(ucharaddress,uchardate)//寫(xiě)溫度
{
write_com(address);
write_date(date);
}
voiddisplay()//顯示函數(shù)
{
uintw1,w2,w3,w4;
w1=get_temp()/1000;//百位
w2=get_temp()00/100;//十位
w3=get_temp()0/10;//個(gè)位
w4=get_temp();//小數(shù)點(diǎn)位
if(tflag==0)
write_wendu(0x80+5,0x20);//不顯示正號(hào)
else
write_wendu(0x80+5,0x2d);//顯示負(fù)號(hào)
if(w1==0)
{
write_wendu(0x80+6,0x20);//百位為0,不顯示
if((w1==0)&&(w2==0))
write_wendu(0x80+7,0x20);//百位,十位都為0,不顯示
else
write_wendu(0x80+7,0x30+w2);
write_wendu(0x80+8,0x30+w3);
write_wendu(0x80+10,0x30+w4);
}
else
{
write_wendu(0x80+6,0x30+w1);
write_wendu(0x80+7,0x30+w2);
write_wendu(0x80+8,0x30+w3);
write_wendu(0x80+10,0x30+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()//主函數(shù)
{
init1602();
DispCode();
while(1)
{//searchrom();
tempchange();
display();
}
}
評(píng)論