用ds18b20采集温度数据,用数码管显示出来,在51单片机实现
时间: 2024-03-25 18:37:41 浏览: 81
实现功能:使用ds18b20采集温度数据,并通过数码管将温度值以BCD码形式显示出来。
具体实现如下:
```c
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ = P1^4;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar code table[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(uint t) { // 延时函数
while(t--);
}
void ds18b20_init() { // 初始化DS18B20
DQ = 1;
delay(500);
DQ = 0;
delay(80);
DQ = 1;
delay(500);
}
void write_byte(uchar dat) { // 写入一个字节
uchar i;
for(i=0; i<8; i++) {
DQ = 0;
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
uchar read_byte() { // 读取一个字节
uchar i, dat = 0;
for(i=0; i<8; i++) {
DQ = 0;
dat >>= 1;
if(DQ) dat |= 0x80;
delay(5);
DQ = 1;
}
return dat;
}
void get_temp(uchar *temp) { // 获取温度数据
uchar low, high;
ds18b20_init();
write_byte(0xcc);
write_byte(0x44);
delay(100);
ds18b20_init();
write_byte(0xcc);
write_byte(0xbe);
low = read_byte();
high = read_byte();
*temp = ((high << 8) | low) >> 4;
}
void display(uchar *temp) { // 数码管显示函数
uchar i;
uchar buf[4] = {0}; // 数码管显示缓存
for(i=0; i<4; i++) {
buf[i] = table[temp[i]];
}
LSA = 0;
LSB = 0;
LSC = 0;
P0 = buf[0];
delay(2000);
LSA = 1;
LSB = 0;
LSC = 0;
P0 = buf[1];
delay(2000);
LSA = 0;
LSB = 1;
LSC = 0;
P0 = buf[2];
delay(2000);
LSA = 1;
LSB = 1;
LSC = 0;
P0 = buf[3];
delay(2000);
}
void main() {
uchar temp[4] = {0}; // 温度数据缓存,分别保存千位、百位、十位和个位
while(1) {
get_temp(temp); // 获取温度数据
display(temp); // 数码管显示温度数据
}
}
```
以上代码仅供参考,实际使用时需要根据具体情况进行修改。同时,此代码中使用了共阴极的数码管,如果使用共阳极的数码管,需要将代码中的数码管段码表做相应修改。
阅读全文