首页 > 其他分享 >基于51单片机的窗帘控制系统【温湿度,烟雾,红外,光照】(仿真)

基于51单片机的窗帘控制系统【温湿度,烟雾,红外,光照】(仿真)

时间:2024-06-15 19:33:21浏览次数:11  
标签:51 temp ds18b20 uchar 温湿度 总线 bi 单片机 --

基于51单片机的窗帘控制系统【温湿度,烟雾,红外,光照】(仿真)

给大家提供一些资料详细解释,有需要的自行提取,网盘地址我放在下面

 链接:https://pan.baidu.com/s/1NigBeujDZTCFL0hdMiu7yg?pwd=syxp 
提取码:syxp 

分别利用温湿度传感器、烟雾传感器、光敏电阻、红外检测控制模块等

将检测温湿度、烟雾浓度、光照强度以及是否有人通过,各种传感器将环境信息传输到单片机

单片机控制步进电机开窗或关窗

烟雾、温度、湿度高于设定值,开窗

否则:如果光照过高或者检测到有人,关窗

#include"Ds18b20.h"
float ds18b20_temp1=0,ds18b20_temp2=0;
/*******************************************************************************
* 函 数 名         : Delay1ms
* 函数功能		   : 延时函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Delay1ms(uint y)
{
	uint x;
	for( ; y>0; y--)
	{
		for(x=110; x>0; x--);
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能		   : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/

uchar Ds18b20Init()
{
	uchar i;
	DSPORT = 0;			 //将总线拉低480us~960us
	i = 100;	
	while(i--);//延时642us
	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i = 0;
	while(DSPORT)	//等待DS18B20拉低总线
	{
		Delay1ms(1);
		i++;
		if(i>5)//等待>5MS
		{
			return 0;//初始化失败
		}
	
	}
	return 1;//初始化成功
}

/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能		   : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20WriteByte(uchar dat)
{
	uint i, j;

	for(j=0; j<8; j++)
	{
		DSPORT = 0;	     	  //每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us
		DSPORT = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat >>= 1;
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能		   : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


uchar Ds18b20ReadByte()
{
	uchar byte, bi;
	uint i, j;	
	for(j=8; j>0; j--)
	{
		DSPORT = 0;//先将总线拉低1us
		i++;
		DSPORT = 1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi = DSPORT;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte = (byte >> 1) | (bi << 7);						  
		i = 4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}
/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能		   : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ChangTemp()
{
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
	Ds18b20WriteByte(0x44);	    //温度转换命令
	//Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能		   : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ReadTempCom()
{	

	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能		   : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20ReadTemp()
{
	uchar temp = 0;
	uchar tmh, tml;
	Ds18b20ChangTemp();			 	//先写入转换命令
	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
	tmh = Ds18b20ReadByte();		//再读高字节
	temp = tmh;
	temp <<= 4;
	temp += (tml>>4);
	if(temp>127)
	{	
		temp--;
		temp=~temp;
		temp=temp & 0x7f;
		ds18b20_temp1=temp;
		ds18b20_temp1=-ds18b20_temp1;
	}
	else
		ds18b20_temp1=temp;
	ds18b20_temp1=ds18b20_temp1+(tml & 0x0f)*9/15;
}



/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能		   : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/

uchar Ds18b20Init2()
{
	uchar i;
	DSPORT2 = 0;			 //将总线拉低480us~960us
	i = 100;	
	while(i--);//延时642us
	DSPORT2 = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i = 0;
	while(DSPORT2)	//等待DS18B20拉低总线
	{
		Delay1ms(1);
		i++;
		if(i>5)//等待>5MS
		{
			return 0;//初始化失败
		}
	
	}
	return 1;//初始化成功
}

/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能		   : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20WriteByte2(uchar dat)
{
	uint i, j;

	for(j=0; j<8; j++)
	{
		DSPORT2 = 0;	     	  //每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT2 = dat & 0x01;  //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us
		DSPORT2 = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat >>= 1;
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能		   : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


uchar Ds18b20ReadByte2()
{
	uchar byte, bi;
	uint i, j;	
	for(j=8; j>0; j--)
	{
		DSPORT2 = 0;//先将总线拉低1us
		i++;
		DSPORT2 = 1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi = DSPORT2;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte = (byte >> 1) | (bi << 7);						  
		i = 4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}
/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能		   : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ChangTemp2()
{
	Ds18b20Init2();
	Delay1ms(1);
	Ds18b20WriteByte2(0xcc);		//跳过ROM操作命令		 
	Ds18b20WriteByte2(0x44);	    //温度转换命令
	//Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能		   : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ReadTempCom2()
{	

	Ds18b20Init2();
	Delay1ms(1);
	Ds18b20WriteByte2(0xcc);	 //跳过ROM操作命令
	Ds18b20WriteByte2(0xbe);	 //发送读取温度命令
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能		   : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20ReadTemp2()
{
	uchar temp = 0;
	uchar tmh, tml;
	Ds18b20ChangTemp2();			 	//先写入转换命令
	Ds18b20ReadTempCom2();			//然后等待转换完后发送读取温度命令
	tml = Ds18b20ReadByte2();		//读取温度值共16位,先读低字节
	tmh = Ds18b20ReadByte2();		//再读高字节
	temp = tmh;
	temp <<= 4;
	temp += (tml>>4);
	if(temp>127)
	{	
		temp--;
		temp=~temp;
		temp=temp & 0x7f;
		ds18b20_temp2=temp;
		ds18b20_temp2=-ds18b20_temp2;
	}
	else
		ds18b20_temp2=temp;
	ds18b20_temp2=ds18b20_temp2+(tml & 0x0f)*9/15;
}

标签:51,temp,ds18b20,uchar,温湿度,总线,bi,单片机,--
From: https://blog.csdn.net/qq_63964231/article/details/139665895

相关文章

  • 读取超7100MB/s最高仅51度的长江存储PC411 SSD!雷神MIX PRO迷你机评测
    一、前言:搭载长江存储SSD和酷睿Ultra5125H处理器的雷神迷你机英特尔酷睿Ultra系列移动处理器发布半年之后,搭载它的各路迷你主机陆续出现在消费者面前。最近,雷神带来了全新的MIXPro迷你机,它就搭载了酷睿Ultra5125H处理器,还有广受好评的长江存储PC411SSD。先说SSD!现在我......
  • Arduino单片机详解
    Arduino单片机详解Arduino是一款开源的电子原型平台,广泛应用于各种电子项目和物联网开发。它通过简单易用的硬件和软件,使得电子制造和编程变得更加容易。Arduino的核心是单片机(Microcontroller),它是一个集成了CPU、内存和外设的芯片。下面将详细介绍Arduino单片机的各个方面,包......
  • Studying-代码随想录训练营day9| 151.反转字符串里的单词、卡码网:55.右旋转字符串、28
    第九天,......
  • 基于单片机的机械手臂控制系统设计
    摘要:应用单片机、Arduino及机械臂的有关知识,设计一款基于单片机的六自由度机械手臂,并详述其控制系统的软、硬件设计。该机械手臂能够模仿人的上肢完成简单的动作,因此在实验教学演示平台、生产或生活中都极具应用价值。关键词:机械手臂控制系统设计单片机Ar......
  • 基于单片机的太阳能无线 LED 灯设计
    摘要:文章设计一款太阳能LED灯,经过太阳能给锂电池充电,利用51单片机通过检测电路对整个系统施行管理和监控,可以使用手机和WIFI作为通信工具,利用光敏电阻检测光照,进而控制灯的亮度,天越黑,灯越亮,程序编写构造清晰,应用前景广阔。关键词:单片机......
  • 【单片机毕业设计选题24007】-基于STM32和阿里云的家庭健康数据监测系统
    系统功能:本课题设计是基于STM32单片机作为控制主体,通过HX711称重模块,HC-SR04超声波测距模块,红外测温,心率传感器等模块通过I2C或SPI接口与STM32进行通信,并读取传感器输出的身高,体重,心率,体温,血氧,心率,体脂率数据等数据,体脂率采用公式计算,可自行设置阈值超出阈值蜂鸣器发出警告。......
  • NG32031单片机串口初始化
    目录1.串口基础2.串口配置步骤3.N32G031串口初始化示例3.1开启时钟3.2 配置GPIO3.3 配置USART3.4 使能中断(如果需要)    3.5. 示例代码4.调试和验证5.注意事项6.额外功能NG32G031单片机的串口(UART)通常用于与外部设备或计算机进行串行通信。以下......
  • CF1515G
    CF1515GPhoenixandOdometers首先进行缩点,对于一个点,与它不在同一连通分量的点无法形成回路,所以对每个连通分量分别计算。假设一个点\(u\),有两个长度为\(a\)和\(b\)的环,那么就相当于找两个非负整数\(x\)和\(y\),使得\(ax+by=w\),其中\(w\)为题中的路径长,根据裴蜀定理......
  • 代码随想录 算法训练营 day9 Leetcode151 反转字符串单词 karma55 右旋转字符串 28 实
    Leetcode151反转字符串单词题目链接讲解此题方法很多很重要注重基础解法classSolution{publicStringreverseWords(Strings){char[]initialArr=s.toCharArray();//新字符数组char[]newArr=newchar[initialArr.length+1];//下......
  • 基于Android的礼品电商平台App设计与实现 毕业设计源码65516
                              摘 要在传统的商业模式中,对于礼品等商品,人们习惯于到各种商家店铺挑选购买。随着网络购物的广泛普及,和不断加快的时代节奏代中,人们不一定能为购买礼品腾出时间,更不会耐心挑选自己想礼品。......