Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 delaywd(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delaywd(80); //精确延时 大于 480us DQ = 1; //拉高总线 delaywd(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delaywd(20);}//读一个字节ReadOneChar(void){ unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat);}//写一个字节WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--){ DQ = 0; DQ = dat&0x01; delaywd(5); DQ = 1; dat>>=1; }}讲解代码
时间: 2023-10-27 14:07:01 浏览: 38
这是一个DS18B20温度传感器的驱动代码。以下是代码的讲解:
1. Init_DS18B20(void):初始化DS18B20传感器。在初始化过程中,首先将DQ引脚拉低,然后延时一段时间(至少480us)以保证复位,接着将DQ拉高,再次延时,最后读取DQ引脚的电平。如果返回值为0,则表示初始化成功,否则初始化失败。
2. ReadOneChar(void):从DS18B20传感器中读取一个字节的数据。在读取数据之前,需要先向传感器发送一串脉冲信号,然后逐位读取字节数据。每读取一位数据,需要先将DQ引脚拉低,然后再给出脉冲信号,根据DQ引脚的电平判断该位数据的值。
3. WriteOneChar(unsigned char dat):向DS18B20传感器中写入一个字节的数据。在写入数据之前,需要先逐位将字节数据写入DQ引脚,并给出脉冲信号。
相关问题
void Init_DS18B20(void) { unsigned char x=0; DQ = 1; Delayns(8); DQ = 0; Delayns(80); DQ = 1; Delayns(14); x=DQ; Delayns(20); } unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for(i=0;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; Delayns(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=0;i>0;i--) { DQ = 0; DQ = dat&0x01; Delayns(5); DQ = 1; dat>>=1; } } unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt = 0; Init_Ds18B20(); WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*10+0.5; return(t); }
这段代码是使用单总线DS18B20温度传感器读取温度的代码,具体的函数包括:
1. Init_DS18B20():初始化DS18B20传感器,包括发送复位信号,等待一定时间,读取DS18B20的响应等。
2. ReadOneChar():读取单总线上DS18B20传感器发送的数据。
3. WriteOneChar():向单总线上的DS18B20传感器写入数据。
4. ReadTemperature():读取DS18B20传感器的温度数据,并计算出对应的温度值。
其中,Init_DS18B20() 和 ReadOneChar() 函数用来实现单总线通信协议,WriteOneChar() 用来向DS18B20传感器写入指令,ReadTemperature() 则用来读取DS18B20传感器的温度数据,并进行相关的计算,得到对应的温度值。
利用STC8G1K08+ds18b20+hc05写一个温度计程序
好的,我明白你的要求了。下面是你所提到的温度计程序的参考代码:
```
#include <STC8.H>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DS18B20_DQ P3_7 // DS18B20的数据引脚
#define DS18B20_POWER P3_2 // DS18B20的电源引脚
bit Reset_DS18B20(void) { // 复位DS18B20传感器
bit presence;
DS18B20_DQ = 0;
_nop_();
DS18B20_DQ = 1; // 释放数据引脚
_nop_();
presence = DS18B20_DQ; // 检测DS18B20的存在性
_nop_();
return presence;
}
void Write_DS18B20(uchar dat) { // 向DS18B20写一个字节的数据
uchar i;
for (i = 0; i < 8; i++) {
DS18B20_DQ = 0;
_nop_();
DS18B20_DQ = dat & 0x01;
_nop_();
DS18B20_DQ = 1;
_nop_();
dat >>= 1;
}
}
uchar Read_DS18B20(void) { // 从DS18B20读一个字节的数据
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
DS18B20_DQ = 0;
_nop_();
DS18B20_DQ = 1;
_nop_();
dat |= DS18B20_DQ << i;
_nop_();
}
return dat;
}
bit Init_DS18B20(void) { // 初始化DS18B20传感器
bit presence = Reset_DS18B20();
Write_DS18B20(0xCC); // 跳过ROM操作,直接操作温度转换命令
Write_DS18B20(0x44); // DS18B20开始温度转换
DS18B20_POWER = 1; // 打开电源,启动温度测量
return presence;
}
int Read_DS18B20_Temp(void) { // 读取DS18B20的温度值
bit presence;
uchar low, high;
presence = Init_DS18B20(); // 初始化DS18B20传感器
if (presence) Write_DS18B20(0xCC); // 如果存在,跳过ROM操作,直接读温度
Write_DS18B20(0xBE); // 发送读温度的命令
low = Read_DS18B20(); // 读温度值的低8位
high = Read_DS18B20(); // 读温度值的高8位
return ((high << 8) | low) * 0.0625; // 计算温度值,单位为摄氏度
}
void Delay1ms() { // 延时函数
unsigned char i, j;
i = 9;
j = 220;
do
{
while (--j);
} while (--i);
}
void main(void) // 主函数
{
uint temp;
uchar s[16];
P3M1 = 0x00; // P3口全部设为普通IO口
while (1) {
temp = Read_DS18B20_Temp(); // 读取DS18B20的温度值
sprintf(s, "Temp:%d.%dC", temp / 10, temp % 10); // 把温度值打印到字符串s中
// 此处可以调用hc05模块发送温度值给其他设备
Delay1ms();
}
}
```
这个程序是用软件模拟1-Wire总线协议实现的DS18B20温度传感器的操作,可以通过HC-05蓝牙模块发送温度值给其他设备。你可以根据需要修改程序,根据实际情况选择不同的温度范围和精度。希望能对你有所帮助!
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)