STM32 软件IIC OLED温湿度显示


用的板子是STM32最小系统板STM32F103C8T6
原理之前再硬件IIC那篇文章中写过,就不写了,直接附上代码了

oled.c

#include "stm32f10x.h"
#include "oled.h"
#include "oledfont.h"
#include "delay.h"
//static void delay_u(unsigned char num)
//{
//     uint8_t i=10;
//	  while(num--)
//		{
//		
//		 while(i--);
//		
//		}



//}

//static void delay_ms(unsigned int ms)
//{
//    unsigned int x,y;
//	 for(x = ms; x > 0 ; x--)
//	{
//	     for(y = 12000;y>0;y--);
//	
//	}


//}


static void OLED_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	//¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);	//´ò¿ªGPIOCµÄÍâÉèʱÖÓ
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;	//Ñ¡Ôñ¿ØÖƵÄÒý½Å
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;	//ÉèÖÃΪͨÓÿªÂ©Êä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//ÉèÖÃÊä³öËÙÂÊΪ50MHz
	GPIO_Init(GPIOB,&GPIO_InitStructure);	//µ÷Óÿ⺯Êý³õʼ»¯GPIOA
	
	OLED_SCLK_Set();	//ÉèPC2£¨SCL£©Îª¸ßµçƽ
	OLED_SDIN_Set();	//ÉèPC3£¨SDA£©Îª¸ßµçƽ
}


static void OLED_IIC_Start(void)
{

	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	   delay_us(1);
	OLED_SDIN_CLr();	//ÐźÅÏßÖõÍ
	   delay_us(1);
	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
	   delay_us(1);
}

static void OLED_IIC_Stop(void)
{
	OLED_SDIN_CLr();	//ÐźÅÏßÖõÍ
	   delay_us(1);
	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	   delay_us(1);
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	   delay_us(1);
}


static unsigned char IIC_Wait_Ack(void)
{
	unsigned char ack;

	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
	 delay_us(1);
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	 delay_us(1);
	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	 delay_us(1);

	if(OLED_READ_SDIN())	//¶ÁÈ¡SDAµÄµçƽ
		ack = IIC_NO_ACK;	//Èç¹ûΪ1£¬Ôò´Ó»úûÓÐÓ¦´ð
	else
		ack = IIC_ACK;		//Èç¹ûΪ0£¬Ôò´Ó»úÓ¦´ð

	OLED_SCLK_CLr();//ʱÖÓÏßÖõÍ
	 delay_us(1);

	return ack;	//·µ»Ø¶ÁÈ¡µ½µÄÓ¦´ðÐÅÏ¢
}


static void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;  //¶¨Òå±äÁ¿
	for(i=0;i<8;i++) //forÑ­»·8´Î
	{
		OLED_SCLK_CLr();	//ʱÖÓÏßÖõͣ¬Îª´«ÊäÊý¾Ý×ö×¼±¸
		 delay_us(1);

		if(IIC_Byte & 0x80)	//¶ÁÈ¡×î¸ßλ
		  	OLED_SDIN_Set();//×î¸ßλΪ1
		else
			OLED_SDIN_CLr();	//×î¸ßλΪ0

		IIC_Byte <<= 1;  //Êý¾Ý×óÒÆ1λ
		 delay_us(1);
		OLED_SCLK_Set(); //ʱÖÓÏßÖøߣ¬²úÉúÉÏÉýÑØ£¬°ÑÊý¾Ý·¢ËͳöÈ¥
		 delay_us(1);
	}
	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
		 delay_us(1);

	while(IIC_Wait_Ack());	//´Ó»úÓ¦´ð
}



static void Write_IIC_Command(unsigned char IIC_Command)
{
   OLED_IIC_Start();
   Write_IIC_Byte(0x78);//дÈë´Ó»úµØÖ·£¬SD0 = 0
   Write_IIC_Byte(0x00);//дÈëÃüÁî
   Write_IIC_Byte(IIC_Command);//Êý¾Ý
   OLED_IIC_Stop();  //·¢ËÍÍ£Ö¹ÐźÅ
}


/*
	@brief			IICдÈëÊý¾Ý
	@param			IIC_Data£ºÊý¾Ý
	@retval			ÎÞ
 */
static void Write_IIC_Data(unsigned char IIC_Data)
{
   OLED_IIC_Start();
   Write_IIC_Byte(0x78);	//дÈë´Ó»úµØÖ·£¬SD0 = 0
   Write_IIC_Byte(0x40);	//дÈëÊý¾Ý
   Write_IIC_Byte(IIC_Data);//Êý¾Ý
   OLED_IIC_Stop();		//·¢ËÍÍ£Ö¹ÐźÅ
}

//¶ÔOLEDдÈëÒ»¸ö×Ö½Ú

void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
{
	if(cmd) 
	  {
       Write_IIC_Data(dat); //дÈëÊý¾Ý
	  }
	else {
       Write_IIC_Command(dat); //дÈëÃüÁî
	}
}


//ÉèÖÃÊý¾ÝдÈëµÄÆðʼÐУ¬ÁÐ
//x: ÁеÄÆðʼµÍµØÖ·ÓÚÆðʼ¸ßµØÖ·
//y: Ò³ ÆðʼҳµÄµØÖ· 0-7

void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);//дÈëÒ³µØÖ·
	OLED_WR_Byte((x&0x0f),OLED_CMD);  //дÈëÁеĵØÖ·  µÍ°ë×Ö½Ú
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//дÈëÁеĵØÖ· ¸ß°ë×Ö½Ú
}   	     	  


/*
	@brief			¿ªÏÔʾ
	@param			ÎÞ
	@retval			ÎÞ
 */ 
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //ÉèÖÃOLEDµçºÉ±Ã
	OLED_WR_Byte(0X14,OLED_CMD);  //ʹÄÜ£¬¿ª
	OLED_WR_Byte(0XAF,OLED_CMD);  //¿ªÏÔʾ
}


/*
	@brief			¹ØÏÔʾ
	@param			ÎÞ
	@retval			ÎÞ
 */  
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0XAE,OLED_CMD);  //¹ØÏÔʾ
	OLED_WR_Byte(0X8D,OLED_CMD);  //ÉèÖÃOLEDµçºÉ±Ã
	OLED_WR_Byte(0X10,OLED_CMD);  //ʧÄÜ£¬¹Ø
}		   			 

//ÇåÆÁÄ»
void OLED_Clear(void)  
{  
	unsigned char i,n;		    //¶¨Òå±äÁ¿
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //´Ó0~7Ò³ÒÀ´ÎдÈë
		OLED_WR_Byte (0x00,OLED_CMD);      //Áе͵ØÖ·
		OLED_WR_Byte (0x10,OLED_CMD);      //ÁиߵØÖ·  
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); //дÈë 0 ÇåÆÁ
	}
}
void OLED_ShouChar(unsigned char x,unsigned char y,unsigned char chr)
{

    unsigned char c = 0,i=0;
    c =chr - ' '; //»ñÈ¡×Ö·ûµÄÆ«ÒÆÁ¿
	 if(x>Max_Column)
	 {
	   x = 0;  //Èç¹ûÁгöÁË·¶Î§£¬¾Í´ÓÏÂÁ½Ò³µÄµÚ0ÁпªÊ¼
		 y=y+2;
	  
	 }
   if(SIZE == 16)   //×Ö·û´óСÈç¹ûΪ16 =8 *16
	 {
	   OLED_Set_Pos(x,y); //´Óx,y¿ªÊ¼»­µã
		 for(i=0;i<8;i++)
	  OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);//ÕÒ³ö×Ö·ûcµÄÊý×éλÊý£¬ÏȰѵÚÒ»Áл­Íê
	 	 OLED_Set_Pos(x,y+1); //´Óx,y¿ªÊ¼»­µã
		 for(i=0;i<8;i++)
	  OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);//ÕÒ³ö×Ö·ûcµÄÊý×éλÊý£¬ÏȰѵÚÒ»Áл­Íê

	 
	 }
	 else // 6 =6*8
	 {
	    	   OLED_Set_Pos(x,y); //´Óx,y¿ªÊ¼»­µã

	 		    for(i=0;i<6;i++)
	       OLED_WR_Byte(F6x8[c][i],OLED_DATA);//ÕÒ³ö×Ö·ûcµÄÊý×éλÊý£¬ÏȰѵÚÒ»Áл­Íê

	 
	 
	 }

}
void OLED_Init(void)
{
	OLED_GPIO_Init();	//GPIO¿Ú³õʼ»¯
 
	delay_ms(200);	//ÑÓ³Ù£¬ÓÉÓÚµ¥Æ¬»úÉϵç³õʼ»¯±ÈOLED¿ì£¬ËùÒÔ±ØÐë¼ÓÉÏÑÓ³Ù£¬µÈ´ýOLEDÉϸ´Î»Íê³É

	OLED_WR_Byte(0xAE,OLED_CMD);	//¹Ø±ÕÏÔʾ

	OLED_WR_Byte(0x00,OLED_CMD);	//ÉèÖõÍÁеØÖ·
	OLED_WR_Byte(0x10,OLED_CMD);	//ÉèÖøßÁеØÖ·
	OLED_WR_Byte(0x40,OLED_CMD);	//ÉèÖÃÆðʼÐеØÖ·
	OLED_WR_Byte(0xB0,OLED_CMD);	//ÉèÖÃÒ³µØÖ·

	OLED_WR_Byte(0x81,OLED_CMD); 	// ¶Ô±È¶ÈÉèÖ㬿ÉÉèÖÃÁÁ¶È
	OLED_WR_Byte(0xFF,OLED_CMD);	//  265  

	OLED_WR_Byte(0xA1,OLED_CMD);	//ÉèÖöΣ¨SEG£©µÄÆðʼӳÉäµØÖ·£»columnµÄ127µØÖ·ÊÇSEG0µÄµØÖ·
	OLED_WR_Byte(0xA6,OLED_CMD);	//Õý³£ÏÔʾ£»0xa7ÄæÏÔʾ

	OLED_WR_Byte(0xA8,OLED_CMD);	//ÉèÖÃÇý¶¯Â·Êý£¨16~64£©
	OLED_WR_Byte(0x3F,OLED_CMD);	//64duty
	
	OLED_WR_Byte(0xC8,OLED_CMD);	//ÖØÓ³Éäģʽ£¬COM[N-1]~COM0ɨÃè

	OLED_WR_Byte(0xD3,OLED_CMD);	//ÉèÖÃÏÔʾƫÒÆ
	OLED_WR_Byte(0x00,OLED_CMD);	//ÎÞÆ«ÒÆ
	
	OLED_WR_Byte(0xD5,OLED_CMD);	//ÉèÖÃÕðµ´Æ÷·ÖƵ
	OLED_WR_Byte(0x80,OLED_CMD);	//ʹÓÃĬÈÏÖµ
	
	OLED_WR_Byte(0xD9,OLED_CMD);	//ÉèÖÃ Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);	//ʹÓùٷ½ÍƼöÖµ
	
	OLED_WR_Byte(0xDA,OLED_CMD);	//ÉèÖÃ com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);	//ʹÓÃĬÈÏÖµ
	
	OLED_WR_Byte(0xDB,OLED_CMD);	//ÉèÖà Vcomh£¬¿Éµ÷½ÚÁÁ¶È£¨Ä¬ÈÏ£©
	OLED_WR_Byte(0x40,OLED_CMD);	ʹÓùٷ½ÍƼöÖµ
	
	OLED_WR_Byte(0x8D,OLED_CMD);	//ÉèÖÃOLEDµçºÉ±Ã
	OLED_WR_Byte(0x14,OLED_CMD);	//¿ªÏÔʾ
	
	OLED_WR_Byte(0xAF,OLED_CMD);	//¿ªÆôOLEDÃæ°åÏÔʾ
	OLED_Clear();        //ÇåÆÁ
	OLED_Set_Pos(0,0); 	 //ÉèÖÃÊý¾ÝдÈëµÄÆðʼÐС¢ÁÐ
}  

//ÏÔʾ×Ö·û´®
void OLED_ShowString(unsigned char x, unsigned char y,unsigned char *chr)
{
   unsigned char j=0;
	 while(chr[j] != '\0') //ÅжÏÊDz»ÊÇ×îºóÒ»¸ö×Ö·û
	 {
	    
    OLED_ShouChar(x,y,chr[j]);//ÏÔʾ×Ö·û
		 x+=8;  //ÁÐÊý+8£¬Ò»¸ö×Ö·ûÕ¼ 8
		 if(x>=128)
		 {
		     x= 0 ;
			   y +=2;
		    
		 }
		 j++;
	 }



}
//¼ÆËãm^n´Î·½£¬result Ò»¸öÊýµÄn´Î·½
unsigned int oled_pow(unsigned char m,unsigned char n)
{
	unsigned int result=1;	 
	while(n--)result*=m;    
	return result;
}			
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size)
{         	
	unsigned char t,temp;  //¶¨Òå±äÁ¿
	unsigned char enshow=0;		//¶¨Òå±äÁ¿

	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;//È¡³öÊäÈëÊýµÄÿ¸ö룬Óɸߵ½µÍ
		if(enshow==0&&t<(len-1)) //enshow£ºÊÇ·ñΪµÚÒ»¸öÊý£»t<(len-1)£ºÅжÏÊÇ·ñΪ×îºóÒ»¸öÊý
		{
			if(temp==0) //Èç¹û¸ÃÊýΪ0 
			{
				OLED_ShouChar(x+(size/2)*t,y,' ');//ÏÔʾ 0 £»x+(size2/2)*t¸ù¾Ý×ÖÌå´óСƫÒƵÄÁÐÊý£¨8£©
				continue; //Ìø¹ýÊ£ÏÂÓï¾ä£¬¼ÌÐøÖظ´Ñ­»·£¨±ÜÃâÖظ´ÏÔʾ£©
			}else enshow=1; 
		}
	 	OLED_ShouChar(x+(size/2)*t,y,temp+'0'); //ÏÔʾһ¸öλ£»x+(size2/2)*t¸ù¾Ý×ÖÌå´óСƫÒƵÄÁÐÊý£¨8£©
	}
} 

void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
{
    unsigned char t,adder = 0;
	  OLED_Set_Pos(x,y);
	for(t=0;t<16;t++)
	{ 
		 OLED_WR_Byte( Hzk[2*no][t],OLED_DATA);//»­ noÔÚÊý×éλÖõĵÚÒ»Ò³16Áеĵã
		 adder+=1; //Êý×éµØÖ·+1
	}
		  OLED_Set_Pos(x,y+1);
	for(t=0;t<16;t++)
	{
     OLED_WR_Byte( Hzk[2*no+1][t],OLED_DATA);//»­ noÔÚÊý×éλÖõĵÚ2Ò³16Áеĵã
		 adder+=1; //Êý×éµØÖ·+1

	}


}

oled.h

#ifndef _OLED_H_
#define _OLED_H_

#include "stm32f10x.h"

#define  OLED_SCLK_Set()    GPIO_SetBits(GPIOB,GPIO_Pin_0)  //PB0(SCL)Êä³ö¸ß
#define  OLED_SCLK_CLr()    GPIO_ResetBits(GPIOB,GPIO_Pin_0) //PB0(SCL)Êä³öµÍ
#define  OLED_SDIN_Set()    GPIO_SetBits(GPIOB,GPIO_Pin_1)  //PB1(SDA)Êä³ö¸ß
#define  OLED_SDIN_CLr()    GPIO_ResetBits(GPIOB,GPIO_Pin_1) //PB1(SDA)Êä³öµÍ
#define  OLED_READ_SDIN()    GPIO_ReadInputDataBit(GPIOB,  GPIO_Pin_1) //¶ÁÈ¡PB1(SDA)µçƽ

   
#define IIC_ACK  0  //Ó¦´ð
#define IIC_NO_ACK  1  //²»Ó¦´ð
#define  OLED_CMD 0 //дÃüÁî
#define  OLED_DATA  1 //дÊý¾Ý
#define SIZE 		16		//ÏÔʾ×Ö·ûµÄ´óС
#define Max_Column	128		//×î´óÁÐÊý			  				  

//static void delay_u(unsigned char num);
//static void delay_ms(unsigned int ms);
static void OLED_IIC_Start(void);
static void OLED_IIC_Stop(void);
static unsigned char IIC_Wait_Ack(void);
static void Write_IIC_Byte(unsigned char IIC_Byte);
static void Write_IIC_Command(unsigned char IIC_Command);
static void Write_IIC_Data(unsigned char IIC_Data);
void OLED_WR_Byte(unsigned char dat,unsigned char cmd);
void OLED_Set_Pos(unsigned char x,unsigned char y);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Clear(void);
void OLED_ShouChar(unsigned char x,unsigned char y,unsigned char chr);
void OLED_Init(void);
void OLED_ShowString(unsigned char x, unsigned char y,unsigned char *chr);
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len ,unsigned char size);
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no);

#endif

delay.c

#include "delay.h"
#include "stm32f10x.h"

void initSysTick(void)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //ÉèÖÃʱÖÓÔ´8·ÖƵ
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;            //ʹÄÜÖжÏ
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;             //¿ª¶¨Ê±Æ÷
    SysTick->LOAD = 9;                                    //ËæÒâÉèÖÃÒ»¸öÖØ×°ÔØÖµ
}
/**
 * ¹¦ÄÜ£ºÎ¢Ã뼶ÑÓʱº¯Êý
 * ²ÎÊý£ºxus £º¾ßÌåÑÓʱʱ¼ä  (µ¥Î»£ºÎ¢Ãë)
 * ·µ»ØÖµ£ºNone
 */
void delay_us(u32 xus)
{
    SysTick->LOAD = 9 * xus;                               //¼Æ9´ÎΪ1us£¬xusÔòÖØ×°ÔØÖµÒª*9
    SysTick->VAL = 0;                                      //¼ÆÊýÆ÷¹éÁã
    while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //µÈ´ý¼ÆÊýÍê³É
}
/**
 * ¹¦ÄÜ£ººÁÃ뼶ÑÓʱº¯Êý
 * ²ÎÊý£ºxms £º¾ßÌåÑÓʱʱ¼ä  (µ¥Î»£ººÁÃë)
 * ·µ»ØÖµ£ºNone
 */
void delay_ms(u32 xms)
{
    SysTick->LOAD = 9000;                                      //¼Æ9´ÎΪ1us£¬1000´ÎΪ1ms
    SysTick->VAL = 0;                                          //¼ÆÊýÆ÷¹éÁã
    while (xms--)
    {
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //µÈ´ýµ¥´Î¼ÆÊýÍê³É
    }
}

delay.h

#include "stm32f10x.h"

void initSysTick(void);
void delay_us(u32 xus);
void delay_nms(u32 xms);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "Shake.h"
#include "Relay.h"
#include "delay.h"
#include "sys.h"
#include "DHT11.h"
#include "oled.h"
#include "DHT11.h"
int main(void)
{
		
 initSysTick();

		
		delay_ms(2000);



	OLED_Init();  //OLED³õʼ»d¯
	OLED_Clear();
	
	OLED_ShowString(2,1,"hello");
	
	delay_ms(2000);
	
	OLED_WR_Byte(0x81,OLED_CMD); 	// ¶Ô±È¶ÈÉèÖ㬿ÉÉèÖÃÁÁ¶È
	OLED_WR_Byte(0x66,OLED_CMD);	//  265 
  delay_ms(2000);	
	OLED_Clear();
	OLED_ShowString(2,1,"ok");
	
	delay_ms(2000);	
	OLED_WR_Byte(0xAE,OLED_CMD);
	OLED_Clear();
	OLED_ShowString(2,1,"ok");
	
	delay_ms(2000);	
	OLED_WR_Byte(0xAF,OLED_CMD);
	OLED_Clear();
	OLED_ShowString(2,1,"ok");
	
	delay_ms(2000);	
	OLED_WR_Byte(0x8D,OLED_CMD);
	OLED_WR_Byte(0x10,OLED_CMD);
	OLED_Clear();
	OLED_ShowString(2,1,"ok");
	
//  OLED_ShowCHinese(0,2,6); //µ±
//  OLED_ShowCHinese(16,2,7); //Ç°
//	OLED_ShowCHinese(32,2,8); //ÎÂ
//	OLED_ShowCHinese(48,2,9); //¶È
//	OLED_ShowCHinese(66,2,10); //£º
//	OLED_ShowCHinese(90,2,15); //.
//  OLED_ShowCHinese(112,2,11); //C
//	
//  OLED_ShowCHinese(16,5,6); //µ±
//  OLED_ShowCHinese(32,5,7); //Ç°
//	OLED_ShowCHinese(48,5,12); //ʪ
//	OLED_ShowCHinese(64,5,9); //¶È
//	OLED_ShowCHinese(80,5,10); //£º
//	OLED_ShowCHinese(112,5,13); //.


//	
//	while(1)
//	{

//    uint16_t i;
//		uint8_t k;
//		uint8_t kk;
//		uint8_t kkk;
//		DHT11_UpdateData();
//		
//		i =  Rxbuff[0]+ Rxbuff[1]+Rxbuff[2]+ Rxbuff[3];
//    if(Rxbuff[4] ==i)
//		{
//		  k=Rxbuff[2];
//			kk=Rxbuff[0];
//			kkk=Rxbuff[3];
//	  OLED_ShowNum(74,2,k/10,3,3);
//		OLED_ShowNum(82,2,k%10,3,3);
//	  OLED_ShowNum(98,2,kkk,3,3);
//		OLED_ShowNum(88,5,kk/10,3,3);
//	  OLED_ShowNum(98,55,kkk%10,3,3);

//		}
//		delay_ms(2000);
//	}
}

DHT11.h

#ifndef _DHT11_H
#define _DHT11_H

#include "stm32f10x.h"

#define data1  GPIO_SetBits(GPIOB,  GPIO_Pin_11)
#define data0  GPIO_ResetBits(GPIOB,  GPIO_Pin_11)

#define read_data  GPIO_ReadInputDataBit(GPIOB,  GPIO_Pin_11)

void DHT11_GPIO_Init(void);
void DHT11_GPIO_Init1(void);
void DHT11_Start(void);
void DHT11_ReceptionBuff();
void DHT11_UpdateData();

extern uint16_t Rxbuff[5];

#endif

DHT11.c

#include "stm32f10x.h"
#include "DHT11.h"
#include "delay.h"
#include "stdio.h"


uint16_t Rxbuff[5];

void DHT11_GPIO_Init(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
	
	 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,  GPIO_Pin_11);

}

void DHT11_GPIO_Init1(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
	
	 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,  GPIO_Pin_11);

}

static uint8_t DHT11_Back()
{
   uint8_t i =200;
	
	 while(read_data && i--); //µÈ´ýµÍµçƽµÄµ½À´
	 i= 200;
	 while(!read_data && i--); //µÈ´ý¸ßµçƽµÄµ½À´
   return 0;
}

void DHT11_Start(void)
{
     data0;
	   delay_ms(20);
	
     data1;
	   delay_us(10);
     DHT11_GPIO_Init1();
     while(DHT11_Back());
}

void DHT11_ReceptionBuff()
{
   uint8_t y=1;
	 uint16_t i;
	 uint8_t x;
 
   for(x=0;x<5;x++)
	{
	    i=0;
		  for(y=1;y<9;y++)
		{
		   while(read_data)
			 {
			    __nop();
			 
			 }
			 delay_us(40);
			  while(!read_data)
			 {
			    __nop();
			 
			 }
		    i= i<<1;
			 delay_us(30);
       if(read_data)
			 {
			    i |=1;
			 
			 }
			 while(read_data);
		
		
		}
	
	   Rxbuff[x] =i;
	}

}

void DHT11_UpdateData()
{
  DHT11_GPIO_Init();
	DHT11_Start();
	DHT11_ReceptionBuff();


}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小阿大:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值