#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^6;
uchar tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0 1 2 3 4 5 6 7 8 9
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 //0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
};
uchar temp;
uchar buffer[]={0,0,0,0};
void delay(uint x);
void delay_ms(uint x);
void inti_ds18b20();
void write_byte(uchar dat);
uchar read_byte();
uchar read_t();
void display();
void buffer_data();
void main()
{
// inti_ds18b20();
while(1)
{
temp=read_t();
buffer_data();
display();
}
}
void delay(uint x)
{
while(x--);
}
void delay_ms(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<112;i++);
}
}
void inti_ds18b20()
{
DQ=1;
delay(8);
DQ=0;
delay(200);
DQ=1;
delay(100);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01; //从字节的最低位开始传输
delay(10);
DQ=1;
dat>>=1;
}
delay(4);
}
uchar read_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1; //让从总线上读到的位数据,依次从高位移动到低位
DQ=1;
if(DQ)
value|=0x80;
//若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
delay(10);
}
return value;
}
uchar read_t()
{
uchar a,b;
inti_ds18b20();
write_byte(0xcc); //跳过Rom
write_byte(0x44); //启动温度测量
delay(300);
inti_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte(); //读取到的第一个字节为温度LSB
b=read_byte(); //读取到的第一个字节为温度MSB
temp= b; //先把高八位有效数据赋于temp
temp<<= 8; //把以上8位数据从temp低八位移到高八位
temp|=a; //两字节合成一个整型变量
temp*=0.625; //得到真实十进制温度值 放大十倍
//temp = tt*10+0.5; //放大十倍
//这样做的目的将小数点后第一位也转换为可显示数字
//同时进行一个四舍五入操作。
return temp;
}
void buffer_data()
{
buffer[0]=temp%10;
buffer[1]=temp/10%10+10;
buffer[2]=temp/100;
}
void display()
{
P2=0xfe;
P0=tab[buffer[0]];
delay_ms(1);
P0=0xff;
P2=0xfd;
P0=tab[buffer[1]];
delay_ms(1);
P0=0xff;
P2=0xfb;
P0=tab[buffer[2]];
delay_ms(1);
P0=0xff;
}
一周热门 更多>