利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为-55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位共阴极LED数码管以SEG和LOC串口传送数据,实现温度显示的keil代码
时间: 2024-02-23 09:57:57 浏览: 88
好的,以下是利用数字温度传感器DS18B20与单片机结合来测量温度的keil代码。
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^4; //定义DS18B20的数据引脚
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, k;
uchar code segNum[] = { //数码管段选编码
0x7f, 0xbf, 0xdf, 0xef,
0xf7, 0xfb, 0xfd, 0xfe
};
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++) {
for(j = 0; j < 8; j++) {
k = segNum[j]; //获取段选编码
if(dataArray[i] & 0x01) { //按位取出数码管编码
k &= 0x7f;
}
P2 = k; //输出段选编码
delay(1);
P0 = dataArray[i]; //输出数码管编码
delay(1);
P0 = 0x00; //关闭数码管
dataArray[i] >>= 1;
}
}
}
void main() {
int temp;
while(1) {
ds18b20Convert(); //温度转换
delay(500); //等待转换完成
temp = ds18b20ReadTemp(); //读取温度
temp = temp * 625 / 100; //将温度值转换为0.1℃
displayTemp(temp); //温度显示
delay(1000); //延时1秒
}
}
```
注意:以上代码仅供参考,实际应用时需要根据具体情况进行修改。
阅读全文