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

📄 sht71.c

📁 温湿度传感器SHT71与单片机连接的源码
💻 C
字号:

//头文件
#include <reg52.h>
#include <intrins.h>

//测量命令
#define  TEMPERATURE	0x03
#define  HUMINITY		0x05
//定义SHT71与单片机的通信引脚
sbit SCL = P3^1;		//时钟线
sbit SDA = P3^2;		//数据线

//函数预定义
unsigned char MCU_receive_byte(void);
void Sent_command(unsigned char command);
void MCU_receive_word(void);
void SHT_ACK();
void SHT_end(void);
void SHT_ini(void);
void SHT_reset(void);
void SHT_start();
void SHT_measurement(unsigned char measure);
void UART_ini(void);
void USART_RX_interrupt(void);
void UART_Send_Byte(unsigned char Data);
void Delay(unsigned char time);

//
//------------------------------
//
//		主函数
//		
//------------------------------
//	
void main(void)
{    
	 EA = 0;
	 UART_ini();
	 SHT_ini();
	 EA = 1;
	 for(;;)
	 {	
		Delay(10);						//延时0.75S
		SHT_measurement(TEMPERATURE);	//温度测量
		MCU_receive_word();	
		Delay(10);
		SHT_measurement(HUMINITY);		//湿度测量
		MCU_receive_word();	
	 }
}
//
//------------------------------
//
//		SHT71初始化
//		
//------------------------------
//	
void SHT_ini(void)
{	 
	SHT_reset();						//SHT71软复位
	Delay(1);
}
//
//------------------------------
//
//		SHT71 复位
//		
//------------------------------
//	
void SHT_reset(void)
{
	unsigned char i;
		
	SDA = 1;
	SCL = 0;
	
	for (i=0;i<20 ;i++ )				//至少9个Clock
	{
		SCL = 1;
		_nop_();
		SCL = 0;
	}

}
//
//------------------------------
//
//		SHT71 启动一次测量
//		
//------------------------------
//	
void SHT_measurement(unsigned char measure)
{
	 SHT_start();						//启动
	 Sent_command(measure);				//发送命令
	 SHT_ACK();							//等待转换结束
	 MCU_receive_word();				//接收测量结果
	 SHT_end();							//结束一次测量
}
//
//------------------------------
//
//		SHT71启动信号
//
//------------------------------
//
void SHT_start()
{	 
	 SCL = 0;
	 SDA = 1;
   	 _nop_();
	 _nop_();
	 SCL = 1;
	 _nop_();
	 _nop_();
	 SDA = 0;
	 _nop_();
	 _nop_();
	 SCL = 0;
	 _nop_();
	 _nop_();
	 SCL = 1;
	 _nop_();
	 _nop_();
	 SDA = 1;
	 _nop_();
	 _nop_();
	 SCL = 0;
}
//
//------------------------------
//
//		SHT71 控制命令发送
//		command =	0x03---温度
//					0x05---湿度
//
//------------------------------
//	
void Sent_command(unsigned char command)
{
	unsigned char model = 0x80;
	unsigned char i;   
	
	for(i=0;i<7;i++)           
	{
		SCL = 0;
		if((command & model) == 0)
		{
			SDA = 0;
		}
		else
		{
			SDA = 1;
		}	
		SCL = 1;
		model = model>>1;	  
	} 
	
	SCL = 0;
	
	if((command & model) == 0)
	{
		SDA = 0;
	}
	else
	{
		SDA = 1;
	}
	
	SCL = 1; 
	_nop_();
	SCL = 0;		 
	
	while(SDA == 1)
	{
	}
	
	SCL = 1;
	_nop_();
	SCL = 0;
	_nop_();	
}	
//
//------------------------------
//
//		SHT71 等待应答信号
//
//------------------------------
//	
void SHT_ACK()
{	
	while(SDA == 1)
	{
	}
}
//
//------------------------------
//
//		SHT71 接收一个字节
//		
//------------------------------
//	
unsigned char MCU_receive_byte(void)
{	 
	unsigned char i;
	unsigned char model = 0x00;
	unsigned char temp;
	      
	SCL = 0;
	_nop_();
	for(i=0;i<8;i++)
	{
		SCL = 1;
		if(SDA == 0)
		{
			temp = 0;
		}
		else
		{
			temp = 1;
		}
		
		model = model|(temp<<(7-i));
		SCL = 0;
	 }

	 SDA = 0;    //
	 _nop_();
	 SCL = 1; 
	 _nop_();
	 SCL = 0; 
	 return model;
}
//
//------------------------------
//
//		SHT71 结束一次测量
//		
//------------------------------
//	
void SHT_end(void)
{
 	 SCL = 0;
	 SDA = 1;
}
//
//------------------------------
//
//		SHT71 接收结果
//		
//------------------------------
//	
void MCU_receive_word(void)
{ 
      unsigned char temp;
	  temp = MCU_receive_byte();		//将测量结果通过串口发送
	  UART_Send_Byte(temp);				
	  temp = MCU_receive_byte();
	  UART_Send_Byte(temp);
}


//-----------------------------
//
//		软件延时(非精确)
//
//-----------------------------
void Delay(unsigned char time)
{
	unsigned char i;
	unsigned int j;
	
	for (i = 0;i < time;i++)
	{
		for (j=0;j<30000;j++)
		{
		}
	}
}
//---------------------------------
//	
//	单片机晶振 22.1184MHZ
//	串行口初始化设置
//	方式1,8数据位,一个停止位,无奇偶校验
//	串口中断允许,波特率9600bps
//		
//------------------------------------
void UART_ini(void)
{
	SCON = 0x50;		//方式1,波特率可变,8bits,接受允许 
	PCON&= 0x7F;		//SMOD = 0                           
	TMOD |= 0x20;		//timer1 mode 2                      
	
	TL1 = 0xfa;			//|					f               
						//|	波特率=----------------------    
	TH1 = 0xfa;			//|			32*2^smod*12*(256-TL1)   
	TCON |= 0x40;		//start                              
	                                                                                                                
	TI = 0;	                                             
}
//---------------------------------------------------------------
//
//		串口发送单字节程序
//
//----------------------------------------------------------------
void UART_Send_Byte(unsigned char Data)
{				
	SBUF = Data;	
	while (TI == 0)					//等待发送完毕
	{
	}
	TI = 0;	
}
//---------------------------------------------------------------
//
//		串口中断服务程序
//
//		----只有接收使用			
//
//----------------------------------------------------------------
void RX_INT(void) interrupt 4 using 3
{
	if (RI==1)
	{
		do 
		{
			RI = 0;
		}
		while (RI != 0); 

		//未指定
	}
	else
	{ 
	}
}

⌨️ 快捷键说明

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