#include
#include
#define uint unsigned int
#define uchar unsigned char
#define PA 0x7cff //PA口
#define PB 0x7dff //PB口
#define con 0x7fff //控制字
本文引用地址:http://m.butianyuan.cn/article/201611/321016.htmsbit A8=P2^0; //地址線(xiàn)A0
sbit A9=P2^1; //地址線(xiàn)A1
sbit cs=P2^7; //片選
sbit wr=P3^6; //讀端口
uint temp;
uchar tplsb,tpmsb; // 溫度值低位、高位字節(jié)
sbit date=P1^2; //數(shù)據(jù)通信線(xiàn)
uchar code tableshi[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//數(shù)碼管段選 十位
uchar code tablege[]=
{0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
//數(shù)碼管段選 個(gè)位 帶小數(shù)點(diǎn)
//uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//數(shù)碼管位選
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void init()
{
uint i;
date=1;
delay(1);
date = 0;
i = 100; //拉低約900us
while (i>0) i--;
date= 1; // 產(chǎn)生上升沿
i = 4;
while (i>0) i--;
}
void wait()
{
uint i;
while(date);
while(~date); // 檢測(cè)到應(yīng)答脈沖
i = 4;
while (i>0) i--;
}
bit readbit()
{
uint i;
bit b;
date = 0;
i++;
date = 1;
i++;i++; // 延時(shí)15us以上,讀時(shí)隙下降沿后15us,DS18B20輸出數(shù)據(jù)才有效
b = date;
i = 8;
while(i>0) i--;
return (b);
}
uchar readbyte()
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = readbit();
b = (j<<7)|(b>>1);//讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DATE里
}
return(b);
}
void writebyte(uchar b)//
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp) // 寫(xiě)1
{
date = 0;
i++;i++; // 延時(shí),使得15us以?xún)?nèi)拉高
date = 1;
i = 8;
while(i>0) i--; // 整個(gè)寫(xiě)1時(shí)隙不低于60us
}
else // 寫(xiě)0
{
date = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之間
date = 1;
i++;
i++;
}
}
}
void convert()
{
init(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
wait(); // 等待DS18B20給出應(yīng)答脈沖
delay(1); // 延時(shí)
writebyte(0xcc); // 跳過(guò)rom 命令
writebyte(0x44); // convert T 命令
}
uint readtemp()
{
float tt;
init(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
wait(); // 等待DS18B20給出應(yīng)答脈沖
delay(1); // 延時(shí)
writebyte(0xcc); // 跳過(guò)rom命令
writebyte(0xbe); // read scratchpad 讀暫存器命令
tplsb=readbyte(); // 溫度值低位字節(jié)(其中低4位為二進(jìn)制的"小數(shù)"部分)
tpmsb=readbyte(); // 溫度值高位字節(jié)(其中高5位為符號(hào)位)
temp=tpmsb;
temp<<=8; //合成一個(gè)字
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void display(uint temp)
{
uchar A1,A2,A3;
A1=temp/100;
A2=temp%100/10;
A3=temp%10;
wr=1;
XBYTE[PB]=0xdf; //選通第一位數(shù)碼管
wr=0;
delay(1);
wr=1;
XBYTE[PA]=tableshi[A1]; //顯示百位
wr=0;
delay(10);
wr=1;
XBYTE[PA]=0x00; //關(guān)掉顯示百位
wr=0;
wr=1;
XBYTE[PB]=0xef; //選通第2位數(shù)碼管
wr=0;
delay(1);
wr=1;
XBYTE[PA]=tablege[A2];//顯示十位
wr=0;
delay(10);
wr=1;
XBYTE[PA]=0x00; //關(guān)掉顯示十位
wr=0;
wr=1;
XBYTE[PB]=0xf7; //選通第3位數(shù)碼管
wr=0;
delay(1);
wr=1;
XBYTE[PA]=tableshi[A3]; //顯示個(gè)位
wr=0;
delay(10);
wr=1;
XBYTE[PA]=0x00; //關(guān)掉顯示個(gè)位
wr=0;
}
void main()
{
wr=1;
XBYTE[con]=0x80;//A組輸入B組輸出方式0
wr=0;
delay(1); // 延時(shí)1ms
convert(); // 啟動(dòng)溫度轉(zhuǎn)換,需要750ms
delay(1000); // 延時(shí)1s
while(1)
{
convert();
display(readtemp());
}
}
評(píng)論