利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为-55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位共阴极LED数码管以SEG和LOC串口传送数据实现温度显示的keil代码
时间: 2024-02-23 13:58:01 浏览: 135
好的,以下是利用数字温度传感器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秒
}
}
```
注意:以上代码仅供参考,实际应用时需要根据具体情况进行修改。
阅读全文