基于51单片机的智能窗帘仿真方案原理图设计

2023-05-16

系统总体方案

(附文件)

通过上述对各个模块介绍,我们最终选择了采用STC89C52作为的主控芯片,采用光敏电阻采集环境光强通过ADC0832转换成数字信息然后由单片机处理得出环境光强的情况,DS1302时钟芯片获取当前的时间信息,系统采用LCD1602实时显示光强、时间、日期和模式。通过四个独立按键可以进行切换模式模式、设置时间日期、设置光强限值、定时时间等并且系统还配备了红外遥控的功能。同时具有两个限位开关防止窗帘电机过度转动而造成窗帘损坏。
本设计的具体的系统方案如下图2.1所示。
框图:
在这里插入图片描述

原理图:
在这里插入图片描述
DS1302的工作原理
在使用时候由于DS1302的数据引脚是双向通讯的,而51单片机引脚属于弱上拉如果不添加10K的上拉电阻会导致弱上拉时端口的电平翻转而通讯不成功,而RST和SCLK是单向的不外加上拉也可以,添加也可以。在本设计中将这三个端口都添加了10K上拉电阻。具体的电路图如图3.10所示。
在这里插入图片描述

ADC0832的工作原理

在这里插入图片描述
步进电机原理构造

步进电机是一种将电脉冲转化为角位移的执行机构。通俗的说:也就是当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。可以通过控制脉冲的个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲的频率来控制电机转动的速度和加速度,从而做到调速的目的。
步进电机28BYJ48型四相八拍电机,工作电压为:DC5V-DC12V。当对步进电机施加一系列连续不断地控制脉冲时,它可以连续不断转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单四拍(单相绕组通电):A-B-C-D-A….,双四拍(双相绕组通电):AB-BC-CD-DA-AB…;八拍:A-AB-B-BC-C-CD-D-DA-A…。

ULN2003与单片机的连接
本设计中采用ULN2003驱动步进电机,设计中将单片机的P1.0P1.3引脚分别接到ULN2003的R1R4上,输出端Q1~Q4接到28BYJ-48步进电机的蓝、粉、黄、橙四根线上也就是ABCD四相上。如图3.14所示。
在这里插入图片描述
HX1838红外一体接收头的介绍
一体化红外接收头指的是红外接收相关电路被集成在一个元件中。HX1838就是这样一个集成的一体化红外接收头,内部集成了红外监测二极管、放大器、积分电路、限幅器、比较器、带通滤波器等电路。当红外监测二极管监测到红外信号,然后将信号传送到放大器和限幅器,限幅器将脉冲幅度控制在一定范围,而不管红外发射装置和接收头的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射装置的信号波形
HX1838连接到单片机的P3.2外部中断输入引脚上,这样有接收到红外信号就可以第一时间响应进入解码阶段。而51单片机引脚属于弱上拉如果不添加10K的上拉电阻会导致弱上拉时端口的电平翻转而通讯不成功,所以在HX1838信号引脚上添加一个10K的上拉电阻。HX1838与单片机连接电路图如图3.16所示。
在这里插入图片描述

系统软件部分设计

在这里插入图片描述
部分代码:

/*************************************************************
                      智能窗帘

补充说明:
***************************************************************/
#include<reg52.h>		   //头文件
#include<LCD1602.h>
#include<DS1302.h>
#include<28BYJ48.h>
#include<EEPROM.h>
#include<ADC0832.h>
#include<HW.h>

#define uchar unsigned char//宏定义
#define uint unsigned int

/*******************引脚定义*********************/
sbit key_mode = P1^0;	 //设置键
sbit key_jia  = P1^1;	 //加值键
sbit key_jian = P1^2;	 //减值键
sbit key_ok   = P1^3;	 //确定键

sbit sw1=P3^7;           //全开 限位开关
sbit sw2=P3^6;           //全关 限位开关
/*******************变量定义*********************/
uchar light_up,light_down;//存储光强上、下限值
uchar set_f=0;		//设置选择标记,=0非设置,=1设置年,=2设置月,=3设置日,=4设置时,=5设置分,=6设置秒
					//              =7设置定时-时,=8设置定时-分,=9设置定时-开关,=10设置窗帘打开/关闭
					//				=11设置光强上限,=12设置光强下限,=13设置校准窗帘位置

uchar num;			//计数变量
uchar ds[4];	    //定时控制开时、分、控制关时、分

uchar mode=0;		//模式标记。=0手动,=1定时,=2光控
uchar light;        //存储光强

uint moto_num=0;  //记录窗帘位置
uchar moto_state=0;//窗帘状态,=0已经关闭,=1处于运转过程中,=2已经打开
bit moto_f=0;	   //标记当前控制状态,=0控制关,=1控制开
uchar code display_mode[3][3]={"SD\0","DS\0","GK\0"};//显示模式
/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时函数
参数说明:
********************************************************/ 
void delayms(uint ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}

/********************************************************
函数名称:void display(void)
函数作用:正常显示日期、时间、光强等函数
参数说明:
********************************************************/ 
void display(void)
{
	uint t[3]; 	

	//显示时间
	LCD_disp_char(0,2,ASCII[time[2]/10]);//显示时【0:表示第1列,2:表示第2行,所有关于显示都一样】
	LCD_disp_char(1,2,ASCII[time[2]%10]);
	LCD_disp_char(2,2,':');
	LCD_disp_char(3,2,ASCII[time[1]/10]);//显示分【3:表示第4列,2:表示第2行,所有关于显示都一样】
	LCD_disp_char(4,2,ASCII[time[1]%10]);
	LCD_disp_char(5,2,':');
	LCD_disp_char(6,2,ASCII[time[0]/10]);//显示秒
	LCD_disp_char(7,2,ASCII[time[0]%10]); 

	//显示日期
	LCD_disp_char(0,1,ASCII[time[6]/10]);//显示年
	LCD_disp_char(1,1,ASCII[time[6]%10]);
	LCD_disp_char(2,1,'/');
	LCD_disp_char(3,1,ASCII[time[4]/10]);//显示月
	LCD_disp_char(4,1,ASCII[time[4]%10]);
	LCD_disp_char(5,1,'/');
	LCD_disp_char(6,1,ASCII[time[3]/10]);//显示日
	LCD_disp_char(7,1,ASCII[time[3]%10]);

	//显示模式
	lcd1602_write_character(9,1,display_mode[mode]);
	
	//显示光强
	if(light>99)
		LCD_disp_char(12,1,ASCII[light/100]);
	else
		LCD_disp_char(12,1,' ');
	LCD_disp_char(13,1,ASCII[light%100/10]);
	LCD_disp_char(14,1,ASCII[light%10]);
	LCD_disp_char(15,1,'%');

	//光强控制
	if(mode==2)//光控模式
	{	 
		if((light>=light_up||light<light_down))//判断实际光强是否【大于等于上限 或 小于下限值】、当前处于打开状态
		{	
			moto_f=0;	 //标记当前控制窗帘关闭  
			moto_state=1;//标记窗帘处于运转过程中
		}
		else
			if((light<light_up&&light>=light_down))//判断实际光强是否【大于等于下限值 并且 小于上限】、当前处于关闭状态
			{
				moto_f=1;	 //标记当前控制窗帘打开  
				moto_state=1;//标记窗帘处于运转过程中
			}
	}
	else
		if(mode==1)//定时模式
		{
			t[0]=time[2]*60+time[1];//当前时间
			t[1]=ds[0]*60+ds[1];	//窗帘开启时间点
			t[2]=ds[2]*60+ds[3];	//窗帘关闭时间点
			
			if(t[1]<t[2]) 			//0时 --> t[1] --> t[2] --> 24时
			{
				if(t[0]>=t[1]&&t[0]<=t[2])
					moto_f=1;	    //标记当前需要打开窗帘
				else
					moto_f=0;		//标记当前需要关闭窗帘
			}
			else					//0时 --> t[2] --> t[1] --> 24时
			{
				if(t[0]>=t[1]||t[0]<=t[2])
					moto_f=1;		//标记当前需要打开窗帘
				else
					moto_f=0;		//标记当前需要关闭窗帘
			} 
			moto_state=1;	  //标记窗帘处于运转过程中
		}
	if(moto_f==0&&moto_state!=0&&sw2!=0)//控制关闭窗帘
	{
		if(moto_num==0)			  //控制次数减到0时,表示窗户已经关闭完成
		{
			BYJ48=P2&0xf0;		  //关闭步进电机
			moto_state=0;		  //标记窗帘处于关闭状态
			lcd1602_write_character(10,2,"ZT:OFF");
		}
		else
		{
			motor_z();				  //步进电机正转
			moto_num--;				  //控制次数-1
			lcd1602_write_character(10,2,"-->OFF");
		}		
	}
	else		  
		if(moto_f==1&&moto_state!=2&&sw1!=0)//控制打开窗帘
		{
			if(moto_num>=192)	  //控制次数加到128时,表示窗户已经打开完成
			{
				BYJ48=P2&0xf0;		  //关闭步进电机
				moto_state=2;	  //标记窗帘处于打开状态
				lcd1602_write_character(10,2,"ZT:ON ");
			}
			else
			{
				motor_f();			  //步进电机反转
				moto_num++;			  //控制次数+1
				lcd1602_write_character(10,2,"-->ON ");
			}		
		} 
		else					  //窗户处于停止状态
		{
			BYJ48=P2&0xf0;		  //关闭步进电机
			if(moto_state==0||sw2==0)
				lcd1602_write_character(10,2,"ZT:OFF");
			else
				if(moto_state==2||sw1==0)
					lcd1602_write_character(10,2,"ZT:ON ");	
		}  	
}

.

链接:https://pan.baidu.com/s/1GT7r8yXGJEkR4KJ6jDY0EQ
提取码:cj8a

.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的智能窗帘仿真方案原理图设计 的相关文章

  • 程序员(尤其是零项目经验的程序员)找工作

    程序员 xff08 尤其是零项目经验的程序员 xff09 找工作 谈到程序员 xff08 尤其是零项目经验的程序员 xff09 找工作 xff0c 培训班是个不可回避的讨论热点 虽然本人也做过兼职Java培训老师 xff0c 多少了解些培训
  • 非全日制计算机考研有哪些性价比高的院校呢?

    非全日制计算机考研有哪些性价比高的院校呢 xff1f 附 xff1a 各大高校专业课资料整理可以看一下我的博客主页上传的资源哦 xff01 感谢关注 xff0c 点赞 xff0c 评论 计算机行业的非全日制研究生院校 xff0c 大都包含大
  • C++ vector数组实现多级排序—使用sort()函数

    之前有记录过 python 使用 numpy 的多级排序方法 xff1a numpy 多级排序 xff1a lexsort 函数详解 地球被支点撬走啦的博客 CSDN博客 lexsort C 43 43 多级排序可以借用 sort 函数 x
  • 数学符号及读法大全(超经典)

    数学符号及读法大全 附 xff1a 各大高校专业课资料整理可以看一下我的博客主页上传的资源哦 xff01 感谢关注 xff0c 点赞 xff0c 评论 数学符号及读法大全 常用数学输入符号 xff1a xff1d xff1c xff1e x
  • 【计算机】数据结构-严蔚敏/清华大学(完)

    计算机 数据结构 严蔚敏 清华大学 xff08 完 xff09 需要其他资源的可以在我博客主页找找 xff0c 太多了 xff0c 我懒得整理 数据结构 43 43 C语言版 43 43 第2版严蔚敏 清华大学 pdf 链接 https p
  • 2021 王道考研 数据结构+习题讲解

    2021 王道考研 数据结构 2021王道数据结构高清PDF 链接 https pan baidu com s 1czh6EiRxnTj9uJgc5i12 w 提取码 frnh 复制这段内容后打开百度网盘手机App xff0c 操作更方便哦
  • 2015考研数学复习全书【数一】

    2015考研数学复习全书 数一 链接 https pan baidu com s 1nuXM0fINXRKCYbyy o kSg 提取码 vr45 复制这段内容后打开百度网盘手机App xff0c 操作更方便哦
  • 教你如何零基础备考公务员

    教你如何零基础备考公务员 零基础复习一个月国考上岸 xff0c 笔试120 43 岗位第一 近年题目简单 xff0c 这个分数可能看着不高 xff0c 我考试那年是除了极少数部委进不了面试 xff0c 绝大部分岗位都能进面试的 xff0c
  • 零基础考公务员,备考多长时间最合适?

    零基础考公务员 xff0c 备考多长时间最合适 xff1f 说到考公务员 xff0c 小伙伴们最关心的问题就是 xff0c 到底多长时间才能考上 xff1f 小伙伴们都知道 xff0c 上岸要趁早 xff01 毒姐经常在网上看到一些提问 x
  • stm32上基于FreeRTOS多任务程序运行

    一 FreeRTOS简介二 在stm32开发板上实现多任务程序运行1 任务要求2 编写程序3 编译生成hex文件4 将程序下载到stm32开发板上 一 FreeRTOS简介 FreeRTOS是一个迷你操作系统内核的小型嵌入式系统 作为一个轻
  • C#---winform基础

    一 winform 1 winform应用程序是一种智能客户端技术 xff0c 我们可以使用winform应用程序帮助我们获得信息或者传输信息等 2 属性 Name 在后台要获得前台的控件对象 xff0c 需要使用Name属性 visibl
  • ubuntu20.04安装编译kalibr与出现的问题

    1 安装依赖 ubuntu20与18依赖的内容差别很大 xff0c 在逐个更改和参考 25条消息 Ubuntu20 04安装kalibr 可即的博客 CSDN博客 ubuntu安装kalibr和官网 后终于安装依赖成功了hhh sudo a
  • 100道最新Java面试题,常见面试题及答案汇总

    除了掌握扎实的专业技能之外 xff0c 你还需要一份 Java程序员面试宝典 才能在万千面试者中杀出重围 xff0c 成功拿下offer 小编特意整理了100道Java面试题 xff0c 送给大家 xff0c 希望大家都能顺利通过面试 xf
  • SSH远程连接实例

    目录 0 实例场景 1 Windows10中的SSH环境配置 2 Ubuntu端的SSH配置 3 SSH使用 3 1 在终端命令行中连接 3 2 使用VSCode连接 0 实例场景 本实例是在校园网的环境中 xff0c 使用SSH在个人电脑
  • Windows环境下安装tensorflow(操作简单)

    写在最前 xff1a 本人之前也安装过tensorflow xff0c 但因为好长时间没用 xff0c 最近需要用到 xff0c 结果一打开发现版本太低 xff0c 运行代码时出现了很多语法错误 想要直接更新tensorflow xff0c
  • STM32串口基础通讯函数配置

    外设篇 串口 标准库 在串口屏 xff0c WiFi模块时候经常会用到串口 xff0c 所以串口还是需要了解一下原理 xff0c 才能更好的借鉴别人代码 xff08 doge xff09 初窥门径 当数据发送时候 xff0c 单片机向发送数
  • unable prepare context:unable to evaluate symlinks in Dockerfile path:lstat /XXXXXX

    问题描述 今天在构建镜像文件时 报错 unable prepare context unable to evaluate symlinks in Dockerfile path lstat 根据提示是说 找不到当前我们要构建的 文件 spa
  • STM32基于FreeRTOS的多任务程序

    目录 任务要求FreeRTOS移植介绍应用 任务要求 在STM32下完成一个基于FreeRTOS的多任务程序 xff0c 执行3个周期性task task1 xff0c 每间隔500ms闪烁 xff08 变化 xff09 一次LED xff
  • 如何判断两个ip是否属于同一子网;如何确定子网掩码,让300台服务器处于同一网段

    一 什么是子网掩码 xff1f 在了解ip地址的网段之前 xff0c 我们先来了解子网掩码 xff0c 很多对网络了解不深的朋友都对子网掩码有些迷惑 xff0c 不了解它是用来干什么的 xff1f 子网掩码不能单独存在 xff0c 它必须结
  • 刷leetcode常用的一些库函数

    1 比较两个数大小 xff0c 求出更大的数或者更小的数 Math max a b Math min a b 2 批量化初始数组 当然 xff0c 你遍历一遍一个一个赋值也可以 Arrays fill nums 1 如果是二维数组 xff0

随机推荐

  • k8s中configmap挂载配置nginx.conf

    ConfigMap ConfigMap作用是存储不加密的数据到etcd中 xff0c 让Pod以变量或数据卷Volume挂载到容器中 应用场景 xff1a 配置文件 创建配置文件 首先我们需要创建一个配置文件 nginx conf user
  • k8s监控prometheus+Grafana

    Kubernetes集群资源监控 概述 监控指标 一个好的系统 xff0c 主要监控以下内容 集群监控 节点资源利用率节点数运行PodsPod监控 容器指标应用程序 程序占用多少CPU 内存 监控平台 使用普罗米修斯 prometheus
  • python学习(猜数字游戏)

    import random x 61 int random randint 0 10 i 61 1 print 39 39 39 欢迎进入猜数字小游戏 xff01 本次游戏机会只有三次 xff01 小伙伴拼手气的机会到了哟 xff01 39
  • python脚本批量创建job并自动添加视图

    由于我们项目jenkinsfile和deployment yaml都是单独分开放在git仓库上管理的 xff0c 脚本实现的是通过批量创建对应的文件和job任务自动提交git仓库 xff0c 并把job加入到视图里 xff01 话不多说贴脚
  • 远程登陆Ubuntu服务器anaconda的使用问题(多用户)

    远程登录Ubuntu的新用户在使用 conda 命令时 xff0c 可能会遇到找不到 conda 命令的情况 xff0c 因此在多用户使用 anaconda 的情况下 xff0c 需要提前在 Ubuntu 服务器上做一下 anaconda
  • telnet批量检查端口是否正常

    一 本机测试目标端口是否正常 xff1a python调用的socket模块来实现 xff1a usr bin python3 import socket ip 43 port 描述 ip prot 61 39 39 39 0 0 0 0
  • mongo副本集一主两从读写分离部署

    mongodb 副本集部署 mongodb 0 gt 3717 mongodb 1 gt 3718 mongodb 2 gt 3719 wget https fastdl mongodb org linux mongodb linux x8
  • 二进制部署mongodb_exporter

    一 先安装部署好prometheus和grafana 二 部署exporter客户端 1 下载软件mongodb下载地址 xff08 grafana模板选择2583 xff09 版本选择0 11 2的 xff0c 不然和模板的语句prome
  • rocketmq二进制2m-2s异步集群部署

    一 机器规划 第一台机器 192 168 20 101 端口规划 xff1a 9876 NameServer1 10910 BrokerA master 10921 BrokerB slave 第二台机器 192 168 20 102 端口
  • Linux(Ubuntu系统)安装unzip

    最近在阿里云服务器上下载了zip形式的数据集压缩包 xff0c 解压时却发现并没有unzip解压命令 xff0c 于是习惯性地pip install unzip xff0c 并不能成功 xff0c 网上很多方法都说运行 sudo apt g
  • Python问题&解决

    python pycharm小技巧 1 要学会使用Debug pycharm Debug使用 Debug记得打断点 xff01 Pycharm debug技巧 在debug的时候python console可以直接敲变量显示 在安装Pych
  • Linux系统安装ClamAV的详细步骤

    ClamAV是一款开源免费的杀毒软件 xff0c 它可以在Linux系统上运行 以下是在Linux系统上安装ClamAV的步骤 xff1a 打开终端并更新软件包列表 xff1a sudo apt update 安装ClamAV xff1a
  • 为什么 0.1 + 0.2 不等于0.3?如何解决这个问题?

    一 开头 我们都知道0 1 43 0 2 61 61 0 3 xff0c 而是0 30000000000000004 xff0c 那么是为什么 xff1f 我们都知道计算机在内部实现中使用的是二进制 xff0c 0 1也是不例外的 xff0
  • 前端手写(十八)——Promise并行限制

    一 写在前面 一般我们做多个异步请求 xff0c 此时我们常常采用的是Promise all来进行处理 xff0c Promise all会全部的一起执行 xff0c 但是如果存在一些并行的限制 xff0c 也就是说一次最多只能执行固定的数
  • 深度学习环境安装(VMware)-Miniconda-pytorch

    提示 xff1a 最近要要跑一些算法 xff0c 用的linux系统一直是在服务器上进行开发 xff08 无GUI界面 xff09 xff0c 双系统又懒得开关机 xff0c 虚拟机还不能调用gpu xff0c 真无了个大语 对于文章中出现
  • novnc安装

    ubuntu22 04 span class token comment 安装软件 span span class token function sudo span span class token function apt span sp
  • python扫描端口

    什么是端口扫描 定义 xff1a 对一段端口或指定的端口进行扫描 目的 xff1a 通过扫描结果可以知道一台计算机上都提供了哪些服务 xff0c 然后就可以通过所提供的这些服务的己知漏洞就可进行攻击 原理 xff1a 当一个主机向远端一个服
  • HTML_移动端界面

    homework8 移动端界面 注 点击图标放大 点击图片旋转180度 ydd html span class token doctype lt DOCTYPE html gt span span class token tag span
  • Windows11安装与使用初体验

    Windows11安装 因为下载的是美国镜像 xff0c 所以系统语言是英文的 xff0c 但是这么多年的使用 xff0c 还是能够看懂一二的 xff0c 一步步操作就好了呗 xff0c 随缘点击 xff0c 无脑下一步 不知是我没有选择对
  • 基于51单片机的智能窗帘仿真方案原理图设计

    系统总体方案 xff08 附文件 xff09 通过上述对各个模块介绍 xff0c 我们最终选择了采用STC89C52作为的主控芯片 xff0c 采用光敏电阻采集环境光强通过ADC0832转换成数字信息然后由单片机处理得出环境光强的情况 xf