DHT11+LCD12864

基于STC12C5A60S2单片机的DHT11+LCD12864代码

  1. DHT11.h
  2. DHT11.c
  3. LCD12864.h
  4. LCD12864.c
#ifndef __DHT11_H
#define __DHT11_H

#include <STC12C5A60S2.H>
#include <intrins.h>


#ifndef __UDEFINE_
#define __UDEFINE_
#define uchar unsigned char
#define uint unsigned int
#endif /*__UDEFINE_*/



/*DHT11*/
sbit WS_data = P1^0;


/*DHT11函数声明*/
void delay1s(void);
uchar WS_Start(void);
uchar WS_Read(void);
void get_temandhum(uchar* tem,uchar* hum);

#endif /*__DHT11_H*/
#include "NHT11.h"
#include "LCD12864.h"
/*******************************************DHT11***************************************************/

uchar WS_Start()
{
	unsigned char a,b,c;
	uint flag = 255;
	WS_data = 0;
    for(c=193;c>0;c--)
        for(b=114;b>0;b--)
            for(a=1;a>0;a--);
	WS_data = 1;
	while(WS_data == 1 && flag > 10)
	{
		flag--;
	}		//等待DHT11的低电平
	if(WS_data == 0)
	{
		flag = 1;
    	for(b=1;b>0;b--)
        	for(a=218;a>0;a--);
	}
	else
	{
		flag = 0;
	}
	return flag;
}

uchar WS_Read()
{
	uchar a,b;
	uchar num = 0x00;
	uchar i,temp;
	for(i = 0; i < 8;i++)
	{
		b= 255;
		while(WS_data == 1 && b > 0)
		{
			b--;	
		}  	//一个while()两用 //读第一个数据,判断80us的高电平 读以后的数据判断高电平是否读完
		b= 255;
		while(WS_data == 0 && b > 0)
		{
			b--;
		}	//50us
		for(a=109;a>0;a--);     //40us
		temp = WS_data;
		num = (num << 1)|temp;	
	}
	return num;
}

void get_temandhum(uchar* tem,uchar* hum)
{
	uchar ERR[] = "ReaERR";
	uchar RIT[] = "ReaCOR";
	uchar LTEM,HTEM,LHUM,HHUM,Check;
	Check = WS_Start();
	if(Check == 1)
	{
		HHUM = WS_Read();
		LHUM = WS_Read();
		HTEM = WS_Read();
		LTEM = WS_Read();
		Check = WS_Read();

		if(Check == HHUM + LHUM + HTEM +LTEM)
		{
			*tem = HTEM;
			*hum = HHUM;
			LCD_Pos(1,0);
			for(Check = 0; Check < 6;Check++)
			{
				LCD_WriteDat(RIT[Check]);	
			}
		}
		else
		{
			LCD_Pos(1,0);
			for(Check = 0; Check < 6;Check++)
			{
				LCD_WriteDat(ERR[Check]);	
			}		
		}		
	}
	else
	{
		
	}
}
//延时1s函数与LCD的冲突,单独用须要添加
/***************************************************************************************************/
#ifndef __LCD12864_H
#define __LCD12864_H

#include <STC12C5A60S2.H>
#include <intrins.h>


#ifndef __UDEFINE_
#define __UDEFINE_
#define uchar unsigned char
#define uint unsigned int
#endif /*__UDEFINE_*/




/*LCD12864*/
#define LCD_data P0
sbit EN = P3^4;
sbit RS = P3^5;
sbit RW = P3^6;
sbit PSB = P3^7;


/*LCD12864函数声明*/
void delay1ms(void);
void delay1s(void);
void LCD_Init(void);
void LCD_WriteCmd(uchar cmd);
void LCD_WriteDat(uchar dat);
void LCD_Pos(uchar x,uchar y);
void LCD_Test(void);


#endif /*__LCD12864_H*/
#include "LCD12864.h"





/*******************************************LCD12864************************************************/
void LCD_Test()
{
	uchar i,j;
	uchar TestStr[] = " 测试 ";
	LCD_Init();
	LCD_Pos(1,0);
	while(1)
	{
	LCD_WriteCmd(0x0c);
		for(i = 0;i < 20;i+=2)
		{
			LCD_Pos(1,0);
			for(j = i;j< 16+i;j++)
				LCD_WriteDat(TestStr[j]);
			delay1s();
		}
	}
}


void LCD_Pos(uchar x,uchar y)
{
	uchar pos;
	if(1 == x)
	{
		x = 0x80;
	}
	else if(2 == x)
	{
		x = 0x90;
	}
	else if(3 == x)
	{
		x = 0x88;
	}
	else if(4 == x)
	{
		x = 0x98;
	}
	pos = x+y;
	LCD_WriteCmd(pos);		
}


void LCD_Init()
{
	PSB = 1;
	/*清除显示*/  //将DDRAM填满"20H",而且设定DDRAM的地址计数器(AC)到"00H"
	LCD_WriteCmd(0x01);
	delay1ms();
	/*设置功能*/	// 4/8数据 AND 是否打开拓展功能
	LCD_WriteCmd(0x30);
	delay1ms();
	/*显示状态开关*/	//不知道干啥的
	LCD_WriteCmd(0x0C);
	delay1ms();	
}


void delay1s(void)   //偏差 -0.000000000099us
{
    unsigned char a,b,c;
    for(c=217;c>0;c--)
        for(b=171;b>0;b--)
            for(a=73;a>0;a--);
}

void delay1ms(void)   //偏差 -0.018084490741us
{
    unsigned char a,b;
    for(b=21;b>0;b--)
        for(a=130;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}

void LCD_WriteCmd(uchar cmd)
{
	RW = 0;
	RS = 0;
	EN = 0;
	delay1ms();
	LCD_data = cmd;
	delay1ms();
	EN = 1;
	delay1ms();
	EN = 0;
}


void LCD_WriteDat(uchar dat)
{
	RW = 0;
	RS = 1;
	EN = 0;
	delay1ms();
	LCD_data = dat;
	delay1ms();
	EN = 1;
	delay1ms();
	EN = 0;
}
/***************************************************************************************************/