ds18b20温度传感器+LED亮
时间: 2023-12-17 09:02:32 浏览: 40
以下是使用DS18B20温度传感器和LED数码管来测量并显示温度的C语言程序设计:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P2_1
#define LED P0
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void delay(uint i)
{
while (i--);
}
void ds_init()
{
uchar i;
DQ = 1;
_nop_();
_nop_();
_nop_();
DQ = 0;
delay(100);
DQ = 1;
delay(10);
i = DQ;
delay(100);}
uchar ds_read_byte()
{
uchar i, j, dat = 0;
for (j = 0; j < 8; j++)
{
DQ = 0;
_nop_();
_nop_();
_nop_();
i = DQ;
delay(100);
dat |= (i << j);
DQ = 1;
}
return dat;
}
void ds_write_byte(uchar dat)
{
uchar j;
uchar testb;
for (j = 0; j < 8; j++)
{
testb = dat & 0x01; dat = dat >> 1;
if (testb)
{
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
delay(10);
}
else
{
DQ = 0;
delay(10);
DQ = 1;
_nop_();
_nop_();
_nop_();
}
}
}
int ds_get_temp()
{
uchar temp_l, temp_h;
int temp;
ds_init();
ds_write_byte(0xcc);
ds_write_byte(0x44);
delay(100);
ds_init();
ds_write_byte(0xcc);
ds_write_byte(0xbe);
temp_l = ds_read_byte();
temp_h = ds_read_byte();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
return temp;
}
void display(int temp)
{
uchar i, j, k;
uchar code dis[] = {0xfe, 0xfd, 0xfb};
uchar shi, ge, temp1;
if (temp < 0)
{
temp = ~temp + 1;
temp1 = temp >> 4;
temp1 |= 0x80;
}
else
{
temp1 = temp >> 4;
}
shi = temp1 / 10;
ge = temp1 % 10;
for (i = 0; i < 3; i++)
{
LED = dis[i];
if (i == 0)
{
k = shi;
}
else if (i == 1)
{
k = ge;
}
else
{
k = 10;
}
for (j = 0; j < 10; j++)
{
if (j == k)
{
LED = table[j];
}
}
delay(100);
}
}
void main()
{
int temp;
while (1)
{
temp = ds_get_temp();
display(temp);
}
}
```
该程序使用了8051单片机和Proteus仿真软件,通过DS18B20温度传感器来获取温度值,并通过LED数码管来显示温度值。程序中的ds_init()函数用于初始化DS18B20传感器,ds_read_byte()函数用于读取传感器返回的数据,ds_write_byte()函数用于向传感器写入数据,ds_get_temp()函数用于获取温度值,display()函数用于将温度值显示在LED数码管上。