当前位置: 首页 > news >正文

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

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于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;  //DHT11sbit 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);}
}//延时msvoid 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+5usvoid 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站演示视频:
B站演示视频

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

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

百度网盘资料下载https://pan.baidu.com/s/1BqLxyhSoRrfVfWj1RaY1cg?pwd=fv3a

相关文章:

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

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器转换模拟,光敏传感器&#xff0c;采用GP2D12红外传感器&#xff0c;通过LCD1602显示屏显示…...

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…...

记录一次 k8s 节点内存不足的排查过程

背景&#xff1a;前端服务一直报404&#xff0c;查看k8s日志&#xff0c;没发现报错&#xff0c;但是发现pods多次重启。 排查过程&#xff1a; 查看pods日志&#xff0c;发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…...

探索天空中的“名字”——用Landsat影像记录你的名字形状!

大家好&#xff01;今天我发现了一个特别有趣的工具——NASA官网上有一个功能&#xff0c;允许你输入自己的名字&#xff0c;然后它会根据Landsat卫星影像显示出与你名字形状相符的地形图。是不是很酷&#xff1f;&#x1f389; &#x1f30d; Landsat影像的神奇之处Landsat是N…...

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…...

透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)

一、透视投影 1.方法概述 Perspective projection&#xff08;透视投影&#xff09;是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中&#xff0c;远处的物体看起来比近处的物体小&…...

5 Java字符串操作

字符串操作 1、String类1.1 声明字符串1.2 创建字符串 1.3 字符串连接 /连接字符串连接其他数据类型 1.4 提取字符串信息获取字符串长度length()获取指定位置的字符 charAt()获取子字符串索引位置 indexOf()判断字符串首尾内容 startsWith()/endsWith()获取字符数组 toCharArra…...

【C++习题】17.二分查找算法_二分查找

文章目录 二分查找算法简介题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解总结朴素二分模板 二分查找算法简介 特点&#xff1a; 二分查找算法&#xff0c;是最恶心&#xff0c;细节最多&#xff0c;最容易写出死循环的算法。&#xff08;而且非常难…...

Spring Boot英语知识网站:架构与开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

Unity ShaderLab 实现网格爆炸

实现思路&#xff1a; 沿着3D物体每个面的法线&#xff0c;将面偏移一定的位置。 Shader Graph实现如下&#xff1a; Shader Lab 实现如下&#xff1a; Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…...

2024/11/28学习日志

为了更好地记录并反思自己的学习状况&#xff0c;将每日学习的内容、时长、心得等记录于此日志。 于9月3日开始记录&#xff0c;计划每日记录&#xff0c;希望至少能够坚持一个学期。 学习内容&#xff1a; 数据结构&#xff1a; 拓扑排序。关键路径。 马原&#xff1a; 马…...

在shardingsphere执行存储过程

环境&#xff1a; springboot&#xff1a;2.5.2 数据库&#xff1a;Kingbase金仓V8R6 依赖&#xff1a; <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId></depende…...

1.文件目录操作

目录 &#x1f34c; ls - 列出目录内容 &#x1f349;cp - 复制文件或目录 &#x1f347;mv - 移动或重命名文件 &#x1f353; cd - 切换目录 &#x1f348; pwd - 打印工作目录 &#x1f352;mkdir - 创建目录 &#x1f351; rmdir - 删除空目录 &#x1f96d; touc…...

Vue单页面应用和多页面应用

在 Vue.js 中&#xff0c;“单页面”&#xff08;SPA&#xff0c;Single Page Application&#xff09;和"多页面"&#xff08;MPA&#xff0c;Multi Page Application&#xff09;是两种不同的应用结构&#xff0c;它们的差异主要体现在页面的加载方式、路由的使用、…...

Lombok :简化 Java 编程的得力工具

在 Java 开发过程中&#xff0c;常常需要编写大量的样板代码&#xff0c;例如构造函数、Getter 和 Setter 方法、equals 和 hashCode 方法等。这些代码虽然逻辑相对固定&#xff0c;但编写起来却较为繁琐且容易出错&#xff0c;并且会使代码显得冗长。Lombok 应运而生&#xff…...

AIGC引领金融大模型革命:未来已来

文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC&#xff08;Artificial Intellige…...

DBA面试题-1

面临失业&#xff0c;整理一下面试题&#xff0c;找下家继续搬砖 主要参考&#xff1a;https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1&#xff0c; 整形 tinyint,smallint,medumint,int,bigint&#xff1b;分别占用1字节、2字节、3字节…...

用go语言写一个小服务

文章目录 简介重新想到go 小服务main.go部署测试 结束语 简介 golang的优势 响应速度&#xff1a; Go > Java > Python 内存占用&#xff1a; Go < Java < Python 从java转go&#xff0c;然后go又转java&#xff0c;感觉就是go虽然在编译、内存占用都强于java&am…...

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…...

WordCloud参数的用法:

-------------词云图集合------------- 用WordcloudPyQt5写个词云图生成器1.0 WordCloud去掉停用词&#xff08;fit_wordsgenerate&#xff09;的2种用法 通过词频来绘制词云图&#xff08;jiebaWordCloud&#xff09; Python教程95&#xff1a;去掉停用词词频统计jieba.toke…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...