51单片机ds18b20程序
时间: 2023-11-29 21:03:34 浏览: 83
以下是基于51单片机的DS18B20温度传感器读取程序:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^7; //定义单总线DQ引脚
//延时函数
void Delay1ms(uint cnt)
{
uint i, j;
for(i = 0; i < cnt; i++)
for(j = 0; j < 110; j++);
}
//初始化DS18B20
uchar Init_DS18B20()
{
uchar i;
DQ = 1;
_nop_();
_nop_();
_nop_();
DQ = 0;
Delay1ms(20);
DQ = 1;
Delay1ms(1);
i = DQ;
Delay1ms(20);
return i;
}
//写一个字节
void Write_DS18B20(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
_nop_();
_nop_();
DQ = 1;
dat >>= 1;
}
}
//读一个字节
uchar Read_DS18B20()
{
uchar i, j, dat;
dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
j = DQ;
dat = (j << 7) | (dat >> 1);
}
return dat;
}
//读温度值
int Read_Temperature()
{
uchar TL, TH;
int Temperature;
Init_DS18B20();
Write_DS18B20(0xcc); //跳过ROM操作
Write_DS18B20(0x44); //启动温度转换
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe); //读取温度寄存器
TL = Read_DS18B20();
TH = Read_DS18B20();
Temperature = TH;
Temperature <<= 8;
Temperature |= TL;
return Temperature;
}
void main()
{
int Temperature;
while(1)
{
Temperature = Read_Temperature(); //读取温度值
Temperature >>= 4; //丢掉小数部分
//将温度值通过串口发送到上位机
SBUF = Temperature / 10 + '0';
while(!TI);
TI = 0;
SBUF = Temperature % 10 + '0';
while(!TI);
TI = 0;
Delay1ms(1000); //延时1s
}
}
```
以上程序中,使用P3^7引脚作为DS18B20的DQ引脚,通过单总线协议与DS18B20进行通讯,读取温度值后将其通过串口发送到上位机。程序仅供参考,具体应用中还需要根据实际情况进行适当修改。
阅读全文