【Proteus仿真】【51单片机】智能雨刷器设计

news2025/7/23 17:18:17

文章目录

  • 一、主要功能
  • 二、硬件资源
  • 三、软件设计
  • 四、实验现象
  • 联系作者


一、主要功能

本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶模块、按键模块、雨滴传感器、ADC、LED模块等。

主要功能:
系统运行后,LCD1602显示雨刷器当前模式、雨量、档位和状态。
默认工作在手动模式,对应手动模式指示灯亮,K3键可控制雨刷启动和停止,可通过K4键调节雨刷档位速度。当按下K2键切换为自动模式,此时自动模式指示灯亮,若检测雨滴量值在阈值范围内,根据对应值匹配到速度档位运行,若超过最大值,则以最高速运行,若低于最低值,则关闭雨刷。可通过K1键设置阈值范围,K2和K3键进行加减调节。 系统整个过程会在LCD1602液晶上显示对应的速度档位、雨刷状态,雨量值和手动/自动模式。
主要功能:
按键控制:自动/手动切换,设定雨量阈值、速度等;
显示控制:LCD1602显示雨量、档位、阈值、雨刷状态等;
驱动电路:使用ULN2003控制步进电机模拟雨刷转动;
检测电路:使用传感器检测当前雨量,通过ADC转换;
调速控制:根据雨量大小控制雨刷转动速度;
自动模式:自动模式根据雨量自动控制;
手动模式:通过按键控制雨刷启停、速度。


二、硬件资源

1、51单片机核心模块
2、LCD1602液晶模块
3、雨滴传感器、ADC模块
4、按键、LED模块
5、步进电机驱动模块


三、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/


//参数初始化
void sys_parm_init(void)
{
	sys_ctrl.dir=0;
	sys_ctrl.gear=3;
	sys_ctrl.run=0;
	sys_ctrl.ad_valh=50;
	sys_ctrl.ad_vall=20;
	sys_ctrl.mode=0;
	sys_ctrl.setflag=0;	
	sys_ctrl.zeroflag=1;
}

//系统初始界面显示
void sys_open_show(void)
{
	lcd1602_clear();
	lcd1602_show_string(0,0,"RN:   %");
	lcd1602_show_string(8,0,"SD");
	lcd1602_show_string(11,0," ");
	lcd1602_show_string(13,0,"OFF");
	lcd1602_show_string(0,1,"MAX:  %");
	lcd1602_show_string(9,1,"MIN:  %");
	//初始手动模式
	SD_LED=0;ZD_LED=1;
}

//系统参数获取
void sys_parm_get(void)
{
	while(1)
	{
		//读取雨量AD值
		sys_ctrl.ad_val=pcf8591_read_adcvalue(0);
		//将范围0-255映射到0-100
		sys_ctrl.ad_val=cal_map(sys_ctrl.ad_val,0,255,0,100);

		break;
	}
}

//系统参数设定
void sys_parm_set(void)
{
	u8 key=0;
	
	key=key_scan(0);
	//阈值设置
	if(key==KEY1_PRESS)
	{
		sys_ctrl.setflag++;
		if(sys_ctrl.setflag>=3)sys_ctrl.setflag=0;
		sys_ctrl.run=0;
		if(sys_ctrl.run)lcd1602_show_string(13,0,"ON ");
		else lcd1602_show_string(13,0,"OFF");
	}
	//上限设置
	if(sys_ctrl.setflag==1)
	{
		if(key==KEY2_PRESS)//加
		{
			sys_ctrl.ad_valh++;
			if(sys_ctrl.ad_valh>=100)sys_ctrl.ad_valh=0;
		}
		else if(key==KEY3_PRESS)//减
		{
			sys_ctrl.ad_valh--;
			if(sys_ctrl.ad_valh<=0)sys_ctrl.ad_valh=99;
		}
		lcd1602_show_string(4,1,"  ");	
	}
	//下限设置
	if(sys_ctrl.setflag==2)
	{
		if(key==KEY2_PRESS)//加
		{
			sys_ctrl.ad_vall++;
			if(sys_ctrl.ad_vall>=100)sys_ctrl.ad_vall=0;
		}
		else if(key==KEY3_PRESS)//减
		{
			sys_ctrl.ad_vall--;
			if(sys_ctrl.ad_vall<=0)sys_ctrl.ad_vall=99;
		}
		lcd1602_show_string(13,1,"  ");	
	}
	//未设置阈值
	if(sys_ctrl.setflag==0)
	{
		//雨刷开启/关闭
		if(key==KEY3_PRESS)
		{
			sys_ctrl.run=!sys_ctrl.run;
			if(sys_ctrl.run)lcd1602_show_string(13,0,"ON ");
			else lcd1602_show_string(13,0,"OFF");
		}
		//自动/手动模式切换
		else if(key==KEY2_PRESS)
		{
			sys_ctrl.mode=!sys_ctrl.mode;
			if(sys_ctrl.mode){SD_LED=1;ZD_LED=0;}
			else {SD_LED=0;ZD_LED=1;}
			sys_ctrl.run=0;
			if(sys_ctrl.run)lcd1602_show_string(13,0,"ON ");
			else lcd1602_show_string(13,0,"OFF");

		}
		//手动模式下档位调节
		if(sys_ctrl.mode==0)
		{
			if(key==KEY4_PRESS)
			{
				sys_ctrl.gear++;
				if(sys_ctrl.gear>=6)sys_ctrl.gear=1;	
			}	
		}
	}
}

//系统参数显示
void sys_parm_show(void)
{
	while(1)
	{
		//雨量值显示
		lcd1602_show_nums(3,0,sys_ctrl.ad_val,3,0);
		//雨量阈值显示
		lcd1602_show_nums(4,1,sys_ctrl.ad_valh,2,0);
		lcd1602_show_nums(13,1,sys_ctrl.ad_vall,2,0);
		//档位显示
		lcd1602_show_nums(11,0,sys_ctrl.gear,1,0);

		break;
	}	
}

//系统参数控制
void sys_parm_ctrl(void)
{
	static u16 i=0;
	u16 len=0;

	//手动模式
	if(sys_ctrl.mode==0)
	{
		//雨刷开启后,以初始档位运行
		if(sys_ctrl.run)
		{
			i++;
			if(i==1)
			{
				step_motor_28BYJ48_send_pulse(4,0,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);	
				sys_ctrl.zeroflag=0;
			}		
			if(i==3)
			{
				i=0;
				step_motor_28BYJ48_send_pulse(4,1,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);
				sys_ctrl.zeroflag=1;
			}		
		}
		//雨刷关闭
		else
		{
			step_motor_28BYJ48_send_pulse(4,1,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);		
		}		
	}
	//自动模式
	else
	{
		if(sys_ctrl.run)lcd1602_show_string(13,0,"ON ");
		else lcd1602_show_string(13,0,"OFF");
		//采集雨水量大于上限值,已最高档位运行雨刷
		if(sys_ctrl.ad_val>=sys_ctrl.ad_valh)
		{
			sys_ctrl.gear=5;//最高档位
			sys_ctrl.run=1;
			i++;
			if(i==1)
				step_motor_28BYJ48_send_pulse(4,0,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);	
			if(i==3)
			{
				i=0;
				step_motor_28BYJ48_send_pulse(4,1,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);
			}		
		}
		//采集雨量小于下限值,雨刷停止
		else if(sys_ctrl.ad_val<=sys_ctrl.ad_vall)
		{
			sys_ctrl.run=0;	
			step_motor_28BYJ48_send_pulse(4,1,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);
		}
		//在阈值范围内,根据雨量大小自动调节速度
		else
		{
			sys_ctrl.run=1;
			len=(sys_ctrl.ad_valh-sys_ctrl.ad_vall)/3;
			if(sys_ctrl.ad_val>sys_ctrl.ad_vall && sys_ctrl.ad_val<=sys_ctrl.ad_vall+len)
			{
				sys_ctrl.gear=1;	
			}
			else if(sys_ctrl.ad_val>sys_ctrl.ad_vall+len && sys_ctrl.ad_val<=sys_ctrl.ad_vall+2*len)
			{
				sys_ctrl.gear=2;
			}
			else if(sys_ctrl.ad_val>sys_ctrl.ad_vall+2*len && sys_ctrl.ad_val<=sys_ctrl.ad_vall+3*len)
			{
				sys_ctrl.gear=3;
			}
			else if(sys_ctrl.ad_val>sys_ctrl.ad_vall+3*len && sys_ctrl.ad_val<=sys_ctrl.ad_vall+4*len)
			{
				sys_ctrl.gear=4;	
			}
			i++;
			if(i==1)
				step_motor_28BYJ48_send_pulse(4,0,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);	
			if(i==3)
			{
				i=0;
				step_motor_28BYJ48_send_pulse(4,1,gspeed[sys_ctrl.gear-1],1,sys_ctrl.run);
			}
		}	
	}	
	
}


//应用控制系统
void appdemo_show(void)
{
	sys_parm_init();//系统参数初始化
	lcd1602_init();//LCD1602初始化
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_parm_set();
		sys_parm_get();
		sys_parm_show();
		sys_parm_ctrl();		
	}
}



四、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

如何制定测试团队度量体系

1、前言 每当月底或一个季度结束&#xff0c;公司或项目都会进行考核指标的统计&#xff0c;来总结每个组员在这个阶段的工作产出与绩效成绩。 那么制定哪些指标最为标准&#xff0c;最为专业&#xff0c;同时针对整个项目组都是公平的&#xff0c;这个就需要每个公司或项目根…

Python入门

目录 一、Python安装及环境搭建 二、Python运用&#xff08;数据类型&#xff09; 基本数据类型 引用数据类型 一、Python安装及环境搭建 Python环境安装包下载 https://www.python.org/ https://www.python.org/downloads/windows/ Python开发工具PyCharm下载 https://www.…

南卡和FIIL 哪个更好用?南卡和FIIL CC nano蓝牙耳机对比测评

作为一个狂热的蓝牙爱好者&#xff0c;我也用了不少蓝牙耳机了&#xff0c;真的是对蓝牙耳机爱不释手。自从蓝牙耳机出现以来&#xff0c;我们都看到了它的迅速发展&#xff0c;尤其是这两年&#xff0c;蓝牙耳机越来越受欢迎&#xff0c;已经取代了传统的有线耳机&#xff0c;…

1-10嵌入式Linux系统开发与应用|嵌入式Linux|第三章 Linux编程环境

目录 1.掌握Linux常用的基本命令功能、语法结构和用法示例 1.1linux编程环境 1.1.1系统平台环境 linux平台特性 1.1.2开发工具环境 1.1.3基于文模式的开发平台 1.1.4集成开发平台EclipseCDT 1.1.5文档帮助环境 1.2常用编辑器 1.2.1VIM编辑器 1.VIM的模式 2.VIM的启…

爆冷?黑马?这次用python来给你推测一波.....

人生苦短 我用python 在刚刚结束的2022年卡塔尔世界杯E组第一轮一场比赛中&#xff0c; 德国队爆冷1:2不敌日本队。 上半场&#xff0c;日本队门将权田修一出击扑倒劳姆送点&#xff0c; 京多安主罚命中先拔头筹&#xff1b; 下半场&#xff0c;堂安律门前补射为日本队扳平…

如何裁剪视频画面?快来看看这个详细教程

有什么简单的方法可以裁剪视频&#xff1f;现在有很多小伙伴都会在社交平台上发布自己的视频内容&#xff0c;分享自己的日常&#xff0c;那在编辑视频的时候肯定是会对视频内容进行剪切的&#xff0c;那么怎么裁剪视频呢&#xff1f;有哪些简单的方法可以裁剪视频呢&#xff1…

Selenium基础 — TMLTestRunner测试报告

目录 1、HTMLTestRunner介绍 2、HTMLTestRunner的使用 3、测试报告示例 4、封装成模块 1、学习思路和方法 2、想学习却无从下手&#xff0c;该如何学习&#xff1f; 3、软件测试/自动化测试【全家桶装】学习中的工具、安装包、插件.... 4、有了安装包和学习资料&#x…

javaweb JAVA JSP零食销售系统购物系统ssm购物系统购物商城系统源码(ssm电子商务系统)网上零食在线销售

JSP零食销售系统购物系统ssm购物系统购物商城系统源码&#xff08;ssm电子商务系统&#xff09;网上零食在线销售

[网络工程师]-应用层协议-DNS

域名系统&#xff08;Domain Name System,DNS&#xff09;是把主机域名解析成IP地址的系统&#xff0c;解决了IP地址难记的问题。该系统由解析器和域名服务器组成。DNS主要基于UDP协议&#xff0c;较少情况下使用TCP协议&#xff0c;端口号均为53。域名系统由三部分组成&#x…

解决Mybatis-Plus或PageHelper多表分页查询总条数不对问题

Mybatis-Plus版本3.4之后&#xff0c;对分页查询进行了优化 对于单表查询是没有问题的。而需要多表关联查询&#xff08;自写sql&#xff09;时&#xff0c;就会查询调用Mybatis-Plus的 .page(E page, Wrapper queryWrapper); 方法是就就会出现查询总数不对问题。 业务需要查…

[论文评析]MediaPipe Hands: On-device Real-time Hand Tracking, ArXiv,2020

MediaPipe Hands: On-device Real-time Hand Tracking论文信息简介Mediapipe Hands手掌检测器BlazePalm Detector手部骨骼检测Hand Landmark Model数据集构造应用References论文信息 论文题目&#xff1a;MediaPipe Hands: On-device Real-time Hand Tracking 发表&#xff1a…

STM32 IAP相关的FLASH数据读取和跳转

IAP操作一、STM32 FLASH 分区二、BootLoader程序三、UserAPP程序四、Flash数据的读取五、BootLoader到UserAPP的跳转一、STM32 FLASH 分区 以STM32G484RE举例&#xff0c;固件烧录到FLASH的起始地址进行保存&#xff0c;理论上可烧录的最大文件为512Kb&#xff0c;实际项目中固…

动态域名解析

众所周知&#xff0c;如果计算机想参与互联网通讯&#xff0c;无论是作为一台执行资源访问的客户端还是作为一台被访问的资源提供服务器&#xff0c;计算机必须分配一个合法的IP地址。这个地址通常由互联网服务商提供&#xff08;在中国通常是电信部门&#xff09; 这种IP地址…

2.JDBC必知必会

文章目录2.0 JDBC2.1 配置单数据源项目一&#xff1a;尝试Spring Boot自动装配数据源创建查看应用程序有哪些bean原理问题项目二&#xff1a;SpringMVC手动配置数据源Spring Boot自动装配原理与数据源相关配置项目三&#xff1a;尝试Spring Boot自动装配参数配置2.2.配置多数据…

基于自适应Sigmoid型函数的内镜图像增强与空间变颜色再现方法

论文题目&#xff1a;Image Enhancement and Space-variant Color Reproduction Method for Endoscopic Images using Adaptive Sigmoid Function 1 摘要 首先&#xff0c;使用YCCBR转换矩阵&#xff0c;将彩色图像分为亮度分量和色度分量&#xff0c;对均匀分布的亮度像素应…

论文笔记:PTR: Prompt Tuning with Rules for Text Classification

Abstract 手动设计大量语言提示麻烦且易出错&#xff0c;而自动生成的提示&#xff0c;在非小样本场景下验证其有效性昂贵且耗时。因此&#xff0c;提示调优以处理多类别分类任务仍然具有挑战。为此&#xff0c;本文提出使用规则进行多类别文本分类提示调优&#xff08;PTR&…

深入理解Java线程间通信

合理的使用Java多线程可以更好地利用服务器资源。一般来讲&#xff0c;线程内部有自己私有的线程上下文&#xff0c;互不干扰。但是当我们需要多个线程之间相互协作的时候&#xff0c;就需要我们掌握Java线程的通信方式。本文将介绍Java线程之间的几种通信原理。 锁与同步 在…

进程与线程

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

微服务环境搭建

目录 一&#xff0c;微服务介绍 单体架构介绍 垂直应用架构 分布式架构 SOA架构 微服务架构 二&#xff0c;微服务架构简介 三&#xff0c;微服务搭建 模块设计 创建步骤 一&#xff0c;微服务介绍 系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构---&…

【python】bin/dec/hex/bnr进制转换函数及fp32转十六进制

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 前言 不知道为什么&#xff0c;给脚本专栏选的这个logo有种怪怪的感觉(⊙o⊙)… 为方便后续一些脚本工作&#xff0c;将常用的进制转换函数汇总。所有函数均为字符串输入输出&#xff0c;且不加0x、0b等关键字&a…