51单片机ds18b20数码管显示温度
时间: 2023-07-29 11:09:30 浏览: 136
51单片机源码程序-1个18B20 温度传感器 数码管显示.zip
要在51单片机上实现DS18B20数码管显示温度,需要以下步骤:
1. 首先,需要连接DS18B20传感器和数码管到你的51单片机上。连接方法与其他控制器类似,具体可以参考DS18B20数据手册和数码管的数据手册。
2. 然后,需要编写程序来读取DS18B20传感器的温度数据。可以使用单总线协议来读取DS18B20传感器的数据。
3. 接下来,需要将读取到的温度数据转换成数码管可以显示的格式。可以使用数码管的动态扫描方式来实现这个功能。
4. 最后,将转换后的温度数据显示在数码管上。
下面是一个51单片机的示例程序,可以实现DS18B20数码管显示温度的功能:
```c
#include <reg52.h>
// DS18B20传感器连接到P2.0引脚
sbit DQ = P2^0;
// 数码管连接到P0口
sbit LSA=P0^0;
sbit LSB=P0^1;
sbit LSC=P0^2;
sbit LED=P0^7; //数码管的小数点
// DS18B20传感器初始化
void Init_DS18B20(void)
{
unsigned char i;
DQ = 1;
i = 1;
while(i--);
DQ = 0;
i = 80;
while(i--);
DQ = 1;
i = 1;
while(i--);
}
// DS18B20传感器写1
void Write_DS18B20_1(void)
{
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
}
// DS18B20传感器写0
void Write_DS18B20_0(void)
{
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 0;
}
// DS18B20传感器读1
bit Read_DS18B20_1(void)
{
bit flag;
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
flag = DQ;
return flag;
}
// DS18B20传感器读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat = 0;
for(i=8; i>0; i--)
{
dat >>= 1;
if(Read_DS18B20_1())
{
dat |= 0x80;
}
else
{
dat &= 0x7F;
}
}
return dat;
}
// DS18B20传感器写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=8; i>0; i--)
{
if(dat & 0x01)
{
Write_DS18B20_1();
}
else
{
Write_DS18B20_0();
}
dat >>= 1;
}
}
// 读取DS18B20传感器的温度数据
float ReadTemperature(void)
{
unsigned char TL, TH;
float temperature;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
while(!Read_DS18B20_1());
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
TL = Read_DS18B20();
TH = Read_DS18B20();
temperature = TH;
temperature <<= 8;
temperature |= TL;
temperature /= 16;
return temperature;
}
// 数码管显示温度数据
void Display(float temperature)
{
unsigned int temp = (unsigned int)(temperature * 10);
LSA=0;LSB=0;LSC=0;LED=0; //清零
P0 = 0xc0; //选择第一位数码管
P0 |= temp / 1000; //写入千位数字
P0 &= 0xcf; //关闭小数点
delay(5);
LSA=1;LSB=0;LSC=0;LED=0; //清零
P0 = 0xf9; //选择第二位数码管
P0 |= temp % 1000 / 100; //写入百位数字
P0 &= 0xcf; //关闭小数点
delay(5);
LSA=0;LSB=1;LSC=0;LED=0; //清零
P0 = 0xa4; //选择第三位数码管
P0 |= temp % 100 / 10; //写入十位数字
P0 &= 0xcf; //关闭小数点
delay(5);
LSA=1;LSB=1;LSC=0;LED=1; //清零
P0 = 0xb0; //选择第四位数码管
P0 |= temp % 10; //写入个位数字
P0 &= 0xcf; //打开小数点
delay(5);
}
void main()
{
float temperature;
while(1)
{
temperature = ReadTemperature();
Display(temperature);
}
}
```
这个程序通过单总线协议来读取DS18B20传感器的温度数据,使用了数码管的动态扫描方式来实现显示。在main函数中,程序循环读取温度数据并显示在数码管上。注意要适当延时,以确保数码管可以正常显示。
阅读全文