请教 下 我现在 用 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);
}
}
}
|