stm32f103c8t6连接DHT11温湿度模块 采集温湿度并在数码管显示

 

  LED4BitTM1637.h 数码管.h文件

#ifndef __LED4BITTM1637_H
#define __LED4BITTM1637_H
#include "sys.h"
#include "delay.h"

//iic
#define TM1637_CLK_Low    GPIO_ResetBits(GPIOC,GPIO_Pin_15)  	//低电平
#define TM1637_CLK_High   GPIO_SetBits(GPIOC,GPIO_Pin_15)			//高电平
#define TM1637_DIO_Low    GPIO_ResetBits(GPIOC,GPIO_Pin_14)  	
#define TM1637_DIO_High   GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define TM1637_DIO_IN     GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)//读当IO口设置为输入状态时候的IO口值

//开始信号;数据输入的开始条件是CLK为高电平 CLK为高电平时,DIO 由高变低
void TM1637_Start(void);
//IIC的GPIO初始化
void LED4Bit_IIC_GPIO_Configuration(void);
//应答信号;当传输数据正确时,会在第八个时钟的下降沿,
//芯片内部会产生一个应答信号ACK将DIO管脚拉低,在第九个时钟结束之后释放DIO口线
void TM1637_Ack(void);
//停止信号;结束条件是CLK为高时,DIO由低电平变为高电平
void TM1637_Stop(void);
//写数据
void TM1637_WriteByte(unsigned char oneByte);
//显示变量值
void TM1637_DisplayChar(unsigned int Addr,unsigned int Data);
//只能输入4位数字
void LEDdisplay(unsigned int num);


#endif

 LED4BitTM1637.c 数码管初始化函数

#include "LED4BitTM1637.h"

//单个数码管数组显示0123456789
unsigned char NumData[10]={0x3f,0x06,0x5b,0x4f,
								0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9

//开始信号;数据输入的开始条件是CLK为高电平 CLK为高电平时,DIO 由高变低
void TM1637_Start(void)
{
	TM1637_CLK_High;
	TM1637_DIO_High;
	Delayus(2);
	TM1637_DIO_Low;
}
/**************************延时***********************************/


/*************************LED4Bit_IIC_GPIO初始化******************/
void LED4Bit_IIC_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能AFIO时钟	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;//C15-SCL	C14-SDA
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//OD
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//应答信号;当传输数据正确时,会在第八个时钟的下降沿,
//芯片内部会产生一个应答信号ACK将DIO管脚拉低,在第九个时钟结束之后释放DIO口线
void TM1637_Ack(void)
{
  TM1637_CLK_Low;
  Delayus(5);
  while(TM1637_DIO_IN);//读取DIO口的状态,0为有应答信号
  TM1637_CLK_High;
  Delayus(2);
  TM1637_CLK_Low;
}
//停止信号;结束条件是CLK为高时,DIO由低电平变为高电平
void TM1637_Stop(void)
{
   TM1637_CLK_Low;
   Delayus(2);
   TM1637_DIO_Low;
   Delayus(2);
   TM1637_CLK_High;
   Delayus(2);
   TM1637_DIO_High;
}
//写数据
void TM1637_WriteByte(unsigned char oneByte)
{
	unsigned int i;
	//发送8位数据
	for(i=0;i<8;i++)
  {
		TM1637_CLK_Low;
		//从最低位开始发送
		if(oneByte&0x01)
    {
			TM1637_DIO_High;
    }
    else
    {
			TM1637_DIO_Low;
    }
    Delayus(3);
    oneByte=oneByte>>1;//右移一位
    TM1637_CLK_High;
    Delayus(3);
  }
}

//显示变量值
void TM1637_DisplayChar(unsigned int Addr,unsigned int Data)
{
	unsigned char i;
	if(Addr>10)Addr=0;//防止数组越界
	//数据命令设置
	TM1637_Start();
	TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
	TM1637_Ack();
	TM1637_Stop();
	TM1637_Start();
	TM1637_WriteByte(0xC0+Data);//设置首地址,0XC0地址开始显示
	TM1637_Ack();
	for(i=0;i<6;i++)  //地址自加,不必每次都写地址    i<6
	{	   
		TM1637_WriteByte(NumData[Addr]);//显示
		TM1637_Ack();
	}
	TM1637_Stop();
	TM1637_Start();
	TM1637_WriteByte(0x8f);	//开显示控制
	TM1637_Ack();
	TM1637_Stop();
}
//只能输入4位数字
void LEDdisplay(unsigned int num)
{
	unsigned char qian,bai,shi,ge;
	qian=num/1000;
	bai=num%1000/100;
	shi=num%100/10;
	ge=num%10;
	TM1637_DisplayChar(qian,0);		 //写寄存器并开显示
	TM1637_DisplayChar(bai, 1); 	 //写寄存器并开显示
	TM1637_DisplayChar(shi, 2);	 	 //写寄存器并开显示
	TM1637_DisplayChar(ge,	3);		 //写寄存器并开显示
}

 DHT11温湿度模块采集温湿度

#include "LED4BitTM1637.h"
#include "usart.h"
#include "led.h"
#include "sys.h"
#include "delay.h"

/*******************DHT11温度湿度采集*****************/
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=8<<4;}//上拉下拉输入
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=3<<4;}//输出,50MHz								   
#define	DHT11_DQ_OUT PAout(1) //数据端口	PA1 
#define	DHT11_DQ_IN  PAin(1)  //数据端口	PA1 

u8 DHT11_Init(void);                     //初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);   //读取温湿度
u8 DHT11_Read_Byte(void);                //读出一个字节
u8 DHT11_Read_Bit(void);                 //读出一个位
u8 DHT11_Check(void);                    //检测是否存在DHT11
void DHT11_Rst(void);                    //复位DHT11  

/*******************复位DHT11*********************/
void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); //SET OUTPUT
  DHT11_DQ_OUT=0; 	//拉低DQ
  Delayms(20);    	//拉低至少18ms
  DHT11_DQ_OUT=1; 	//DQ=1 
	Delayus(30);    //主机拉高20~40us
}
/******************等待DHT11的回应***********************/
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
  while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
	{
		retry++;
		Delayus(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		Delayus(1);
	};
	if(retry>=100)return 1;	 //返回1:未检测到DHT11的存在
	return 0;                //返回0:存在
}
/*******************从DHT11读取一个位********************/
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		Delayus(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		Delayus(1);
	}
	Delayus(40);//等待40us
	if(DHT11_DQ_IN)return 1; //返回值:1
	else return 0;		     //返回值: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读取一次数据******************/
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;//返回值:1,读取失败
	return 0;	   //返回值: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_1;			 //PG11端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
 	GPIO_SetBits(GPIOA,GPIO_Pin_1);						 //PG11 输出高
			    
	DHT11_Rst();          //复位DHT11
	return DHT11_Check(); //等待DHT11的回应
} 


/**************************主函数******************************************/
int main(void)
{
	u8 temperature;  	    
	u8 humidity;
	uart_init(115200);//串口初始化9600
	LED4Bit_IIC_GPIO_Configuration();				//LED4Bit_IIC_GPIO初始化
	DHT11_Init();	//DHT11初始化
	Delayms(30);
	while(1)
	{
		DHT11_Read_Data(&temperature,&humidity); //读取温湿度值	
		LEDdisplay(temperature);//显示温度
		Delayms(600);
		LEDdisplay(humidity);	//显示湿度
		Delayms(600);
	}
}

 

你可能感兴趣的:(STM32)