基于stc89c51单片机1、编写程序读取DS18B20的温度值; 2、编写程序实现温度值的显示(数码管或LED显示,要求保留一位小数显示);
时间: 2024-02-21 17:00:43 浏览: 67
好的,针对您的问题,我可以给您提供一份C语言的代码,实现您的需求。不过需要说明的是,这个代码可能需要根据实际硬件情况进行一些修改,比如PIN脚的配置等等。以下是代码:
```c
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; //DS18B20连接的PIN脚
//延时函数
void Delay(unsigned int t)
{
while(t--);
}
//初始化DS18B20
uchar Init_DS18B20()
{
uchar i;
DQ = 1;
Delay(1);
DQ = 0;
Delay(500);
DQ = 1;
Delay(60);
i = DQ;
Delay(240);
return i;
}
//写一个字节
void Write_DS18B20(uchar dat)
{
uchar i, j;
for(i=0; i<8; i++)
{
j = dat & 0x01;
dat >>= 1;
if(j)
{
DQ = 0;
Delay(6);
DQ = 1;
Delay(64);
}
else
{
DQ = 0;
Delay(60);
DQ = 1;
Delay(10);
}
}
}
//读一个字节
uchar Read_DS18B20()
{
uchar i, j, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
Delay(6);
DQ = 1;
Delay(8);
j = DQ;
Delay(120);
dat = (j<<7) | (dat>>1);
}
return dat;
}
//读取温度值
int Read_Temperature()
{
uchar TL, TH;
int temp;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44); //开始转换
Delay(500);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe); //读取温度值
TL = Read_DS18B20();
TH = Read_DS18B20();
temp = TH;
temp <<= 8;
temp |= TL;
return temp;
}
//数码管显示函数
void Display(int num)
{
uchar i, dis[4];
dis[0] = num % 10;
dis[1] = (num/10) % 10;
dis[2] = (num/100) % 10;
dis[3] = (num/1000) % 10;
for(i=0; i<4; i++)
{
P2 = 0x00;
P0 = dis[i];
P2 = 0x01 << i;
Delay(100);
}
}
//主函数
void main()
{
int temp;
float temp_float;
while(1)
{
temp = Read_Temperature();
temp_float = (float)temp / 16.0;
Display((int)(temp_float * 10)); //显示温度值(保留一位小数)
Delay(1000);
}
}
```
这份代码主要由四个函数组成,分别是:
1. Init_DS18B20():初始化DS18B20传感器,返回值为0表示初始化成功,1表示初始化失败。
2. Write_DS18B20():写一个字节的数据到DS18B20传感器。
3. Read_DS18B20():从DS18B20传感器中读取一个字节的数据。
4. Read_Temperature():读取DS18B20传感器中的温度值。
在主函数中,我们不断读取温度值,并将其转换为浮点数,然后乘以10,最后将其转换为整数,以便数码管显示保留一位小数的温度值。
希望这份代码能对您有所帮助!
阅读全文