王者冰封 发表于 2016-12-3 18:15

DHT11数据采集1602显示proteus8仿真为0,有没有会的大神,解决一下

主程序:
#include<reg51.h>
#include<intrins.h>
#include"DHT11.H"
#include"1602.H"
#define uchar unsigned char
#define uint unsigned int
sbit S1=P3^1;
sbit S2=P3^2;
uchar wendu;
uchar shidu;
uchar I1=50;I2=50;          //设定初始温湿度报警值
//主函数
void main()
{
initialize_lcd();//初始化LCD1602
while(1)
{
   receive();
wendu='w';
wendu='e';
wendu='n';
wendu='d';
wendu='u';
wendu='n';
wendu=':';
wendu=RH/1000+'0'; //温度百位
wendu=RH%1000/100+'0'; //温度十位
wendu=RH%100/10+'0'; //温度个位
wendu='.'; //小数点
wendu=RH%10+'0'; //温度小数点后第一位
lcd_showstring(0,0,wendu);
shidu='s';
shidu='h';
shidu='i';
shidu='d';
shidu= 'u';
shidu= ':';
shidu=TH/1000+'0'; //湿度百位
shidu=TH%1000/100+'0'; //湿度十位
shidu=TH%100/10+'0'; //湿度个位
shidu='.'; //小数点
shidu=TH%10+'0'; //湿度小数点后第一位
lcd_showstring(1,0,shidu);
   delay_ms(500);   
}
}
DHT11:
#ifndef _DHT11_H_
#define _DHT11_H_
#define uchar unsigned char
#define uint unsigned int
uchar RH,RL,TH,TL;
uchar data_byte;
sbit i0=P1^0;       //数据口
void delay_1ms(uint ms)
{
uchar i;
while(ms--)
for (i=0;i<124;i++);
}
void delay_1us(uint us)
{
for(;us>0;us--)
   {
       _nop_();
   }
}
//初始化
void start()//开始信号
{
i0=1;
delay_1us(8);
i0=0;
delay_1ms(25);//拉低至少 18ms保证能检测到起始信号
i0=1;          //检测到开始信号后,将电平拉高20-40us
delay_1us(25);                //可替换成20-40us程序
}
uchar receive_byte()//接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++)
{
   while(!i0);//等待50us的低电平开始信号结束   
   delay_1us(27);    //开始信号结束后,延时26us-28us
   temp=0;   //如果时间为26us-28us 则表示接收的数据为‘0’
   if(i0==1)
    temp=1;//如果时间超过26us-28us 则表示收到的数据为‘1’
        while(i0);//等待数据信号高电平, ‘0’为26us-28us;‘1’为70us
        data_byte<<=1;//将接收到的数据向高位左移
        data_byte|=temp;       
}
return data_byte;
}
       
void receive() //接收数据
{
uchar T_H,T_L,R_H,R_L,check,num_check;
start();//开始信号
i0=1;   //主机设为输入判断从机DHT11的响应信号
if(!i0) //判断是否有响应信号
{
while(!i0);//判断从机发出80us低电平信号是否结束
while(i0);
R_H= receive_byte();//湿度整数
R_L= receive_byte();//湿度小数
T_H= receive_byte();//温度整数
T_L= receive_byte();//温度小数
check= receive_byte();//检验位
i0=0;//当所有的数据接收完成后,将从机电平拉低50us
delay_1us(50);        //拉低50us
i0=1;//将从机电平拉低,进入空闲状态
num_check=R_H+R_L+T_H+T_L;
if(num_check=check)//判断读取的数据与校验位是否相同
{
    RH=R_H;
        RL=R_L;
        TH=T_H;
        TL=T_L;
        check=num_check;
}
}
}
#endif

1602:
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define uchar unsigned char
#define uint unsigned int

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
void delay_ms(uint ms)
{   
    uchar i;
        while(ms--)
    for (i=0;i<120;i++);
}
void delay_us(uint us)
{
   for(;us>0;us--)
   {
       _nop_();
   }
}
void lcd_en_write(void)
{
    EN=1;
    delay_us(20);
    EN=0;
    delay_us(20);
}
bit busy_wait()       //忙等待程序
{
bit lcd_status;
    EN=0;
        RS=0;               //读忙信号
        RW=1;
        EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        lcd_status=(bit)(P0 &0x80);
        EN=0;
return lcd_status;
}
void write_lcd_command(uchar cmd)//写指令
{
    busy_wait();
    EN=0;
    RS=0;
    RW=0;
    P0=cmd;
    lcd_en_write();
}
void write_lcd_data(uchar dat)          //写数据
{
    busy_wait();
    EN=0;
    RS=1;
    RW=0;
    P0=dat;
    lcd_en_write();
}
void initialize_lcd()       //初始化
{
   delay_ms(50);
   write_lcd_command(0x38);    /*显示模式设置*/
   delay_ms(5);
   write_lcd_command(0x38);
   delay_ms(5);
   write_lcd_command(0x38);
   delay_ms(5);
   write_lcd_command(0x38);
   write_lcd_command(0x08);    /*显示关闭*/
   write_lcd_command(0x01);    /*显示清屏*/
   write_lcd_command(0x06);    /*显示光标移动设置*/
   delay_ms(5);
   write_lcd_command(0x0C);    /*显示开及光标设置*/
}
void lcd_showstring(uchar r,uchar c,uchar *str)                  //显示位置
{
    uchar i=0;
    code uchar DDRAM[]={0X80,0XC0};
    write_lcd_command(DDRAM| c);
    while (*str)
{
    write_lcd_data(*str);
   str++;
       i++;
}
    for(;i<16;i++)
    write_lcd_data(' ');
}
void lCD_clear(void)       //清屏函数
{
    write_lcd_command(0x01);
    delay_ms(5);
}
#endif

王者冰封 发表于 2016-12-3 18:38

仿真图上传

C:\Users\xuan wang\Desktop

xyz549040622 发表于 2016-12-3 18:54

你DHT11设定的值是多少呢?先判断是DHT11的读函数不对呢?还是数据放到液晶过程中转换的错误呢?还是硬件的连线错误呢

王者冰封 发表于 2016-12-3 20:15

xyz549040622 发表于 2016-12-3 18:54
你DHT11设定的值是多少呢?先判断是DHT11的读函数不对呢?还是数据放到液晶过程中转换的错误呢?还是硬件的 ...

1602没有错,我用SHT11都可以显示正常,应该是DHT11的读函数有问题,可是我找不到问题在哪里。

xyz549040622 发表于 2016-12-3 21:44

王者冰封 发表于 2016-12-3 20:15
1602没有错,我用SHT11都可以显示正常,应该是DHT11的读函数有问题,可是我找不到问题在哪里。 ...

单总线对时序很严格的,继续调时序吧。再说,仿真本来就是不好找问题。

王者冰封 发表于 2016-12-4 17:57

xyz549040622 发表于 2016-12-3 21:44
单总线对时序很严格的,继续调时序吧。再说,仿真本来就是不好找问题。 ...

已经解决,果然是时序的问题,我一个个的调试和检测,终于做出来了。

weiyuwy 发表于 2016-12-6 13:37

可以告诉我怎么弄吗?我是用MSP430G2553做的,DHT11 也是不可以用

weiyuwy 发表于 2016-12-6 15:56

江湖救急

ningling_21 发表于 2016-12-6 15:58

王者冰封 发表于 2016-12-3 18:38


DHT11用两根线读写数据,你怎么只用一根线,错当成18B20?

weiyuwy 发表于 2016-12-6 21:19

ningling_21 发表于 2016-12-6 15:58
DHT11用两根线读写数据,你怎么只用一根线,错当成18B20?

可以教教我吗?DHT11的仿真没有显示。我很急

ningling_21 发表于 2016-12-7 09:06

weiyuwy 发表于 2016-12-6 21:19
可以教教我吗?DHT11的仿真没有显示。我很急

http://www.51hei.com/bbs/blog-76208-2318.html

参考一下这个程序

xsd130 发表于 2020-4-12 15:59

王者冰封 发表于 2016-12-4 17:57
已经解决,果然是时序的问题,我一个个的调试和检测,终于做出来了。

请问一下是怎么调的?我也是同样的问题{:cry:}
页: [1]
查看完整版本: DHT11数据采集1602显示proteus8仿真为0,有没有会的大神,解决一下