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 16:07:01 浏览: 95
这是一个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传感器的温度数据,并进行相关的计算,得到对应的温度值。
利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为-55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位共阴极LED数码管以SEG和LOC串口传送数据实现温度显示的keil代码
好的,以下是利用数字温度传感器DS18B20与单片机结合来测量温度的keil代码。这段代码计算温度值后,在3位共阴极LED数码管上显示温度,精确到0.5℃。
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^4; //定义DS18B20的数据引脚
sbit LSA = P2^2; //定义LSA
sbit LSB = P2^3; //定义LSB
sbit LSC = P2^4; //定义LSC
uchar code ledChar[] = { //定义数码管显示字符
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(uint i) { //延时函数
while(i--);
}
void ds18b20Init() { //DS18B20初始化
uchar i;
DQ = 1; //先将总线拉高
delay(10);
DQ = 0; //发送复位脉冲
delay(800);
DQ = 1; //释放总线
delay(10);
i = DQ; //检测DS18B20是否存在
delay(500);
}
void ds18b20WriteByte(uchar dat) { //DS18B20写入字节
uchar i;
for(i = 0; i < 8; i++) {
DQ = 0; //拉低总线开始传输
_nop_();
DQ = dat & 0x01; //传输数据
delay(5);
DQ = 1; //释放总线
dat >>= 1;
}
delay(5);
}
uchar ds18b20ReadByte() { //DS18B20读取字节
uchar i, dat = 0;
for(i = 0; i < 8; i++) {
DQ = 0; //拉低总线开始传输
_nop_();
dat >>= 1; //读取数据
if(DQ) dat |= 0x80;
delay(5);
DQ = 1; //释放总线
}
return dat;
}
void ds18b20Convert() { //DS18B20温度转换
ds18b20Init(); //初始化DS18B20
ds18b20WriteByte(0xcc); //跳过ROM操作
ds18b20WriteByte(0x44); //启动温度转换
}
int ds18b20ReadTemp() { //DS18B20读取温度
uchar tempL, tempH;
int temp;
ds18b20Init(); //初始化DS18B20
ds18b20WriteByte(0xcc); //跳过ROM操作
ds18b20WriteByte(0xbe); //读取温度寄存器
tempL = ds18b20ReadByte(); //读取温度低字节
tempH = ds18b20ReadByte(); //读取温度高字节
temp = tempH;
temp <<= 8;
temp |= tempL;
return temp;
}
void displayTemp(int temp) { //温度显示函数
uchar i, j;
uchar dataArray[3];
if(temp < 0) { //负数处理
temp = ~temp + 1;
dataArray[0] = 0x40;
} else {
dataArray[0] = 0x00;
}
dataArray[1] = ledChar[temp / 10 % 10]; //十位数码管
dataArray[2] = ledChar[temp % 10]; //个位数码管
for(i = 0; i < 3; i++) {
switch(i) { //根据i的值选择点亮的数码管
case 0:
LSA = 0; LSB = 0; LSC = 0;
break;
case 1:
LSA = 1; LSB = 0; LSC = 0;
break;
case 2:
LSA = 0; LSB = 1; LSC = 0;
break;
}
for(j = 0; j < 8; j++) {
P0 = dataArray[i]; //输出数码管编码
delay(1);
P0 = 0x00; //关闭数码管
delay(1);
dataArray[i] >>= 1;
}
}
}
void main() {
int temp;
while(1) {
ds18b20Convert(); //温度转换
delay(500); //等待转换完成
temp = ds18b20ReadTemp(); //读取温度
temp = temp * 625 / 100; //将温度值转换为0.1℃
displayTemp(temp * 2); //温度显示,精确到0.5℃
delay(1000); //延时1秒
}
}
```
注意:以上代码仅供参考,实际应用时需要根据具体情况进行修改。
阅读全文