基于单片机的智能窗帘控制系统

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DHT11温湿度传感器检测温湿度,滑动变阻器连接ADC0832数模转换器转换模拟,光敏传感器,采用GP2D12红外传感器,通过LCD1602显示屏显示各项参数,如果红外检测有人靠近,则电机顺时针转动片刻打开窗帘,人离开;如果温湿度超过阈值,则电机转动片刻打开窗帘,用按键替代语音模块,控制窗帘的打开关闭;一个模式切换按键用来切换手动/自动模式,手动模式下,两个按键负责窗帘的开关;自动模式下,则是靠红外,语音,温湿度来控制窗帘打开.并且串口可以远程操控控制窗帘的打开和关闭

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include <REGX52.H>
#include <intrins.h>
#include <stdio.h>
#include "oled.h"
#define uchar unsigned char
#define uint unsigned  intsbit CS=P1^0;                 //adc0832引脚
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;                 //adc0832引脚
sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit Temp_data=P2^6;  //DHT11
sbit out1=P3^6;
sbit out2=P3^7;
sbit key1=P1^6;
sbit key2=P1^7;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
unsigned int rec_dat[4];
static uchar u,U;      //定义变量
static flagpeople=0,flagwd=0,flagsd=0,flaggz=0;static uchar wd,sd;
static int wdyz=37,sdyz=80,gzyz=100;
static int flag=0;
static char Dat_rxd;
static int flag1 = 0;
static int num=0;
static int flag2 = 0;void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_start();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void beep_warning();
void cshq();
void xxpxs();
void ajjc();
void ckjs();void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}//延时ms
void DHT11_delay_ms(unsigned int z)
{unsigned int i,j;for(i=z; i>0; i--)for(j=110; j>0; j--);
}//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{while(--n);
}//DHT11起始信号
void DHT11_start()
{Temp_data=1;DHT11_delay_us(10);Temp_data=0;DHT11_delay_ms(50);//这个延时不能过短,18ms以上,实际在仿真当中要想读到数据延时要在延时参数要在40以上才能出数据Temp_data=1;DHT11_delay_us(30);//这个延时不能过短}//接收一个字节
unsigned char DHT11_rec_byte()
{unsigned char i,dat=0;for(i=0; i<8; i++){while(!Temp_data);DHT11_delay_us(8);dat <<=1;if(Temp_data==1){dat +=1;}while(Temp_data);}return dat;
}//接收温湿度数据
void DHT11_receive()
{unsigned int R_H,R_L,T_H,T_L;unsigned char RH,RL,TH,TL,revise;DHT11_start();Temp_data=1;if(Temp_data==0){while(Temp_data==0);   //等待拉高DHT11_delay_us(40);  //拉高后延时80usR_H=DHT11_rec_byte();    //接收湿度高八位R_L=DHT11_rec_byte();    //接收湿度低八位T_H=DHT11_rec_byte();    //接收温度高八位T_L=DHT11_rec_byte();    //接收温度低八位revise=DHT11_rec_byte(); //接收校正位DHT11_delay_us(25);    //结束if((R_H+R_L+T_H+T_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;}/*数据处理,方便显示*/rec_dat[0]=RH;rec_dat[1]=RL;rec_dat[2]=TH;rec_dat[3]=TL;}}void dht11()
{DHT11_delay_ms(150);DHT11_receive();sprintf(rec_dat_lcd0,"%d",rec_dat[0]);sprintf(rec_dat_lcd1,"%d",rec_dat[1]);sprintf(rec_dat_lcd2,"%d",rec_dat[2]);sprintf(rec_dat_lcd3,"%d",rec_dat[3]);DHT11_delay_ms(100);wd = rec_dat[3]*10 + rec_dat[2];sd = rec_dat[1]*10 + rec_dat[0];}uchar get_AD_Res()            //ADC0832启动读取函数
{uchar i, data1=0, data2=0;CS=0;CLK=0;DIO=1;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); CLK=1;_nop_();CLK=0;DIO=0;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); for(i=0; i<8; i++){CLK=1;_nop_();CLK=0;_nop_();data1=(data1<<1)|(uchar)DIO; }for(i=0; i<8; i++){data2=data2|(uchar)DIO<<i;CLK=1;_nop_();CLK=0;_nop_();}CS=1;return(data1 == data2)?data1:0;
}uchar get_AD_Res1()            //ADC0832启动读取函数
{uchar i, data1=0, data2=0;CS1=0;CLK1=0;DIO1=1;_nop_();CLK1=1;_nop_();CLK1=0;DIO1=1;_nop_(); CLK1=1;_nop_();CLK1=0;DIO1=0;_nop_();CLK1=1;_nop_();CLK1=0;DIO1=1;_nop_(); for(i=0; i<8; i++){CLK1=1;_nop_();CLK1=0;_nop_();data1=(data1<<1)|(uchar)DIO1; }for(i=0; i<8; i++){data2=data2|(uchar)DIO1<<i;CLK1=1;_nop_();CLK1=0;_nop_();}CS1=1;return(data1 == data2)?data1:0;
}void beep_warning()//蜂鸣器警报并且电机转动
{if(U<100){OLED_ShowCHinese(48,6,6);//有OLED_ShowCHinese(64,6,7);//人}else{OLED_ShowCHinese(48,6,8);//无OLED_ShowCHinese(64,6,7);//人}if(flag == 0)  //自动模式{if(flagpeople == 0) //可以判断有人{if(U<100) //有人{out1 = 1;out2 = 0;Delay(1000);out1 = 0;flagpeople = 1;}}if(U>=100){flagpeople = 0;}if(flagwd == 0){if(wd>wdyz){out1 = 1;out2 = 0;Delay(1000);out1 = 0;flagwd = 1;}}if(wd<=wdyz){flagwd = 0;}if(flagsd == 0){if(sd>sdyz){out1 = 1;out2 = 0;Delay(1000);out1 = 0;flagsd = 1;}}if(sd<=sdyz){flagsd = 0;}if(flaggz == 0){if(u>gzyz){out1 = 1;out2 = 0;Delay(1000);out1 = 0;flaggz = 1;}}if(u<=gzyz){flaggz = 0;}}}void main()					  //主函数
{	out1 = 0;out2 = 0;OLED_Init();			//初始化OLED  OLED_Clear(); OLED_ShowCHinese(0,0,0);//温	横坐标11, 纵坐标0,第0个汉字OLED_ShowCHinese(16,0,1);//度OLED_ShowCHinese(0,2,4);//湿OLED_ShowCHinese(16,2,5);//度OLED_ShowCHinese(0,4,2);//光OLED_ShowCHinese(16,4,3);//照while(1){cshq();  //参数获取dht11(); //温湿度获取ajjc();   //按键检测xxpxs();  //显示屏显示beep_warning();    //状态判断if(flag2==0){OLED_ShowCHinese(0,6,9);//自OLED_ShowCHinese(16,6,10);//动}else{OLED_ShowCHinese(0,6,11);//手OLED_ShowCHinese(16,6,10);//动}}
}void ajjc()  //按键检测
{if(flag == 0){if(!key1)  //打开{out1 = 1;out2 = 0;Delay(1000);out1 = 0;while(!key1);}if(!key2)  //关闭{out1 = 0;out2 = 1;Delay(1000);out2 = 0;while(!key2);}}if(!key3)  //切换{flag++;flag2++;if(flag > 1){flag = 0;}if(flag2>1){flag2 = 0;}while(!key3);}if(flag==1) //手动	{if(!key4)  //打开{out1 = 1;out2 = 0;Delay(1000);out1 = 0;while(!key4);}if(!key5)  //关闭{out1 = 0;out2 = 1;Delay(1000);out2 = 0;while(!key5);}}
}
void xxpxs()  //显示屏显示
{OLED_ShowNum(32,0,wd,2,16);//温度OLED_ShowNum(32,2,sd,2,16);//湿度OLED_ShowNum(32,4,u,3,16);//光强
}
void cshq()  //参数获取
{u=get_AD_Res();	U=get_AD_Res1();	//红外
}

四、实现现象

具体动态效果看B站演示视频:

32-基于单片机的智能窗帘控制系统

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载icon-default.png?t=O83Ahttps://pan.baidu.com/s/1BqLxyhSoRrfVfWj1RaY1cg?pwd=fv3a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149456.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3DMAX乐高建筑生成器插件LegoBuilding使用方法详解

3DMAX乐高建筑生成器插件LegoBuilding使用教程 3DMAX乐高建筑生成器插件LegoBuilding&#xff0c;一键批量生成随机的乐高积木样式建筑群&#xff0c;可作为配景楼建模使用。可根据闭合样条线画定范围或地形&#xff08;网格&#xff09;对象表面范围和起伏批量生成随机形状的乐…

浮游生物检测系统源码分享

浮游生物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用【Sa-Token】实现Http Basic 认证

使用Sa-Token开源架构快速实现Http Basic 认证&#xff0c;如上图 1、springboot环境下直接添加starter即可 <!-- Sa-Token 权限认证&#xff0c;在线文档&#xff1a;https://sa-token.cc --> <dependency><groupId>cn.dev33</groupId><artifactI…

04-Docker常用命令

04-Docker常用命令 启动类命令 启动docker systemctl start docker停止docker systemctl stop docker重启docker systemctl restart docker查看docker状态 systemctl status docker开机启动docker systemctl enable docker帮助类命令 查看docker版本 docker version查…

ubuntu中如何查看类型(函数)定义的头文件

问题&#xff1a; 1.该如何查找函数&#xff0c;或者数据类型的头文件&#xff1f; 方法&#xff1a; 1.使用vim搭配ctags 2.使用vscode 使用vscode查看头文件位置的步骤&#xff1a; 1.例如下图&#xff0c;我想添加包含file_operations的头文件 2.双击选中数据类型&#xf…

git笔记之在多个分支中复用某个分支提交的更改

git笔记之在多个分支中复用某个分支提交的更改 code review! 文章目录 git笔记之在多个分支中复用某个分支提交的更改1.实现该功能的 Bash 脚本示例2.这个脚本是否可以处理新添加的文件&#xff1f;3.该脚本使用前&#xff0c;应先使用下述脚本重置本地仓库所有分支与远程保持一…

GPU硬件如何实现光栅化?

版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本&#xff1a;见文末 引言 大家好&#xff0c;我是老雷&#xff0c;今天我想从GPU硬件原理出发&#xff0c;给大家分享在图形渲…

54 循环神经网络RNN_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录循环神经网络使用循环神经网络的语言模型困惑度&#xff08;perplexity&#xff09;梯度剪裁 循环神经网络 使用循环神经网络的语言模型 输入“你”&#xff0c;更新隐变量&#xff0c;输出“好”。 困惑度&#xff08;perplexity&#xff…

基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码

超多目标优化算法是一类专门用于解决存在三个以上目标函数的最优化问题的算法。这类问题在现实世界中非常常见&#xff0c;例如在工程设计、资源管理、机器学习等领域。由于目标之间的冲突性&#xff0c;很难找到一个单一的解来同时优化所有目标&#xff0c;因此超多目标优化算…

商标管理软件如何同步官方数据确保商标管理精准高效?

企业在商标管理中面临着诸多挑战&#xff0c;包括但不限于商标的续展监控、撤三与被撤三案件的应对、无效宣告的处理以及商标申请人变更的跟踪等。这些环节错综复杂&#xff0c;且对时效性要求极高&#xff0c;稍有疏忽便可能导致商标权益的受损。启服云商标管理软件凭借其强大…

云安全 | 利用易受攻击的 Lambda 函数泄露 AWS 账户信息云安全 | 利用易受攻击的 Lambda 函数泄露 AWS 账户信息

人们普遍认为云托管服务比传统服务更安全。由于它在基础设施级别上这个观点可能部分正确&#xff0c;但它们仍然具有可能导致其漏洞的用户控制元素。 接下来将探讨如何利用易受攻击的 Lambda 函数并泄露其 AWS 账户信息。 在我们开始讨论之前&#xff0c;让我们先回顾一下基本…

Kibana中突然看不到日志ElasticSearch突然采集不到日志问题解决分析

问题原因 起因之前我们项目是采用elk&#xff08;elasticsearchlogstashkibana&#xff09;的方式下部署日志采集系统&#xff0c;今天突然发现Kibana中所有项目日志都没打印&#xff0c;更奇怪的是线上的项目都正常运行&#xff0c;并无异常&#xff0c;这时让人陷入了深思&a…

【运维监控】influxdb 2.0 + grafana 11 监控jmeter 5.6.3 性能指标(1)

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、部署influxdb2.0二、部署grafana三、jmeter配置1、下载jmeter插件2、部署jmeter插件3、添加Backend Listener 本示例是通过jmeter的插件暴露jmeter的监控指标&#xff0c;通过插件将监控指标数据写…

基于MaxScale搭建MariaDB读写分离集群的方法【2024年最新版】

1、什么是MaxScale MaxScale是MariaDB数据库的一个中间件&#xff0c;为MariaDB提供代理服务&#xff0c;主要可以实现读写分离和一定的负载均衡功能&#xff0c;其中读写分离可将读操作和写操作分离到不同的数据库服务器上&#xff0c;以提高系统的整体性能和扩展性&#xff…

Oracle 数据库安装和配置指南

目录 1. 什么是Oracle数据库&#xff1f; 2. 安装前的准备工作 2.1 硬件要求 2.2 软件要求 2.3 下载Oracle安装包 3. Oracle数据库的安装步骤 3.1 Windows系统安装步骤 3.2 Linux系统安装步骤 4. 配置Oracle数据库 4.1 设置环境变量&#xff08;Linux&#xff09; 4.…

探索GraphRAG:用yfiles-jupyter-graphs将知识库可视化!

yfiles-jupyter-graphs 可视化 GraphRAG 结构 前言 前面我们通过 GraphRag 命令生成了知识库文件 parquet&#xff0c;这节我们看一下如何使用 yfiles-jupyter-graphs 添加 parquet 文件的交互式图形可视化以及如何可视化 graphrag 查询的结果。 yfiles-jupyter-graphs 是一…

微服务拆分技巧

微服务架构整体思路 常见场景实施建议 只有从0开始构建业务系统才需要一步到位&#xff0c;这样长痛不如短痛&#xff0c;其它的都只能逐步落地&#xff0c;因为有包袱 如何按业务拆分微服务 DDD 概要介绍 DDD 告诉你限界上下文是什么&#xff0c;却没有告诉你如何划分 DDD …

鸿蒙​​​​​​保障应用开发安全的技术措施

应用开发安全是指在开发过程中嵌入安全能力&#xff0c;使应用程序从源头上安全可靠。 开发者是应用程序的创作者&#xff0c;合法的开发者是创作出安全、可靠应用的前提条件;为了保证应用开发者身份真实可信&#xff0c;鸿蒙通过开发者证书对应用进行签名&#xff0c;保证应用…

高刷显示器哪个好?540Hz才有资格称高刷

高刷显示器哪个好&#xff1f;说实话&#xff0c;540Hz这些才能成为高刷显示器&#xff0c;什么200,240的&#xff0c;都不够高&#xff0c;什么是从容&#xff0c;有我不用才叫从容。下面我们一起来看看540Hz的高刷显示器都有哪些吧&#xff01; 1.高刷显示器哪个好 - 蚂蚁电…

Chainlit集成LlamaIndex实现知识库高级检索(BM25全文检索器)

检索原理 BM25Retriever类是一个基于BM25算法设计的检索器&#xff0c;它主要用于从一组文档或节点中检索出与查询最相关的文档或节点。这个类的设计目的是为了提高文本检索的效率和准确性&#xff0c;尤其是在处理大量文本数据时。 BM25&#xff08;Best Matching 25&#x…