51单片机中温度传感器DHT11的代码是对的为什么显示出来却是000、
时间: 2024-04-18 08:30:57 浏览: 18
可能有几个原因导致你的代码显示出来的温度值为000。首先,请确保你的代码正确地连接了DHT11传感器,并且能够正确地读取到传感器的数据。
其次,你需要检查你的代码是否正确地处理了传感器返回的数据。DHT11传感器返回的数据需要经过一些处理才能得到正确的温度值。这些处理包括读取传感器返回的数据位,并进行校验和计算。
最后,也有可能是传感器本身出现了问题。你可以尝试使用其他的DHT11传感器或者使用示波器等工具来检查传感器的输出信号是否正常。
如果你能提供你的代码,我可以帮你进一步分析可能的问题所在。
相关问题
c51单片机温度传感器dht11精联讯屏幕显示
这是一个基于c51单片机和温度传感器dht11的温度监测系统,通过精联讯的屏幕显示实时温度数据。
硬件模块:
- c51单片机
- 温度传感器dht11
- 精联讯LCD屏幕
软件模块:
- C语言编程
- Keil C51开发环境
- DHT11驱动程序
- LCD屏幕驱动程序
实现流程:
1. 初始化温度传感器和LCD屏幕。
2. 循环读取温度传感器数据,计算得到实时温度。
3. 将实时温度数据显示在LCD屏幕上。
代码示例:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DHT11_DATA = P1^0; // 温度传感器数据引脚
sbit LCD_RS = P2^0; // LCD屏幕RS引脚
sbit LCD_RW = P2^1; // LCD屏幕RW引脚
sbit LCD_EN = P2^2; // LCD屏幕EN引脚
sbit LCD_BL = P2^3; // LCD屏幕背光引脚
uchar code Table[] = "Temperature:"; // LCD屏幕显示字符串
void delay_us(uint us)
{
while(us--)
{
_nop_();
_nop_();
}
}
void delay_ms(uint ms)
{
while(ms--)
{
delay_us(1000);
}
}
void LCD_Init()
{
LCD_BL = 1; // 开启背光
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay_ms(15);
LCD_SendCmd(0x38); // 设置16*2显示模式
delay_ms(5);
LCD_SendCmd(0x38);
delay_ms(5);
LCD_SendCmd(0x38);
delay_ms(5);
LCD_SendCmd(0x0c); // 开启显示
delay_ms(5);
LCD_SendCmd(0x01); // 清屏
delay_ms(5);
}
void LCD_SendCmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
P0 = cmd;
delay_us(5);
LCD_EN = 0;
}
void LCD_SendData(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
P0 = dat;
delay_us(5);
LCD_EN = 0;
}
void LCD_DisplayString(uchar x, uchar y, uchar *str)
{
uchar i = 0;
if(x < 16)
{
if(y == 0)
{
LCD_SendCmd(0x80 + x);
}
else
{
LCD_SendCmd(0x80 + 0x40 + x);
}
}
while(str[i] != '\0')
{
LCD_SendData(str[i++]);
}
}
uchar DHT11_ReadData()
{
uchar i, j, res;
for(i = 0; i < 8; i++)
{
DHT11_DATA = 0;
delay_us(18);
DHT11_DATA = 1;
delay_us(40);
res <<= 1;
if(DHT11_DATA)
{
res |= 1;
}
delay_us(40);
}
return res;
}
void DHT11_ReadTemp(uchar *temp)
{
uchar i, j, check_sum;
DHT11_DATA = 0;
delay_ms(20);
DHT11_DATA = 1;
delay_us(30);
if(DHT11_DATA)
{
LCD_DisplayString(0, 0, "DHT11 Error!");
return;
}
delay_us(80);
if(!DHT11_DATA)
{
LCD_DisplayString(0, 0, "DHT11 Error!");
return;
}
delay_us(80);
for(i = 0; i < 5; i++)
{
temp[i] = DHT11_ReadData();
}
check_sum = temp[0] + temp[1] + temp[2] + temp[3];
if(check_sum != temp[4])
{
LCD_DisplayString(0, 0, "DHT11 Error!");
return;
}
}
void main()
{
uchar temp[5];
LCD_Init();
while(1)
{
DHT11_ReadTemp(temp);
LCD_DisplayString(0, 0, Table);
LCD_DisplayString(0, 1, temp);
delay_ms(1000);
}
}
```
c51单片机温度传感器dht11JLX12864G-086显示
要使用c51单片机和温度传感器dht11以及JLX12864G-086显示器来显示温度值,可以按照以下步骤进行操作:
1. 连接硬件:将dht11传感器的VCC引脚连接到单片机的5V电源,GND引脚连接到单片机的GND,DATA引脚连接到单片机的P1.0口;将JLX12864G-086显示器的VCC引脚连接到单片机的5V电源,GND引脚连接到单片机的GND,CS引脚连接到单片机的P2.7口,SID引脚连接到单片机的P2.5口,SCLK引脚连接到单片机的P2.6口,RST引脚连接到单片机的P2.4口。
2. 编写程序:使用c语言编写程序,包括初始化dht11传感器和JLX12864G-086显示器,读取dht11传感器的温度值并将其转换为字符串格式,然后在JLX12864G-086显示器上显示该温度值。
3. 调试程序:将程序下载到单片机上,并连接电源,观察JLX12864G-086显示器是否能够正常显示温度值。如果出现问题,可以通过调试程序来解决。
下面是一个简单的示例程序,可以帮助你开始编写你自己的程序:
```c
#include <reg52.h>
#include <stdio.h>
sbit DHT11_DATA=P1^0;
sbit LCD_CS=P2^7;
sbit LCD_SID=P2^5;
sbit LCD_SCLK=P2^6;
sbit LCD_RST=P2^4;
void Delay10us()
{
int i=2;
while(i--);
}
void DelayMs(unsigned int ms)
{
while(ms--)
{
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
}
}
void LCD_WR_CMD(unsigned char cmd)
{
unsigned char i;
LCD_CS=0;
LCD_SID=0;
Delay10us();
LCD_SCLK=0;
Delay10us();
for(i=0;i<8;i++)
{
if(cmd&0x80)
{
LCD_SID=1;
}
else
{
LCD_SID=0;
}
Delay10us();
LCD_SCLK=1;
Delay10us();
LCD_SCLK=0;
Delay10us();
cmd<<=1;
}
LCD_CS=1;
}
void LCD_WR_DAT(unsigned char dat)
{
unsigned char i;
LCD_CS=0;
LCD_SID=1;
Delay10us();
LCD_SCLK=0;
Delay10us();
for(i=0;i<8;i++)
{
if(dat&0x80)
{
LCD_SID=1;
}
else
{
LCD_SID=0;
}
Delay10us();
LCD_SCLK=1;
Delay10us();
LCD_SCLK=0;
Delay10us();
dat<<=1;
}
LCD_CS=1;
}
void LCD_Init()
{
LCD_RST=0;
DelayMs(100);
LCD_RST=1;
DelayMs(100);
LCD_WR_CMD(0x30);
DelayMs(50);
LCD_WR_CMD(0x0c);
DelayMs(50);
LCD_WR_CMD(0x01);
DelayMs(50);
}
void DHT11_Init()
{
DHT11_DATA=1;
DelayMs(1000);
}
unsigned char DHT11_Read_Byte()
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
while(!DHT11_DATA);
Delay10us();
if(DHT11_DATA)
{
dat|=1<<(7-i);
while(DHT11_DATA);
}
}
return dat;
}
void DHT11_Read_Temp(unsigned char *temp)
{
unsigned char dat[5],i;
DHT11_Init();
DHT11_DATA=0;
DelayMs(18);
DHT11_DATA=1;
while(DHT11_DATA);
for(i=0;i<5;i++)
{
dat[i]=DHT11_Read_Byte();
}
if(dat[0]+dat[1]+dat[2]+dat[3]==dat[4])
{
*temp=dat[2];
}
else
{
*temp=0xff;
}
}
void main()
{
unsigned char temp;
char str[5];
LCD_Init();
while(1)
{
DHT11_Read_Temp(&temp);
sprintf(str,"%d",temp);
LCD_WR_CMD(0x34);
LCD_WR_CMD(0x80);
LCD_WR_DAT('T');
LCD_WR_DAT('e');
LCD_WR_DAT('m');
LCD_WR_DAT('p');
LCD_WR_DAT(':');
LCD_WR_DAT(str[0]);
LCD_WR_DAT(str[1]);
LCD_WR_DAT(str[2]);
LCD_WR_DAT(str[3]);
DelayMs(1000);
}
}
```