#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P3^7;
bit flag;
uint temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void delay_us(uchar us)
{
while(us--); //6.51us
}
void delay(int z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void display(uint temp)
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table1[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
bit reset()
{
bit i;
ds = 1;
_nop_();
ds = 0;
delay_us(75); //拉低總線499.45us 掛接在總線上的18B20將會(huì)全部被復(fù)位
ds = 1; //釋放總線
delay_us(4); //延時(shí)37.95us 等待18B20發(fā)回存在信號(hào)
i = ds;
delay_us(20); //141.95us
ds = 1;
_nop_();
return (i);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds = 0;
_nop_();//產(chǎn)生些時(shí)序
ds = dat & 0x01;
delay_us(10);//76.95us
ds = 1; //釋放總線準(zhǔn)備下一次數(shù)據(jù)寫入
_nop_();
dat >>= 1;
}
}
uchar read_byte()
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
ds = 0;
_nop_();//產(chǎn)生讀時(shí)序
ds = 1;
_nop_();//釋放總線
j = ds;
delay_us(10);//76.95us
ds = 1;
_nop_();
dat = (j<<7)|(dat>>1);
}
return (dat);
}
void main()
{
uchar L,M;
uint i;
while(1)
{
reset();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
reset();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0xbe);//讀取DS18B20暫存器值
L = read_byte();
M = read_byte();
i = M;
i <<= 8;
i |= L;
i = i * 0.0625 * 10 + 0.5;
display(i);
}
}
|