stc12c5a60s DHT11温湿度传感器

DHT11温湿度传感器

DHT11.h

#ifndef __DHT11_H__
#define __DHT11_H__

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif
#include <reg52.h>
#include <intrins.h>

//IO口定义
sbit OUT = P2^7;

//函数声明
void RH( uchar *s );
void Delay(uint x);

//声明外部函数
extern void Uart_send_str(char *str, int len);
extern void Uart1Init();
//extern void Uart_send(char str);


#endif

DHT11.c

/******************************************************************/
/*		平台:Keil U4 + DHT11温湿度模块							  */
/*		名称:通过串口显示温湿度								  */
/*		编写:WCT												  */
/*		日期:2019年1月22日16:57:18								  */
/*		QQ:  497950600  										  */
/*		晶振:11.0592MHZ										  */
/*		变更记录:无											  */
/******************************************************************/
#include "DHT11.h"

/**************/
/*   定义区   */
/**************/
uchar U8FLAG;
uchar U8count, U8temp;
uchar U8T_data_H_temp, U8T_data_L_temp, U8RH_data_H_temp, U8RH_data_L_temp, U8checkdata_temp;
uchar U8comdata;
uchar count = 0, count_r = 0; 
uint U16temp1, U16temp2;

void Delay(uint x)
{  //x = 1, 约 20us
	uchar i;
	for( ; x > 0; x --)
	{
		for(i = 0;i < 29; i ++);
	}
}

void Delay_10us()
{
   uchar i;
   i = 25;
   while( -- i );
}

//void Delay(unsigned int x)		//@11.0592MHz 延时1ms
//{
//	while(x--)
//	{
//		unsigned char i, j;
//		_nop_();
//		i = 11;
//		j = 190;
//		do
//		{
//			while (--j);
//		} while (--i);
//	}
//}
//void Delay_10us()		//@11.0592MHz
//{
//	unsigned char i;
//
//	_nop_();
//	_nop_();
//	_nop_();
//	i = 24;
//	while (--i);
//}

/****************************/
/*		字节读取函数        */
/* 湿度数据和温度数据的读取 */
/****************************/
void COM()
{
	uchar i;
	for(i = 0; i < 8; i ++)
	{
		U8FLAG = 2;
		while((!OUT) && U8FLAG ++ ); //等待数据出现
		Delay_10us();
		Delay_10us();
		Delay_10us();
		U8temp = 0;
		//判断数据位是0还是1
		//如果高电平高过预定0高电平则数据位为1
		if( OUT ) //高电平持续大于28us
		{
			U8temp = 1;
		}
		U8FLAG = 2;
		while( ( OUT ) && U8FLAG ++);
		//超时则跳出for循环
		if( U8FLAG == 1)
		{
			break;
		}
		U8comdata <<= 1;
		U8comdata |= U8temp;
	}
}

/***************************************/
/*		温湿度读取子程序			   */
/***************************************/
void RH( uchar *s )
{
	//主机拉低至少18ms
	OUT = 0;
	Delay(900);
	//主机发送完开始信号,拉高20-40us
	OUT = 1;
	Delay(2);
	
	//主机设为输入 判断从机响应信号
	OUT = 1;
	//判断从机是否有低电平响应信号
	if( ! OUT )
	{
		U8FLAG = 2;
		//判断从机发出 80us 的低电平信号是否结束
		while( ( !OUT ) && U8FLAG ++ );
		U8FLAG = 2;
		//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
		while( OUT && U8FLAG ++ );
		//数据接收状态
		COM();
		U8RH_data_H_temp = U8comdata;
		COM();
		U8RH_data_L_temp = U8comdata;
		COM();
		U8T_data_H_temp = U8comdata;
		COM();
		U8T_data_L_temp = U8comdata;
		COM();
		U8checkdata_temp = U8comdata;
		OUT = 1;

		//数据校验
		U8temp =( U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp + U8RH_data_L_temp );
		if( U8temp == U8checkdata_temp )
		{
			 s[0] = U8RH_data_H_temp; //---湿度高8位--整数部分
			 s[1] = U8RH_data_L_temp; //---湿度低8位--小数部分
			 s[2] = U8T_data_H_temp;  //---温度高8位--整数部分
			 s[3] = U8T_data_L_temp;  //---温度低8位--小数部分
			 s[4] = U8checkdata_temp; //---校验字节
		}
	}	
}

uart.c

/**********************************************/
/*			平台:Keil U4 + STC12C5A60S       */
/*			名称:串口通信					  */
/*			编写:WCT						  */
/*			日期:2019年1月21日18:43:49		  */
/*			QQ: 497950600					  */
/*			晶振:11.0592MHZ				  */
/*			变更记录: 无					  */
/**********************************************/

#include <reg52.h>

#define F_f 11059200UL   //晶振频率11.0692MHZ
#define Baud_rate 9600UL //波特率9600

sfr AUXR = 0x8E; //定义特殊功能寄存器AUXR
sfr BRT = 0x9C;	 //定义独立波特率发生寄存器BRT

void Uart_send_str(unsigned char *str, int len)
{
	int i;
	for(i = 0; i < len; i ++ )
	{
		SBUF = str[i];
		while( !TI ); //等待发送完成
		TI = 0; 	  //清除发送中断请求
	}
}

//void Uart_send(char str)
//{
//	SBUF = str;
//	while( !TI ); //等待发送完成
//	TI = 0; 	  //清除发送中断请求
//}

void Uart1Init()
{
	PCON &= 0x7F; // 波特率不加倍
	SCON = 0x50;  // 设置串行通信工作方式1,并允许串行接受
	AUXR &= 0xFB; // 独立波特率发生器时钟12T
	BRT = 256 - F_f / (12 * Baud_rate * 32); //独立波特率发生器装载初值
	AUXR |= 0x11; // 允许独立波特率发生器作为串口波特率发生器,并开启
	EA = 1;	      // 开启总中断
	ES = 1;		  // 开启串行中断
}

//UART中断处理函数
void Uart1Routine() interrupt 4
{
	unsigned char uart_sbuf;
	if(RI) //接受完成RI = 1;
	{
		uart_sbuf = SBUF;
		if(uart_sbuf == 0xaa )
		{
			Uart_send_str("ok", 2);
		}
		RI = 0;	 //清除接受中断请求
	}
}

LED_show.c

/*************************************************/
/*		平台:Keil U4 + STC12C5A60S2			 */
/*		名称:LED显示数据 + 串口显示			 */
/*		编写:WCT								 */
/*		日期:2019年1月23日13:39:14		         */
/*		QQ:  497950600						     */
/*		晶振:11.0592							 */
/*		变更记录:无							 */
/*************************************************/
#include <reg52.h>
#include <stdio.h>
#include "DHT11.h"

sfr AUXR = 0x8e;

//定义位选
sbit ASEG = P1^2;
sbit BSEG = P1^3;
sbit CSEG = P1^4;
sbit DSEG = P1^5;

uchar code smgduan[]=	 //共阴数码管显示0~F的值
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar showdata[4] = { 0 }; //用于显示数据
uchar outdata[6] = { "RS232" }; //定义发送字节数
uchar out[30] = { 0 };

void seg4show( uchar i )
{
	switch( i )
	{
		case 0:
			ASEG = 0; BSEG = 1; CSEG = 1; DSEG = 1; break;
		case 1:
			ASEG = 1; BSEG = 0; CSEG = 1; DSEG = 1; break;
		case 2:
			ASEG = 1; BSEG = 1; CSEG = 0; DSEG = 1; break;
		case 3:
			ASEG = 1; BSEG = 1; CSEG = 1; DSEG = 0; break;
		default:
			ASEG = 1; BSEG = 1; CSEG = 1; DSEG = 1; break;
	}
	P0 = showdata[i];
//	Delay(10);
//		
}

void dataProcess()
{
	showdata[0] = smgduan[ outdata[0] / 10 ];
	showdata[1] = smgduan[ outdata[0] % 10 ];
	showdata[2] = smgduan[ outdata[2] / 10 ];
	showdata[3] = smgduan[ outdata[2] % 10 ];	
}

void timer0_init()
{
	AUXR &= 0x7f; //12T
	TMOD |= 0x02; //方式2 8位自动重装载
	TH0 = 0x48; //200us
	TL0 = 0x48;
	EA = 1; //开启总中断允许
	ET0 = 1; //开启定时器中断允许
	TF0 = 0; //消除TF0标志
	TR0 = 1; //开启定时
}

void main()
{
	Uart1Init();
	timer0_init();
//	Uart_send_str(outdata);
//	Uart_send_str("\n"2);
	Delay(5000); //延时1S
	
	while(1)
	{
		RH(outdata); //调用温湿度读取函数
		dataProcess(); //数据处理
		sprintf(out, "湿度:%d%%, 温度:%d℃\n", (int)(outdata[0]), (int)(outdata[2]));
//		Uart_send_str(out);//调用串口发送函数
		//读取模块数据周期不小于 2S
		Delay(50000);
		Delay(50000);
	}	
}

void timer0_Routine() interrupt 1
{
	static uchar i;
	seg4show( i / 5 );
	i ++;
	if( i % 10 == 0 ) 
	{
		P0 = 0x00;
	}
	i = i % 20;
	
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: stc12c5a60s2是一款单片机芯片,DHT11是一款数字温湿度传感器,LCD1602是一款16x2字符液晶显示屏。这三个元件可以组成一个温湿度监测系统,通过单片机采集DHT11传感器的数据,并将数据显示在LCD1602屏幕上。 ### 回答2: stc12c5a60s2、dht11、lcd1602都是电子元件。其中,stc12c5a60s2是一款高性能单片机,具有强大的计算能力和丰富的外设功能,可以广泛应用于各种电子产品中。dht11是一款数字湿度温度传感器,可以测量环境湿度和温度,并将测量结果以数字信号的形式输出,广泛应用于温湿度计、空调等领域。lcd1602是一款液晶显示屏,具有16列2行的显示区域,可以显示各种符号和数字,广泛应用于计算机、数码相机等设备中。 这三个元件可以组合起来,形成一个完整的电子系统,例如,可以使用stc12c5a60s2作为控制器,dht11作为温湿度传感器,检测环境温湿度并将数据传回控制器,然后将数据显示在lcd1602液晶屏上,用于实时监测环境温湿度,这种系统可以用于温湿度控制的领域,例如空调控制、恒温恒湿机组等。 除了上述应用外,stc12c5a60s2、dht11和lcd1602还可以组成其他系统,例如,可以将dht11作为热敏电阻使用,检测液体温度,并将数据传回控制器进行分析,然后将结果显示在lcd1602屏幕上,用于实时监测液体温度,这种系统可以用于医疗设备、实验室仪器等领域。 总之,stc12c5a60s2、dht11、lcd1602这三个电子元件有着丰富的应用场景,可以广泛应用于电子产品的开发中,只要你有足够的创意和技术能力,你可以将它们组合起来创造出无数的电子系统。 ### 回答3: STC12C5A60S2、DHT11和LCD1602都是电子产品中的元器件。STC12C5A60S2是一款单片机芯片,它由STC公司生产,具有高性能、低功耗和可编程特点,广泛应用于各种电子设备中。DHT11是一款数字温湿度传感器,由AM2302公司生产,能够实时监测环境温度和湿度的变化,并将数据以数字信号的形式输出。LCD1602是一款液晶显示器,由多种厂家生产,可通过扩展板与单片机连接,实现数据的显示功能。 通过组合STC12C5A60S2、DHT11和LCD1602,可以实现很多有用的应用程序。例如,可以使用STC12C5A60S2作为主控芯片,通过DHT11采集环境温湿度数据,并将数据显示在LCD1602屏幕上,以便用户随时了解环境变化情况。此外,还可以利用STC12C5A60S2的高性能和可编程特点,编写各种控制程序,来实现更为复杂和高级的功能。 总之,STC12C5A60S2、DHT11和LCD1602都是非常有用和实用的元器件,它们的组合和应用能够极大地拓展电子产品的功能和应用范围,为用户提供更多选择和更好的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Hello Spring

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

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

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

打赏作者

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

抵扣说明:

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

余额充值