⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.h

📁 通过温度传感器DS18B20和湿度传感器HS1101分别采集温度和湿度
💻 H
字号:
//*******************************************
//*函数名称:void Parallel_Check_Busy(void)	*
//*函数功能:并行方式查忙					*
//*形式参数:无								*
//*形参说明:无								*
//*返回参数:无								*
//*使用说明:无								*
//*******************************************
void Parallel_Check_Busy(void)
{
	bit temp;
  	P1 = 0xff;	//输入前置1
  	RS = 0;		//指令
  	RW = 1;		//读模式
	do
	{	
	    E  = 1;	 //使能
		temp = BUSY;
  	    E  = 0;
	}
  	while(temp);//等待不忙
}


//************************************************************************************
//*函数名称:void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content ) *
//*函数功能:并行模式向LCD发送数据或指令												 *
//*形式参数:bit b_Data_Command , unsigned char uc_Content							 *
//*形参说明:数据或指令的标志位,指令或数据的内容										 *
//*返回参数:无																		 *
//*使用说明:无																		 *
//************************************************************************************
void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content )
{
 	Parallel_Check_Busy();
  	if(b_Data_Command)
   	 {
		RS = 1;   //数据
    	RW = 0;   //写模式
   	 }
  	else 
   	 {
    	RS = 0;   //指令
    	RW = 0;   //写模式
   	 }
  	P1=uc_Content;//数据放到P1口上
  	E = 1;
  	_nop_();//很重要 
	_nop_();
   	_nop_();
    E = 0;														
}




//*************************************************************
//*函数名称:void Parallel_DDRAM_Address_Set(uchar ucDDramAdd) *
//*函数功能:设定DDRAM(文本区)地址到地址计数器AC				  *
//*形式参数:uchar ucDDramAdd								  *
//*行参说明:具体地址										  *
//*格式说明:												  *
//*		RS	RW	DB7	DB6	DB5	DB4	DB3	DB2	DB1	DB0				  *
//*		0	0	1	AC6	AC5	AC4	AC3	AC2	AC1	AC0				  *
//*返回参数:无												  *
//*使用说明:												  *
//*	第一行地址:80H~8FH										  *
//*	第二行地址:90H~9FH										  *
//*	第三行地址:A0H~AFH										  *
//*	第四行地址:B0H~BFH										  *
//*************************************************************
void Parallel_DDRAM_Address_Set(uchar ucDDramAdd)
{
	Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);			//基本指令集
	Parallel_Write_LCD(COMMAND,ucDDramAdd);				//设定DDRAM地址到地址计数器AC
}




//*******************************************
//*函数名称:void Parallel_Init_LCD(void)	*
//*函数功能:并行初始化LCD					*
//*形式参数:无								*
//*形参说明:无								*
//*返回参数:无								*
//*使用说明:无								*
//*******************************************
void Parallel_Init_LCD(void)
{
  	RST = 1;									//复位后拉高,停止复位
//  	PSB = 1;									//选择并行传输模式		
  	Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令动作   
  	Parallel_Write_LCD(COMMAND,CLEAR_SCREEN);  	//清屏,地址指针指向00H
  	Parallel_Write_LCD(COMMAND,0x06);  		    //光标的移动方向
  	Parallel_Write_LCD(COMMAND,0x0c);  			//开显示,关游标

}



//********************************************************
//*函数名称:void Parallel_Clear_Ram(void)	             *
//*函数功能:并行清屏函数					             *
//*形式参数:无								             *
//*形参说明:无							     	         *
//*返回参数:无								             *
//*使用说明:DDRAM填满20H,并设定DDRAM AC到00H	         *
//*格式说明:											 *
//*		    RS	RW	DB7	 DB6  DB5  DB4	DB3	DB2	DB1	DB0	 *
//*		    0	0	 0	  0	   0	0	 0   0	 0	 1	 *
//********************************************************
void Parallel_Clear_Ram(void)
{
	Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);			//基本指令集
	Parallel_Write_LCD(COMMAND,CLEAR_SCREEN);			//清屏
}






void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p,uchar num1,uchar num2)
{

	Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);  //基本指令动作   
	Parallel_DDRAM_Address_Set(ucAdd);
	
	Parallel_Write_LCD(DATA, *(p+num1/10));	
	Parallel_Write_LCD(DATA, *(p+num1%10));
	Parallel_Write_LCD(DATA, *(p+15));
    Parallel_Write_LCD(DATA, *(p+num2%10));
	Parallel_Write_LCD(DATA, *(p+14));
	Parallel_Write_LCD(DATA, *(p+16));

}


void Parallel_DisplayStrings_WithAddress_shidu(uchar ucAdd,uchar code *p,uchar num1)
{

	Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);  //基本指令动作   
	Parallel_DDRAM_Address_Set(ucAdd);
	
	Parallel_Write_LCD(DATA, *(p+num1/10));	
	Parallel_Write_LCD(DATA, *(p+num1%10));
	Parallel_Write_LCD(DATA, *(p+17));
	Parallel_Write_LCD(DATA, *(p+18));
    Parallel_Write_LCD(DATA, *(p+19));
}

void Parallel_DisplayStrings_WithAddress_hanzi(uchar ucAdd,uchar code *p)
{
	uchar length;
	length = strlen(p);
    Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);  			//基本指令动作   
	Parallel_DDRAM_Address_Set(ucAdd);
	for( ;  length ; length -- )
	Parallel_Write_LCD(DATA, *(p++));					
}

/* 延时t毫秒 */
void delay(uint t)
{
	uint i;														                                                                                                                                                                                        
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}


/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
	uint i;
	DQ = 0;

	/* 拉低约900us */
	i = 100;
	while (i>0)	i--;	
	
	DQ = 1;				// 产生上升沿
	i = 4;
	while (i>0)	i--;
}


/* 等待应答脉冲 */
void RxWait(void)
{
	uint i;
	while(DQ);
	while(~DQ);			// 检测到应答脉冲 
	i = 4;
	while (i>0)	i--;
}

/* 读取数据的一位,满足读时隙要求 */ 
bit RdBit(void)
{
	uint i;
	bit b;
	DQ = 0;
	i++;
	DQ = 1;
	i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
	b = DQ;
	i = 8;
	while(i>0) i--;
	return (b);
}


/* 读取数据的一个字节 */
uchar RdByte(void)
{
	uchar i,j,b;
	b = 0;
	for (i=1;i<=8;i++)
	{
		j = RdBit();
		b = (j<<7)|(b>>1);
	}
	return(b);
}

/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
	uint i;
	uchar j;
	bit btmp;
	for(j=1;j<=8;j++)
	{
		btmp = b&0x01;
		b = b>>1;		// 取下一位(由低位向高位)
		if (btmp)
		{
			/* 写1 */
			DQ = 0;
			i++;i++;	// 延时,使得15us以内拉高
			DQ = 1;
			i = 8;
			while(i>0) i--;	// 整个写1时隙不低于60us 
	   	}
		else
		{
			/* 写0 */
			DQ = 0;			
			i = 8;
			while(i>0) i--;	// 保持低在60us到120us之间
			DQ = 1;
			i++;
			i++;
		}
	}
}



/* 启动温度转换 */
void convert(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0x44);		// convert T 命令
}


/* 读取温度值 */
void RdTemp(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20 
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0xbe);		// read scratchpad 命令
	tplsb = RdByte();	// 温度值低位字节(其中低4位为二进制的“小数”部分)
	tpmsb = RdByte();	// 温度值高位字节(其中高5位为符号位)		
}




void Clock0_Init()
{	
    TMOD = 0x15;
   	TCON = 0x01;
	IE = 0x8a;
    
	TR0=0;
	TF0=0;
	TH0=0xd8;
    TL0=0xf0;
	TR0=1;
}

/*频率计测量函数集*/

void GetFrequency()
{
    BYTE th0,tl0;
    if(++times==25)
    {
        times = 0;
        TR0 = 0;
        _nop_();
        do{
             th0 = TH0;
             tl0 = TL0;
           }while(th0!=TH0);

         frequency = (th0*256+tl0)-55536;
 	     TR0=1;
	     Clock0_Init(); 
     }

}

/*频率转换相对湿度函数集*/			 
 FrequencyToHumidity()   //根据实际频率,需要修改公式
{
    float fre;
	fre =((float)frequency) /100.0 ;
	RH = (BYTE)((28000.0 / fre)	- 456.0);
	return(RH);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -