c51ds18b20初始化代码
时间: 2023-03-31 20:00:42 浏览: 76
以下是 C 语言中使用 C51 DS18B20 温度传感器的初始化代码示例:
#include <reg52.h>
#include <intrins.h>
sbit DQ = P1^4; // DS18B20 数据线连接到 P1.4 引脚
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void DS18B20Init()
{
unsigned char i;
DQ = 1;
DelayMs(10);
DQ = ;
DelayMs(80);
DQ = 1;
DelayUs2x(15);
i = DQ;
DelayUs2x(60);
i = DQ;
DelayUs2x(240);
}
在使用前,需要先调用 DS18B20Init() 函数进行初始化。
相关问题
ds18b20温度传感器代码基于C51
以下是基于 C51 的 DS18B20 温度传感器代码示例:
```c
#include <reg52.h>
#define DQ P2_0
void delay(unsigned int time)
{
while (time--);
}
void delay_us(unsigned int us)
{
while (us--);
}
unsigned char ds18b20_init()
{
unsigned char i;
DQ = 1;
delay_us(5);
DQ = 0;
delay_us(500);
DQ = 1;
delay_us(60);
i = DQ;
delay_us(240);
return i;
}
void ds18b20_write_byte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay_us(60);
DQ = 1;
dat >>= 1;
}
}
unsigned char ds18b20_read_byte()
{
unsigned char i, j, dat;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = 1;
_nop_();
_nop_();
dat |= DQ << i;
delay_us(60);
}
return dat;
}
void ds18b20_convert()
{
ds18b20_init();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0x44);
}
float ds18b20_read_temp()
{
float temp;
unsigned char tl, th;
ds18b20_init();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xbe);
tl = ds18b20_read_byte();
th = ds18b20_read_byte();
temp = th;
temp *= 256;
temp += tl;
temp *= 0.0625;
return temp;
}
void main()
{
float temp;
ds18b20_convert();
temp = ds18b20_read_temp();
while (1);
}
```
该代码实现了 DS18B20 温度传感器的初始化、写入字节、读取字节、温度转换以及读取温度的功能。其中,`ds18b20_init()` 初始化 DS18B20,`ds18b20_write_byte()` 写入字节,`ds18b20_read_byte()` 读取字节,`ds18b20_convert()` 进行温度转换,`ds18b20_read_temp()` 读取温度值。在 `main()` 函数中,首先进行温度转换,然后读取温度值,并进入一个死循环。请注意,具体的引脚连接和电路设计需要根据实际情况进行调整。
ds18b20 c51代码
下面是DS18B20在C51单片机上的代码示例:
```c
#include<reg51.h>
#define DQ P3_4
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
uchar Ds18b20Init()
{
uchar dat;
DQ = 1;
delay(2);
DQ = 0;
delay(80);
DQ = 1;
delay(10);
dat = DQ;
delay(10);
return dat;
}
void Ds18b20WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
DQ = dat&0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
uchar Ds18b20ReadByte()
{
uchar i,dat = 0;
for(i=0;i<8;i++)
{
dat >>= 1;
DQ = 0;
_nop_();
DQ = 1;
delay(2);
if(DQ)
dat |= 0x80;
delay(5);
}
return dat;
}
void Ds18b20ChangTemp()
{
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
}
int Ds18b20ReadTemp()
{
uchar temp1,temp2;
int temp;
Ds18b20ChangTemp();
Ds18b20ReadTempCom();
temp1 = Ds18b20ReadByte();
temp2 = Ds18b20ReadByte();
temp = temp2<<8|temp1;
return temp;
}
void main()
{
uchar i,TempH,TempL;
int Temp;
while(1)
{
Temp = Ds18b20ReadTemp();
TempH = Temp/16;
TempL = Temp%16;
P0 = 0x00;
P2 = 0xfe;
P0 = table[TempH];
delay(100);
P0 = 0x00;
P2 = 0xfd;
P0 = table[TempL];
delay(100);
}
}
```
上面的代码中,我们使用了P3.4引脚来连接DS18B20传感器的数据线。程序中的函数分别用于初始化DS18B20、写入一个字节、读取一个字节、转换温度、读取温度等操作。最后,在主函数中通过循环不断地读取温度值并显示在数码管上。