如果把采集温度的方式改为八个DS18B20采集温度并且通过数码管循环显示要怎么修改上面的程序
时间: 2024-02-27 22:54:12 浏览: 15
如果要将温度采集方式改为八个DS18B20采集温度并且通过数码管循环显示,需要进行一些修改:
1. 将LM35温度传感器的采集方式修改为DS18B20采集方式,需要使用DS18B20的单线通信协议来实现。
2. 修改数码管显示方式,将采集到的八个温度值依次显示在数码管上,可以使用一个计数器来循环选择温度值进行显示。
以下是修改后的代码示例:
```
#include <reg52.h>
sbit DIO = P1^0; // 数码管数据线
sbit CLK = P1^1; // 数码管时钟线
sbit ONEWIRE = P2^0; // DS18B20通信线
unsigned char code number[10] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned char dispIndex = 0; // 数码管显示温度值的下标
unsigned char temp[8]; // 存储采集到的温度值
void delay(unsigned int t) {
while (t--);
}
void sendData(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
CLK = 0;
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
}
}
void display(unsigned char dat) {
sendData(number[dat]);
sendData(0x80 >> dispIndex);
delay(10);
sendData(0xff);
}
void ds18b20Init() {
ONEWIRE = 1;
delay(2);
ONEWIRE = 0;
delay(480);
ONEWIRE = 1;
delay(60);
}
unsigned char ds18b20ReadByte() {
unsigned char i, dat = 0;
for (i = 0; i < 8; i++) {
dat >>= 1;
ONEWIRE = 0;
delay(2);
ONEWIRE = 1;
delay(2);
if (ONEWIRE) {
dat |= 0x80;
}
delay(60);
}
return dat;
}
void ds18b20WriteByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
ONEWIRE = 0;
delay(2);
ONEWIRE = dat & 0x01;
delay(60);
ONEWIRE = 1;
dat >>= 1;
delay(2);
}
}
void ds18b20Convert() {
ds18b20Init();
ds18b20WriteByte(0xcc);
ds18b20WriteByte(0x44);
delay(750);
}
void ds18b20ReadTemp() {
unsigned char i;
unsigned int t;
ds18b20Init();
ds18b20WriteByte(0xcc);
ds18b20WriteByte(0xbe);
for (i = 0; i < 8; i++) {
temp[i] = ds18b20ReadByte();
temp[i] = ds18b20ReadByte() >> 4 | temp[i] << 4;
t = ds18b20ReadByte();
temp[i] >>= 1;
if (t & 0x01) {
temp[i] |= 0x80;
}
t >>= 1;
if (t & 0x01) {
temp[i] |= 0x40;
}
}
}
void main() {
unsigned char i;
while (1) {
ds18b20Convert();
ds18b20ReadTemp();
for (i = 0; i < 4; i++) {
display(temp[dispIndex % 8] / 10);
dispIndex++;
display(temp[dispIndex % 8] % 10);
dispIndex++;
}
}
}
```
这段代码中,我们使用DS18B20单线通信协议来采集温度值,并将采集到的八个温度值存储在数组temp中。然后使用一个计数器dispIndex来循环选择温度值进行显示,每次循环将两个数码管上的数字显示出来。需要注意的是,由于DS18B20的采集时间较长,需要在采集数据后等待一段时间再进行下一次采集。