利用ds18b20温度传感器测量温度的单片机c51代码
时间: 2023-09-28 12:05:54 浏览: 84
以下是基于C51单片机的DS18B20温度传感器测量温度的代码:
```c
#include <reg51.h>
#define DQ P1_5
typedef unsigned char uchar;
typedef unsigned int uint;
uchar temp;
uchar TH,TL;
bit flag;
void Delay10us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Init_DS18B20(void)
{
uchar i;
DQ = 1;
Delay(8);
DQ = 0;
Delay(80);
DQ = 1;
Delay(10);
i = DQ;
Delay(200);
}
uchar Read_DS18B20(void)
{
uchar i, j, k;
uchar temp1;
temp1 = 0;
for (i=1; i<=8; i++)
{
DQ = 0;
Delay10us();
DQ = 1;
Delay10us();
j = DQ;
Delay(4);
k = DQ;
if (j == 0 && k == 1)
temp1 &= ~(1 << (i - 1));
else if (j == 1 && k == 0)
temp1 |= (1 << (i - 1));
else
return 0;
Delay(40);
}
return temp1;
}
void Write_DS18B20(uchar dat)
{
uchar i, j;
for (i=1; i<=8; i++)
{
j = dat & 0x01;
dat = dat >> 1;
if (j)
{
DQ = 0;
Delay10us();
DQ = 1;
Delay(40);
}
else
{
DQ = 0;
Delay(40);
DQ = 1;
Delay10us();
}
}
}
void Convert_DS18B20(void)
{
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
uchar Read_Temp(void)
{
uchar a, b;
Convert_DS18B20();
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
a = Read_DS18B20();
b = Read_DS18B20();
TH = a;
TL = b;
temp = (TH << 4) | (TL >> 4);
if (temp < 0x00)
{
temp = ~temp + 1;
flag = 0;
}
else
{
flag = 1;
}
return temp;
}
void main(void)
{
uchar t;
while(1)
{
t = Read_Temp();
if (flag == 0)
{
P0 = 0x80;
}
else
{
P0 = t;
}
Delay(1000);
}
}
```
此代码仅供参考,具体实现方式与硬件环境有关,需要根据实际情况进行调整。
阅读全文