51单片机ds18b20测温程序
时间: 2023-11-29 11:03:34 浏览: 80
基于51单片机的DS18B20测温程序
以下是基于51单片机的DS18B20测温程序:
```c
#include<reg51.h>
#include<intrins.h>
#define DQ P1_0 //定义DS18B20数据线所连接的单片机IO口
void delay_us(unsigned char t) //延时函数
{
while(t--)
{
_nop_();
}
}
void delay_ms(unsigned char t) //延时函数
{
while(t--)
{
delay_us(1000);
}
}
unsigned char init_ds18b20() //DS18B20初始化函数
{
unsigned char flag = 0;
DQ = 1; //先将数据线置高
delay_us(1);
DQ = 0; //将数据线拉低
delay_us(500); //延时480us~960us
DQ = 1; //将数据线拉高
delay_us(60); //延时60us~240us
flag = DQ; //读取DS18B20的应答信号
delay_us(420); //延时完毕
return flag; //返回应答信号
}
void write_ds18b20(unsigned char dat) //DS18B20写数据函数
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0; //将数据线拉低
delay_us(2); //延时2us
DQ = dat&0x01; //写入数据
delay_us(60); //延时60us
DQ = 1; //将数据线拉高
dat >>= 1;
delay_us(2); //延时2us
}
}
unsigned char read_ds18b20() //DS18B20读数据函数
{
unsigned char i,dat=0;
for(i=0; i<8; i++)
{
DQ = 0; //将数据线拉低
delay_us(2); //延时2us
DQ = 1; //将数据线拉高
delay_us(2); //延时2us
dat |= DQ<<i; //读取数据
delay_us(60); //延时60us
}
return dat;
}
void main()
{
unsigned char temp_high,temp_low;
int temp;
while(1)
{
if(init_ds18b20()) //DS18B20初始化
{
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0x44); //温度转换命令
delay_ms(750); //延时750ms
init_ds18b20(); //DS18B20初始化
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0xbe); //读取温度命令
temp_low = read_ds18b20(); //读取温度低八位
temp_high = read_ds18b20(); //读取温度高八位
temp = temp_high<<8|temp_low; //将温度值合成
temp = temp*0.0625*10; //将温度值转换为十进制数
//此处可将温度值通过串口或LCD显示出来
}
}
}
```
在上面的程序中,我们定义了DS18B20的IO口为P1_0,使用了51单片机的延时函数来实现精确的延时。在主函数中,我们不断进行温度测量,通过串口或LCD显示出温度值即可。需要注意的是,DS18B20的温度转换需要750ms的时间,因此在进行温度转换时需要延时足够的时间。
阅读全文