基于51单片机的智能婴儿看护床设计

news2025/2/25 5:54:32

需要源码及原理图文件请私信!!!!

基于51单片机的智能婴儿看护床设计

  • 1、引言
  • 2、功能设计
  • 系统结构框图
  • 3、系统硬件设计
    • 3.1声音电路的设计
    • 3.2语音播报电路的设计
    • 3.3独立按键电路的设计
    • 3.4模拟摇床(步进电机驱动电路)的设计
    • 3.5液晶显示电路设计
    • 3.6尿液检测电路设计
  • 4、系统软件设计
    • 4.1 系统主流程图
    • 4.2按键程序流程图设计
    • 4.3步进电机流程图
    • 4.4液晶屏幕流程图设计
  • 实物图及PCB
  • 部分源码

1、引言

人们对智能化的生活越来越向往,随着时代的快速发展单片机在我们日常生活中应用的也越来越广泛。单片机完成了由模拟电路和数字电路的传统设计模式过渡到以软件设计为主体的微控制技术时代。使得单片机在各种各样的生活场景中得到了广泛的应用。所以催生了我利用单片机,再结合移动通信做出这款基于单片机的监控电子婴儿床系统的想法。
该婴儿床设计针对现阶段独生子女父母对保姆照顾婴儿不周的担忧,利用单片机的控制技术,并结合wt588d语音播报和摇篮设计出具有监控功能的电子婴儿床系统。当出现父母担忧的几种情况时,该系统在一定的时间自动提醒监护人,并且会实时反馈信息,从而让监护人实时了解孩子的情况,能够安心工作。该婴儿床系统具有价钱便宜、功能实用、工作稳定可靠等优点。
我设计的这款监控婴儿床,外观上尚需润色不少,比如步进电机实现摇床功能要怎么具体的实现,此系统中只用步进电机来模拟;还有具体的婴儿床模型没有做出来;湿度传感器放置在哪里效果最佳,并能实现所要求的功能。

2、功能设计

  1. 每次婴儿在号哭时通过声音控制电路控制电机自动晃动,并且语音模块会自动播报小星星轻音乐安抚婴儿的情绪;
  2. 声控模块可以实时采集当前婴儿是否哭闹;
  3. 每次孩子撒尿导致被子湿了时,通过湿度感应器的信号启动自动报警,语音播报是否尿床,led指示灯亮;
  4. 步进电机通过ULN2003进行驱动,当需要安抚婴儿时,控制电机左右旋转来促使婴儿安静下来。
  5. 按键用来进行设置3种不同的模式,方便对不同的情况及时做出处理

系统结构框图

在这里插入图片描述

3、系统硬件设计

3.1声音电路的设计

声控电路算是本系统中比较重要的一个子电路,该电路由主要由直插电容式驻极体话筒MIC1、双电压比较器集成电路LM393、发光二极管D2、1uf电容C1、三极管Q1、电阻R4-R10组成。LM393是常用的电压比较器,每个LM393芯片中共有两个电压比较器[7]。发光二极管的亮度会随着直插电容式驻极体话筒采集的声音的大小产生明亮变化,声音越大,发光二极管越亮。通过声控电路与步进电机驱动电路连接起来,即能实现:
在这里插入图片描述

3.2语音播报电路的设计

本次设计的报警模块采用wt588d语音芯片进行语音播报和报警提示。当超声波检测到距离后或者是低于安全距离STC89C52单片机控制语音芯片来播报当前的内容。
下图为语言芯片电路引脚图,扬声器就是喇叭用来进行语音播报,p02是复位引脚也可以不接,只有P03口是数据引脚,Wt588d语音芯片他是通过外部的minu下载器下载相应的语音文件,比如播报欢迎光临,那么我们就需要通过minu下载器编辑这段语音欢迎光临。然后生成一个地址,当单片机需要播报这端语音的时候,就会发送指令给wt588d,进行语音播报。
在这里插入图片描述
点击“操作”→“地址设置”,能设置各个按键(I/O口)直接触发的地址。
在这里插入图片描述
在这里插入图片描述

3.3独立按键电路的设计

系统中一共使用了三个独立按键:K1、K2和K3。本次设计按键主要是用来进行功能设置。当我们按下K1按键时,会进入到模式1,按下K2时,会进入模式二。K3进行模式三。单片机的按键电路其实就是一个对高低电平的检测。我们当按键被按下时,单片机的IO口会检测为低电平。单片机就会来根据电平特性判断程序应该要执行的操作。但是在写按键函数的时候有几点是需要我们注意的。当按键被按下时会产生抖动,所以要写一个去抖的函数。还有就是要有短暂的延迟。按键和电路连接引脚:
在这里插入图片描述

3.4模拟摇床(步进电机驱动电路)的设计

本系统采用步进电机驱动电路来模拟摇床系统,由声控电路来触发。如图3-5步进电机28BYJ48型四相八拍电机,电压为DC5V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。因为单片机的I/O口电流太小,无法驱动步进电机工作,因而要连接一个ULN2003实现电流的放大作用[8]。ULN2003的1B-4B端口分别连接单片机的P20-P23,端口1C-4C分别接到相对应的电机接口B、C、D、V。
在这里插入图片描述

3.5液晶显示电路设计

我选择了LCD1602液晶显示器。它是一款工业字符型液晶,可以显示两行数据,每行可以显示十六个符号、字母或者数字,刚好可以满足设计的需要。它体积小巧,功耗较低,显示效果良好,是一款非常实用的液晶显示设备。
LCD1602液晶显示在执行程序指令之前要进行模块标志位的忙信号,只有当它的忙标志位为低电平时才表示可以执行指令。

3.6尿液检测电路设计

检测婴儿是否尿床我们主要是通过水位传感器进行采集然后通过LM393比较器进行判断主要特点如下:
(1)工作电源电压范围宽,单电源、双电源均可工作,单电源:2~36V,双电源:±1~±18V;
(2)消耗电流小,Icc=0.8mA;
(3)输入失调电压小,VIO=±2mV;
(4)共模输入电压范围宽,Vic=0~Vcc-1.5V;
(5)输出与TTL,DTL,MOS,CMOS 等兼容;
(6)输出可以用开路集电极连接“或”门;
在这里插入图片描述

4、系统软件设计

4.1 系统主流程图

在这里插入图片描述

4.2按键程序流程图设计

按键电路有四个引脚。其中两两相同。我们在连接电路的时候只需要连接2个引脚就可以了。连接的方式就是上图所示。工作远离其实就是一个对信号的高低电平检测。在我们按键被按下时,单片机引脚的IO口就会检测为低电平。这些IO口电平特性的改变就会程执行相应的功能操作。判断按键是否按下if(K10){while(K10)去抖;mode++;模式切换 if(mode3)数字减 mode=0模式切换; else if(K20){delay_key()延迟;然后while(K20);是否按下模式为加if(mode1) {Max++;到最大 if(Max》=3){Max=1;}。4个按键分别表示加、减、确定和手动放水功能。在不同页面表示不同的功能。分别用3个函数执行不同的操作,注意进行延时操作,防止误差。
在这里插入图片描述

4.3步进电机流程图

控制电动机正反转为本次设计自动翻盖的部分。系统开始工作后,判断电机是否需要正转,若需要就依次给AB、BC、CD、DA通电实现正转,正转结束后延时3m电机开始反转,即依次给AB、AD、CD、CB充电。
在这里插入图片描述

4.4液晶屏幕流程图设计

LCD 1602有16个引脚,其中RS、RW的值控制单片机对它的读写:
LCD1602液晶显示在执行程序指令之前要进行模块标志位的忙信号,只有当它的忙标志位为低电平时才表示可以执行指令。
LCD1602要显示字符时,就要获得该字符的现实的RAM地址。它内部的控制寄存器有11条控制指令,包括清屏,光标移位等指令。

在这里插入图片描述

实物图及PCB

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

部分源码

#include <reg52.h>			 //调用单片机头文件
#include <intrins.h>
#include "lcd1602.h"
#include "StepMotor.h"

#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535

#include "WT588D.h"

//按键引脚定义
sbit KEY1 = P3^5;
sbit KEY2 = P3^6;
sbit KEY3 = P3^7;

sbit ShiDu = P1^0;//湿度传感器
sbit LED = P1^1;
sbit Voice = P1^2;//声音传感器

bit openFlag = 0;//电机开启标志 
bit Mode = 0;//0是自动模式,1是手动模式

uint DJ_TIME = 0;//电机开启时间

/*********************定时器1初始化******************/
void time_init()	  
{
	TMOD |= 0X10;	  
  TH1=0x4c;//50ms
  TL1=0x00; 	
	ET1 = 1;
	TR1 = 1;//开启定时
	EA  = 1;	 	  //开总中断
}

void keyscan()
{
		if(KEY1 == 0)//切换键按下
		{
				delay_ms(10);
				if(KEY1 == 0)
				{
						while(!KEY1);//等待按键松开
						Mode = !Mode;
            if(Mode==0)lcd_write_str(0, 1, "MODE: ZIDONG    ");			
            else lcd_write_str(0, 1, "MODE: SHOUDONG  ");	
            openFlag = 0;					
				}
		}
    if(Mode==1)//手动模式
		{
				if(KEY2 == 0)//手动开关键按下
				{
						delay_ms(10);
						if(KEY2 == 0)
						{
								while(!KEY2);
						
								openFlag = 1;
						}
				}
				if(KEY3 == 0)//手动开关键按下
				{
						delay_ms(10);
						if(KEY3 == 0)
						{
								while(!KEY3);
						
								openFlag = 0;
						}
				}
		}
}

void motoRotate()//电机处理
{
	  static uint djcount=0;
	  static bit flag = 0;

	  if(flag == 0)
		{
			  djcount++;
				if(djcount < 30)
				{
						MotorCW();//正转
				}
				else
				{
						if(djcount < 130)
						{
								MotorStop();//电机停止
						}
						else
						{
								flag = 1;
							  djcount = 130;
						}
				}
		}
    else
		{
			  djcount--;
				if(djcount > 100)
				{
						MotorCCW();//电机反转
				}
				else
				{
					  if(djcount<=0){flag = 0;djcount=0;}
						MotorStop();//电机停止
				}
		}
}

void main()
{
	  uint sy_count1 = 0;
	  uint sy_count2 = 0;
	  uint yuyin = 0;
	  bit flag = 0;
	
		time_init();//定时器初始化
		lcd_init();//1602初始化
		lcd_write_str(0, 0, "STATE: CLOSE    ");
    lcd_write_str(0, 1, "MODE: ZIDONG    ");

		while(1)
		{
			  keyscan();
			  if(Mode == 0)//在自动模式下
				{
						if(Voice == 0)//检测到有声音
						{
								if(sy_count1++ > 10)//检测哭声是否延续
								{
										DJ_TIME = 60;//电机开启时间1分钟
										openFlag = 1;//电机开启
									  sy_count1 = 0;
									  if(ShiDu==0)Line_1A(1);//播报歌曲
								}
						}
						else
						{
								if(sy_count2++ > 200)
								{
										sy_count2 = 0;
									  sy_count1 = 0;
								}
						}
				}
        if(ShiDu==1)//检测到尿不湿湿了
				{
						LED = 0;
					  if(flag == 0)//只播报一次
						{
								flag = 1;
							  Line_1A(0);//播报
							  yuyin = 0;
						}
						if(flag==1)
						{
								if(yuyin++ > 400)
								{
										yuyin = 0;
									  Line_1A(0);//播报
								}
						}
				}
				else
				{
						LED = 1;flag = 0;
				}
			  if(openFlag==1)//电机开启
				{
					  lcd_write_str(0, 0, "STATE: OPEN ");
						motoRotate(); 
				}else 
				{
					  lcd_write_str(0, 0, "STATE: CLOSE");
						MotorStop();//电机关闭
				}
			  
			  delay_ms(1);
		}
}


void zd1() interrupt 3
{
	  static uchar cnt1=0;
		TH1=0x4c;//50ms
		TL1=0x00; 
	
		if(cnt1++ >= 20)//1s
		{
				cnt1 = 0;
        if(DJ_TIME > 0)
				{
						DJ_TIME--;
				}
				else
				{
						if(Mode == 0)openFlag=0;
				}
		}
}


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

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

相关文章

Springboot项目快速实现过滤器功能

前言很多时候&#xff0c;当你以为掌握了事实真相的时间&#xff0c;如果你能再深入一点&#xff0c;你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP&#xff0c;AOP的主要作用就是可以定义切入点&#xff0c;并在切入点纵向织入一些额外的统一操作&#xff0…

尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】尚硅谷大数据技术Spark教程-笔记02【SparkCore(核心编程、案例实操)】尚硅谷大数据技术Spark教程-笔记03【SparkSQL…

Scala之面向对象(2)

目录 单例对象&#xff08;伴生对象&#xff09;&#xff1a; 创建对象常用的两种方法&#xff1a; &#xff08;1&#xff09;使用构造器构造&#xff08;new&#xff09; &#xff08;2&#xff09;使用静态方法 伴生对象的定义&#xff1a; apply方法&#xff1a; app…

图像分割技术及经典实例分割网络Mask R-CNN(含基于Keras Python源码定义)

图像分割技术及经典实例分割网络Mask R-CNN&#xff08;含Python源码定义&#xff09; 文章目录图像分割技术及经典实例分割网络Mask R-CNN&#xff08;含Python源码定义&#xff09;1. 图像分割技术概述2. FCN与语义分割2.1 FCN简介2.2 反卷积2.2 FCN与语义分割的关系3. Mask …

Midjourney以图生图的详细教程(含6种案例介绍)

&#x1f3c6; 文章目标&#xff1a;学习并介绍Midjourney以图生图的详细教程 &#x1f340; Midjourney以图生图的详细教程 ✅ 创作者&#xff1a;熊猫Jay &#x1f389; 个人主页&#xff1a;Jay的个人主页 &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c…

SQL Server 单表数据查询

提示&#xff1a; 本篇文章详细介绍怎样向SQLServer中导入表格数据,导入之后根据不同的查询条件完成查询任务. 文章目录前言一、向SQL Server中导入数据二、例题1.查询所有学生的全部信息2.查询学生的学号和姓名3.查询所有学生的姓名和出生年4. 查询所有学生的姓名和出生年&…

【关于Linux中----生产消费模型】

文章目录一、生产消费模型1.1概念的引入1.2 321原则二、条件变量2.1概念的引入2.2理解条件变量2.3条件变量的使用三、基于BlockingQueue的生产者消费者模型3.1BlockingQueue的介绍3.2C queue模拟阻塞队列的生产消费模型3.3对生产消费任务的模拟封装四、遗留问题一、生产消费模型…

基于YOLOv5的水下海洋目标检测

摘要&#xff1a;水下海洋目标检测技术具有广泛的应用前景&#xff0c;可以用于海洋环境监测、海洋资源开发、海洋生物学研究等领域。本文提出了一种基于 YOLOv5 的水下海洋目标检测方法&#xff0c;使用数据增强方法进行了大量实验&#xff0c;并与其他方法进行了对比&#xf…

(SQL学习随笔3)SQL语法——SELECT语句

导航基本认识FROM关键字LIMIT与OFFSETORDER BYWHERE条件查询单值比较多条件组合范围筛选空值匹配LIKE通配条件分组运算符和函数数据变换分组运算表连接内连接左(右)外连接全外连接外键约束窗口函数UNION&#xff1a;表上下拼接子查询条件判断PostgreSQLMySQL基本认识 SELECT t…

【论文阅读】BiSeNet V2用于实时语义分割的双边网络

前言BiSeNet V2延续了v1版本的双边结构&#xff0c;分别处理空间细节信息、高层语义信息。同时设计更简洁高效的结构&#xff0c;进行特征提取&#xff0c;实现高精度和高速度。在训练模型时&#xff0c;使用了增强训练策略 &#xff0c;添加多个辅助训练分支来促进不同浅层网络…

Spring-aop面向切面

1、理解必要的专业术语 先看看上面图&#xff0c;这是我的个人理解。(画的丑&#xff0c;主打真实) 1&#xff09;Advice&#xff0c;通知/增强&#xff1a;类方法中提出来的共性功能(大白话就是提出来的重复代码) 2&#xff09;Pointcut&#xff0c;切入点/切点&#…

【微服务】微服务架构下你不得不知的3种部署策略

文章目录前言滚动部署蓝绿部署金丝雀部署总结前言 不知道大家有了解过你们公司的软件产品是如何部署的么&#xff1f;采用的什么部署策略&#xff1f;其实在软件开发生命周期中&#xff0c;部署是非常关键的一环&#xff0c;你需要考虑多方面的因素&#xff0c;如何保证你部署…

【推荐算法】CTR中embedding层的学习和训练

note 连续特征处理&#xff1a;facebook DLRM模型&#xff0c;对连续值的处理方式是把所有的连续值输入到一个神经网络&#xff0c;然后通过神经网络把它压缩到一个embedding维度大小的一个向量上&#xff0c;然后将Embedding和其他离散特征Embedding Concat起来&#xff0c;再…

springboot-分页功能

1.分页功能的作用 分页功能作为各类网站和系统不可或缺的部分&#xff08;例如百度搜索结果的分页等&#xff09; &#xff0c;当一个页面数据量大的时候分页作用就体现出来的&#xff0c;其作用有以下5个。 &#xff08;1&#xff09;减少系统资源的消耗 &#xff08;2&#…

redis设计与实现读书笔记

这里主要记录一下在阅读redis设计与实现中碰到的一些没有记录过的知识。 引用计数技术 Redis的对象系统实现了基于引用计数技术的内存回收机制&#xff0c;当程序不再使用某个对象的时候&#xff0c;这个对象所占用的内存就会被自动释放;另外&#xff0c;Redis还通过引用计数…

低调且强大--iVX低代码平台

iVX目录前言一、低代码那么多 为什么选择iVX&#xff1f;二、“拼”出来的低代码平台&#xff0c;真的好用吗&#xff1f;三、iVX与其他低代码有啥可比性&#xff1f;前言 首先我们应该明白自动编程突破可能是&#xff1a;领域内Mini LLM 现在的思路都是搞LLM&#xff0c;几乎像…

通俗举例讲解动态链接、静态链接

参考动态链接 - 知乎 加上我自己的理解&#xff0c;比较好懂&#xff0c;但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块&#xff0c;从某种意义上来讲大大促进了程序开发的效率&#xf…

NPC 也有了生命?当 ChatGPT 注入游戏你能想象吗

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录引言&#xff1a;西部世界元宇宙&#xff0c;还记得吗ChatGPT 的世界&#xff1f;下图就是一个 ChatGPT 小镇&#xff1a; 引言&#xff1a;西部世界 《西部世界》以一个虚构的游戏般的“西部世界”为背景&am…

springboot验证码生成及验证功能

1.easy-captcha工具包 生成验证码的方式有许多种&#xff0c;这里选择的是easy-captcha工具包。 github开原地址为&#xff1a;easy-captcha工具包 其支持Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目。 2添加依赖 首先需…

SQL Server的死锁说明

死锁指南一、了解死锁二、检测并结束死锁2.1、可能死锁的资源三、处理死锁四、最大限度地减少死锁4.1、以相同的顺序访问对象4.2、避免事务中的用户交互4.3、保持交易简短且在一个批次中4.4、使用较低的隔离级别4.5、使用基于行版本控制的隔离级别4.6、使用绑定连接4.7、停止事…