51单片机驱动ds18b20
时间: 2023-11-11 10:02:52 浏览: 200
51单片机可以通过驱动DS18B20来获取温度信息。你可以根据以下步骤进行驱动:
1. 首先,你需要将DS18B20的供电引脚连接到51单片机的电源引脚上,并将DS18B20的地线引脚连接到51单片机的地线引脚上。
2. 接下来,将DS18B20的数据引脚连接到51单片机的一个IO口上,记住这个IO口的引脚号码。
3. 在程序中,你需要使用对应的IO口的引脚号码进行配置和控制。
4. 首先,初始化DS18B20,发送复位脉冲,然后发送跳过ROM命令。
5. 发送温度转换命令,并等待一段时间,以便DS18B20完成温度转换。
6. 发送读取温度命令,并接收DS18B20返回的温度数据。
7. 对接收到的温度数据进行处理,以得到实际的温度值。
以上是基本的驱动过程,你可以参考引用中提供的教程和示例程序来更详细地了解和实现。希望对你有帮助!
相关问题
写一个51单片机驱动ds18b20的程序
可以回答这个问题。以下是一个简单的51单片机驱动ds18b20的程序:
#include <reg51.h>
#include <intrins.h>
sbit DQ = P1^0; // ds18b20数据线连接的IO口
void delay_us(unsigned int us) // 延时函数,单位为微秒
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void ds18b20_reset() // ds18b20复位函数
{
DQ = 0;
delay_us(480);
DQ = 1;
delay_us(60);
if(DQ == 0)
{
delay_us(420);
}
}
void ds18b20_write_byte(unsigned char dat) // ds18b20写一个字节函数
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
delay_us(60);
DQ = 1;
dat >>= 1;
}
}
unsigned char ds18b20_read_byte() // ds18b20读一个字节函数
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
dat |= DQ << i;
delay_us(60);
}
return dat;
}
void ds18b20_start() // ds18b20开始转换函数
{
ds18b20_reset();
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0x44); // 开始转换命令
}
void ds18b20_read_temperature(unsigned char *temp) // ds18b20读取温度函数
{
unsigned char tl, th;
ds18b20_reset();
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0xbe); // 读取温度命令
tl = ds18b20_read_byte(); // 读取温度低8位
th = ds18b20_read_byte(); // 读取温度高8位
*temp = (th << 4) | (tl >> 4); // 计算温度值
}
void main()
{
unsigned char temp;
ds18b20_start(); // 开始转换
while(1)
{
ds18b20_read_temperature(&temp); // 读取温度
// 这里可以将温度值temp显示到LCD或者串口等设备上
}
}
请帮我写一段51单片机驱动DS18B20的代码
好的,我可以帮你写一段简单的51单片机驱动DS18B20的代码,以下是参考代码:
#include <STC89C5xRC.H>
#define DQ P3_7
unsigned char TempH,TempL; //定义高低温度变量
void Delay1us() //微秒级延时函数
{
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Write_DS18B20(unsigned char dat) //写入一个字节函数
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay1us();
DQ = dat & 0x01;
Delay1us();
DQ = 1;
dat >>= 1;
}
}
unsigned char Read_DS18B20() //读取一个字节函数
{
unsigned char dat = 0x00;
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay1us();
DQ = 1;
Delay1us();
dat >>= 1;
if(DQ)
dat |= 0x80;
else
dat &= 0x7f;
}
return dat;
}
void Init_DS18B20() //初始化函数
{
DQ = 1;
Delay1us();
DQ = 0;
Delay1us();
DQ = 1;
Delay1us();
}
void Get_DS18B20() //读取温度函数
{
Init_DS18B20();
Write_DS18B20(0xCC); //跳过ROM指令
Write_DS18B20(0x44); //温度转换指令
while(!DQ); //等待转换完成
Init_DS18B20();
Write_DS18B20(0xCC); //跳过ROM指令
Write_DS18B20(0xBE); //读取温度指令
TempL = Read_DS18B20(); //先读低8位
TempH = Read_DS18B20(); //后读高8位
}
void main()
{
while(1)
{
Get_DS18B20(); //读取温度
P0 = TempL; //显示低8位温度
P1 = TempH; //显示高8位温度
}
}
请注意:这只是一个简单的示例代码,具体应用时需要根据实际情况进行改动和调试。
阅读全文