打印
[STM32F1]

请教 stm32 dht11 以及1602 现实问题

[复制链接]
987|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
书的那页|  楼主 | 2015-9-5 23:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教  下 我现在 用 stm32   在串口上打印 dht11的 温湿度 数据刷新正常 但是 在 1602上显示   数据 无法刷新 它一直保持初始值  不知道 为何啊

dht11.c
#include "Systick.h"
#include "dht11.h"
#include "led.h"
#include <stdio.h>
//extern uint8_t mm;

uint8_t mm;

//IO·½ÏòÉèÖÃ
#define DHT11_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}

////IO²Ù×÷º¯Êý                                                                                          
#define        DHT11_DQ_IN  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)  //Êý¾Ý¶Ë¿Ú        PA11

//´ÓDHT11¶ÁÈ¡Ò»¸öλ
//·µ»ØÖµ£º1/0
u8 DHT11_Read_Bit(void)                          
{
        u8 retry=0;
        while(DHT11_DQ_IN&&retry<100)//µÈ´ýµÍµçƽ
        {
                retry++;
                Delay_us(2);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//µÈ´ý¸ßµçƽ
        {
                retry++;
                Delay_us(2);
        }
        Delay_us(40);//µÈ´ý40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}

//µÈ´ýDHT11µÄ»ØÓ¦
//·µ»Ø1:δ¼ì²âµ½DHT11µÄ´æÔÚ
//·µ»Ø0:´æÔÚ
u8 DHT11_Check(void)           
{   
        u8 retry=0;
        DHT11_IO_IN();//½«PA11ÉèÖÃΪÊäÈëģʽ         
    while (DHT11_DQ_IN&&retry<100)//DHT11»áÀ­µÍ40~80us£¬ÕâÀï²âÁ¿PA11À­µÍµÄʱ¼äÊÇ·ñ·ûºÏÒªÇó
        {
                retry++;
                Delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11À­µÍºó»áÔÙ´ÎÀ­¸ß40~80us
        {
                retry++;
                Delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}
//´ÓDHT11¶ÁÈ¡Ò»¸ö×Ö½Ú
//·µ»ØÖµ£º¶Áµ½µÄÊý¾Ý
u8 DHT11_Read_Byte(void)   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT11_Read_Bit();
    }                                                    
    return dat;
}
//¸´Î»DHT11
void DHT11_Rst(void)          
{                 
        DHT11_IO_OUT();         //ÉèÖÃPA11ΪÊä³öģʽ
        GPIO_ResetBits(GPIOA,GPIO_Pin_11); //À­µÍÒý½Å

        Delay_us(20000);   //ÑÓʱ20ºÁÃë
        GPIO_SetBits(GPIOA,GPIO_Pin_11);
        Delay_us(30);         //ÑÓʱ30΢Ãë
}
//´ÓDHT11¶ÁÈ¡Ò»´ÎÊý¾Ý
//temp:ζÈÖµ(·¶Î§:0~50¡ã)
//humi:ʪ¶ÈÖµ(·¶Î§:20%~90%)
//·µ»ØÖµ£º0,Õý³£;1,¶Áȡʧ°Ü
u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
{        
        u8 buf[5];
        u8 i;
        DHT11_Rst();
//        GPIO_ResetBits(GPIOD,GPIO_Pin_3);
//        printf("\r\n µ±Ç°Î¶È(¡æ)£º %d\r\n", DHT11_Check());
        if(DHT11_Check()==0)
        {
//                GPIO_ResetBits(GPIOD,GPIO_Pin_4);
                for(i=0;i<5;i++)//¶ÁÈ¡40λÊý¾Ý
                {
                        buf[i]=DHT11_Read_Byte();
                        mm=0;
                }


                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp=buf[2];
                }
        }else return 1;
        return 0;            
}
//³õʼ»¯DHT11µÄIO¿Ú DQ ͬʱ¼ì²âDHT11µÄ´æÔÚ
//·µ»Ø1:²»´æÔÚ
//·µ»Ø0:´æÔÚ             
u8 DHT11_Init(void)
{         
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //ʹÄÜPG¶Ë¿ÚʱÖÓ
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                 //PG11¶Ë¿ÚÅäÖÃ
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                 //³õʼ»¯IO¿Ú
        GPIO_SetBits(GPIOA,GPIO_Pin_11);                                        //PG11 Êä³ö¸ß
                            
        DHT11_Rst();  //¸´Î»DHT11
        return DHT11_Check();//µÈ´ýDHT11µÄ»ØÓ¦
}

1602.c
#include "1602.h"
#include "sys.h"
#include "delay.h"



#include "dht11.h"
u8 DHT11_Read_Data(u8 *temp,u8 *humi);

//u8 temperature;              
//u8 humidity;

void Init_LCD1602()
{
  GPIO_InitTypeDef  GPIO_InitStructure;//¶¨ÒåÁËÒ»¸ö±äÁ¿£¬±äÁ¿µÄÃû×ÖΪGPIO_InitStructure£¬±äÁ¿µÄÐÎʽΪ½á¹¹ÌåÐ͵Ä

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC, ENABLE);         //ʹÄÜPE,PC¶Ë¿ÚʱÖÓ

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;                                 //LCD1602µÄÈý¸ù¿ØÖÆÏßen£¬rw,rs
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO¿ÚËÙ¶ÈΪ50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);//¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOC                                         

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//LCD1602µÄ8¸úÊý¾ÝÏß                             //LED1-->PE.5 ¶Ë¿ÚÅäÖÃ, ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO¿ÚËÙ¶ÈΪ50MHz
  GPIO_Init(GPIOE, &GPIO_InitStructure);//¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOE


        wr_com(0x38);//ÉèÖÃLCDÁ½ÐÐÏÔʾ£¬Ò»¸öÊý¾ÝÓÉ5*7µãÕó±íʾ,Êý¾ÝÓÉ8¸úÏß´«Êä
    delay_ms(2);
        wr_com(0x01);//Çå³ýÆÁÄ»ÏÔʾ
        delay_ms(2);
        wr_com(0x06);//É趨ÊäÈ뷽ʽ£¬ÔöÁ¿²»ÒÆλ
        delay_ms(2);
        wr_com(0x0c);//¿ªÕûÌåÏÔʾ£¬¹Ø¹â±ê£¬²»ÉÁ˸
        delay_ms(2);
}

void wr_com(u8 com)                 /*******************дָÁÊý************************/                  
{
  //дָÁî     ÊäÈ룺RS=L£¬RW=L£¬E=ϽµÑØÂö³å
  rs=0;
  rw=0;
  en=1;

  //ʵ¼ÊÉÏÔÚ²Ù×÷ODR¼Ä´æÆ÷,ODR¼Ä´æÆ÷ÊÇÒ»¶Ë¿ÚÊä³öÊý¾Ý¼Ä´æÆ÷£¬¸Ã¼Ä´æÆ÷¿É¶Áд
  //´Ó¸Ã¼Ä´æÆ÷¶Á³öÀ´µÄÊý¾Ý¿ÉÒÔÓÃÓÚÅжϵ±Ç°IO¿ÚµÄ״̬¡£¶øÏò¸Ã¼Ä´æÆ÷ѧÊý¾Ý£¬Ôò¿ÉÒÔ¿ØÖÆij¸öIO¿ÚµÄÊä³öµçƽ¡£          
  GPIO_Write(GPIOE, 0X00FF&com);//¸Ãº¯ÊýÒ»°ãÓÃÀ´ÍùÒ»´ÎÐÔÒ»¸öGPIOµÄ¶à¸ö¶Ë¿ÚÉèÖÃ
  delay_ms(3);
  en=0;
}


void wr_dat(u8 date)                       /*******************дÊý¾Ýº¯Êý************************/
{
  //дÊý¾Ý     ÊäÈ룺RS=H£¬RW=L£¬E=ϽµÑØÂö³å
  rs=1;       
  rw=0;
  en=1;
         
  GPIO_Write(GPIOE, 0X00FF&date);//GPIOAµÄµÚ°ËλÓÃÀ´×÷Ϊ8λÊý¾Ý¿Ú                                          
  delay_ms(3);
  en=0;
}

main:
        while(1)
        {        
                DHT11_Read_Data(&temperature,&humidity);    //¶ÁÈ¡ÎÂʪ¶ÈÖµ       
                table0[5]=temperature/10+0x30;                                            
                table0[6]=temperature%10+0x30;
                tem=temperature*100;                                            
                table0[8]=tem/10%10+0x30;                                            
                table0[9]=tem%10+0x30;                                            

                //?????
                table1[5]=humidity/10+0x30;                                            
                table1[6]=humidity%10+0x30;
                hum=humidity*100;                                            
                table1[8]=hum/10%10+0x30;                                            
                table1[9]=hum%10+0x30;
                wr_com(0x80);
                for(num=0;num<16;num++)
                {
                        wr_dat(table0[num]);
                        delay(8);
                }

                wr_com(0x80+0x40);
                for(num=0;num<16;num++)
                {
                        wr_dat(table1[num]);
                        delay(8);
                }               
                                                                      
        }
}


沙发
毁灭2012| | 2015-9-7 07:38 | 只看该作者
呵呵,这个只看代码感觉看不出什么来啊。。。

使用特权

评论回复
板凳
书的那页|  楼主 | 2015-9-7 11:01 | 只看该作者
毁灭2012 发表于 2015-9-7 07:38
呵呵,这个只看代码感觉看不出什么来啊。。。

嗯嗯  确实是这样  驱动代码是没有什么错误的  可能是工程有问题  昨天自己重建一个工程 就好了  

使用特权

评论回复
地板
书的那页|  楼主 | 2015-9-7 11:02 | 只看该作者
毁灭2012 发表于 2015-9-7 07:38
呵呵,这个只看代码感觉看不出什么来啊。。。

嗯嗯  确实是这样  驱动代码是没有什么错误的  可能是工程有问题  昨天自己重建一个工程 就OK啦

使用特权

评论回复
5
毁灭2012| | 2015-9-22 21:13 | 只看该作者
书的那页 发表于 2015-9-7 11:02
嗯嗯  确实是这样  驱动代码是没有什么错误的  可能是工程有问题  昨天自己重建一个工程 就OK啦 ...

解决了就好啊!!!:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

73

帖子

0

粉丝