【Proteus仿真】【51单片机】智能语音家居陪护机器人

news2024/11/16 3:25:13

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用OLED液晶、按键、蜂鸣器、DS18B20温度传感器、人体红外传感器、语音识别模块、继电器、风扇、LED等。
主要功能:
系统运行后,OLED显示动画效果,一段时间后静止。当到达指定时间时开启闹钟,系统需感应到有人后,此时可通过K4键或语音关闭闹铃。
系统感应到有人后,OLED显示测量的人体体温、时间、LED和风扇的开关状态;此时可通过语音开关LED和风扇;可通过按键K3进入闹钟设置界面,通过K3键切换不同时间位置,K1和K2键加减调节,设置后按下K4键保存并退出,返回测温和时钟显示界面。
语音识别指令(十六进制数):
开灯–>0X01
关灯–>0X02
开风扇–>0X11
关风扇–>0X12
关闹铃–>0X22


二、软件设计

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

*/

//系统数据参数显示界面
void sys_parm_show(void)
{
	OLED_Clear();
	//温度:
	OLED_ShowCHinese(0,0,0);
	OLED_ShowCHinese(1*16,0,1);
	OLED_ShowCHinese(2*16,0,5);
	//时间:
	OLED_ShowCHinese(0,2,2);
	OLED_ShowCHinese(1*16,2,3);
	OLED_ShowCHinese(2*16,2,5);
	//灯:
	OLED_ShowCHinese(0,4,4);
	OLED_ShowCHinese(1*16,4,5);
	OLED_ShowString(2*16,4,"   ",16);
	//风扇:
	OLED_ShowCHinese(3*16+8*1,4,16);
	OLED_ShowCHinese(4*16+8*1,4,17);
	OLED_ShowCHinese(5*16+8*1,4,5);
	OLED_ShowString(6*16+8*1,4,"   ",16);
}


//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;
	//有人的时候
	if(sys_ctrl.window==1)
	{
		key=key_scan(0);
		//语音识别
		if(UART_RX_BUF[0]==LED_ON_CMD)//开灯
		{
			UART_RX_BUF[0]=0;
			LED=0;
			sys_ctrl.led=1;	
		}
		else if(UART_RX_BUF[0]==LED_OFF_CMD)//关灯
		{
			UART_RX_BUF[0]=0;
			LED=1;
			sys_ctrl.led=0;	
		}
		else if(UART_RX_BUF[0]==MOTOR_ON_CMD)//开风扇
		{
			UART_RX_BUF[0]=0;
			MOTOR=0;
			sys_ctrl.motor=1;	
		}
		else if(UART_RX_BUF[0]==MOTOR_OFF_CMD)//关风扇
		{
			UART_RX_BUF[0]=0;
			MOTOR=1;
			sys_ctrl.motor=0;
		}
		else if(UART_RX_BUF[0]==ALARM_OFF_CMD)//关闹铃
		{
			UART_RX_BUF[0]=0;
			sys_ctrl.alarm=0;
			OLED_ShowString(0,6,"        ",16);
		}	
	}	
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>9)sys_ctrl.mode=1;	
		if(oneflag==0)//时间设置界面仅显示1次
		{
			oneflag=1;
			sys_time_set_show();//系统时间设置界面显示	
		}
	}
	//在设置模式下,加
	else if(key==KEY1_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://吃药-时
				sys_ctrl.stime[0][0]++;
				if(sys_ctrl.stime[0][0]>23)sys_ctrl.stime[0][0]=0; 
				break;
			case 2://吃药-分
				sys_ctrl.stime[0][1]++;
				if(sys_ctrl.stime[0][1]>59)sys_ctrl.stime[0][1]=0; 
				break;
			case 3://吃药-秒
				sys_ctrl.stime[0][2]++;
				if(sys_ctrl.stime[0][2]>59)sys_ctrl.stime[0][2]=0; 
				break;
			case 4://运动-时
				sys_ctrl.stime[1][0]++;
				if(sys_ctrl.stime[1][0]>24)sys_ctrl.stime[1][0]=0; 
				break;
			case 5://运动-分
				sys_ctrl.stime[1][1]++;
				if(sys_ctrl.stime[1][1]>59)sys_ctrl.stime[1][1]=0; 
				break;
			case 6://运动-秒
				sys_ctrl.stime[1][2]++;
				if(sys_ctrl.stime[1][2]>59)sys_ctrl.stime[1][2]=0; 
				break;
			case 7://休息-时
				sys_ctrl.stime[2][0]++;
				if(sys_ctrl.stime[2][0]>24)sys_ctrl.stime[2][0]=0; 
				break;
			case 8://休息-分
				sys_ctrl.stime[2][1]++;
				if(sys_ctrl.stime[2][1]>59)sys_ctrl.stime[2][1]=0; 
				break;
			case 9://休息-秒
				sys_ctrl.stime[2][2]++;
				if(sys_ctrl.stime[2][2]>59)sys_ctrl.stime[2][2]=0; 
				break;		
		}		
	}
	//在设置模式下,减
	else if(key==KEY2_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://吃药-时
				sys_ctrl.stime[0][0]--;
				if(sys_ctrl.stime[0][0]<0)sys_ctrl.stime[0][0]=23; 
				break;
			case 2://吃药-分
				sys_ctrl.stime[0][1]--;
				if(sys_ctrl.stime[0][1]<0)sys_ctrl.stime[0][1]=59; 
				break;
			case 3://吃药-秒
				sys_ctrl.stime[0][2]--;
				if(sys_ctrl.stime[0][2]<0)sys_ctrl.stime[0][2]=59; 
				break;
			case 4://运动-时
				sys_ctrl.stime[1][0]--;
				if(sys_ctrl.stime[1][0]<0)sys_ctrl.stime[1][0]=23; 
				break;
			case 5://运动-分
				sys_ctrl.stime[1][1]--;
				if(sys_ctrl.stime[1][1]<0)sys_ctrl.stime[1][1]=59; 
				break;
			case 6://运动-秒
				sys_ctrl.stime[1][2]--;
				if(sys_ctrl.stime[1][2]<0)sys_ctrl.stime[1][2]=59; 
				break;
			case 7://休息-时
				sys_ctrl.stime[2][0]--;
				if(sys_ctrl.stime[2][0]<0)sys_ctrl.stime[2][0]=23; 
				break;
			case 8://休息-分
				sys_ctrl.stime[2][1]--;
				if(sys_ctrl.stime[2][1]<0)sys_ctrl.stime[2][1]=59; 
				break;
			case 9://休息-秒
				sys_ctrl.stime[2][2]--;
				if(sys_ctrl.stime[2][2]<0)sys_ctrl.stime[2][2]=59; 
				break;		
		}	
	}
	//确定
	else if(key==KEY4_PRESS)
	{	
		if(oneflag==1)
		{
			sys_ctrl.mode=0;
			oneflag=0;
			sys_parm_show();//系统数据参数显示界面	
		}
		//闹铃
		if(sys_ctrl.alarm==1)
		{
			sys_ctrl.alarm=0;
			OLED_ShowString(0,6,"        ",16);	
		}	
	}
}


//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	OLED_Init();
	ds18b20_init();
	UART_Init();//串口初始化9600
	UART_SendString("UART Init OK...\r\n");
	//读取温度数据,等待稳定
	while(i--)
	{
		sys_ctrl.temp=ds18b20_read_temperture()*10;
		delay_ms(100);	
	}
	sys_open_show();//系统开机界面显示
	time0_init();//定时器初始化
	TR0=1;//开启定时器

	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}




三、实验现象

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

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


联系作者

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

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

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

相关文章

Kafka生产者使用案例

1.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程&#xff1a; 1)Kafka 会将发送消息包装为 ProducerRecord 对象&#xff0c; ProducerRecord 对象包含了目标主题和要发送的内容&#xff0c;同时还可以指定键和分区。在发送 ProducerRecord 对象前&#xff0c…

FPGA面试题(7)

一.解释一下SPI的四种模式 01时钟极性CPOL空闲状态为低电平空闲状态为高电平时钟相位CPHA在第一个跳变沿采样在第二个跳变沿采样 模式CPOLCPHA描述模式000sclk上升沿采样&#xff0c;sclk下降沿发送模式101sclk上升沿发送&#xff0c;sclk下降沿采样模式210sclk上升沿发送&…

解决nav2_bringup tb3_simulation_launch.py 无法启动Gazebo的问题

方法 1 断网再开gazebo. 评价: 方便且有效, 但来回联网很麻烦 参考: https://blog.csdn.net/James___H/article/details/116906217 方法 2 断网能打开是因为gazebo软件开启时会自动从网络下载模型&#xff0c;下载过程必然漫长, 另外你懂的, 网络问题嘛, vpn也解决不了的话…

jmeter压测记录、使用方法

jmeter压测记录、使用方法 1、非gui方式执行压测命令2、压测命令输出解读 1、非gui方式执行压测命令 sh jmeter.sh -n -t test.jmx -l result.jtl2、压测命令输出解读 Active: 10 Started: 10 Finished: 0 Active: 10 表示一共10个活动&#xff08;正在进行的压测线程&#…

基于Cl2/BCl3电感偶联等离子体的氮化镓干蚀特性

引言 氮化镓(GaN)具有六方纤锌矿结构&#xff0c;直接带隙约为3.4eV&#xff0c;目前已成为实现蓝光发光二极管(led)的主导材料。由于GaN的高化学稳定性&#xff0c;在室温下用湿法化学蚀刻来蚀刻或图案化GaN是非常困难的。与湿法蚀刻技术相比&#xff0c;干法蚀刻技术可以提供…

前端axios下载导出文件工具封装

使用示例&#xff1a; import { fileDownload } from /utils/fileDownloadfileDownload({ url: process.env.VUE_APP_BASE_URL /statistic/pageList/export, method: post, data: data })工具类&#xff1a; import store from ../store/index import {getAccessToken } fro…

【Lombok的Bug记录】前端传的有值,但是到后端就全为空了

项目场景&#xff1a; 项目背景&#xff1a;使用Data注解标注类 问题描述 前端传的有值&#xff0c;但是到后端就全为空了 原因分析&#xff1a; AName和aName生成的set方法名是一样的&#xff0c;所以换名字就行了&#xff01; 解决方案&#xff1a; 属性不要写成xXxx的形式…

为什么手机会莫名多出许多软件?

许多手机用户都曾遭遇过这样的问题&#xff0c;他们在使用手机的过程中&#xff0c;突然发现手机屏幕上出现了一些未知的软件。这些软件并非他们主动下载的&#xff0c;但它们却显现在屏幕上。这些软件从何而来&#xff1f; 其实&#xff0c;这些软件往往是在浏览网页、阅读小…

spring 注入 当有两个参数的时候 接上面

新加一个int 型的 age 记得写getset方法和构造方法 &#xff08;&#xff08;&#xff08;&#xff08;&#xff08;&#xff08;&#xff08; 构造方法的作用——无论是有参构造还是无参构造&#xff0c;他的作用都是为了方便为对象的属性初始化值 构造方法是一种特殊的方…

UnrealEngine iOS 打包 —— 签名证书(cer、p12)生成

官方文档 docs.unrealengine.com/5.3/zh-CN/setting-up-ios-tvos-and-ipados-provisioning-profiles-and-signing-certificates-for-unreal-engine-projects 打开 ProjectSettings -> Platforms -> iOS 可以看到签名证书配置 需要拓展名为 .cer 和 .p12 的一对证书和密钥…

虹科方案 | AR助力仓储物流突破困境:规模化运营与成本节约

文章来源&#xff1a;虹科数字化AR 点击阅读原文&#xff1a;https://mp.weixin.qq.com/s/xis_I5orLb6RjgSokEhEOA 虹科方案一览 HongKe DigitalizationAR 当今的客户体验要求企业在人员、流程和产品之间实现全面的连接。为了提升整个组织的效率并提高盈利能力&#xff0c;物流…

Vscode 插件-代码敲出不同的特效

为了让写代码的时候增加一点趣味性&#xff0c;vscode有个插件&#xff0c;可以增加烟花特效&#xff0c;还挺好玩的。 一.在应用商店下载这个插件 二. 在设置里 添加配置文件 settings.json //是否开启"powermode.enabled": true,//效果样式 “水花-particles”,…

虹科方案 | 虹科ATTO加速虚拟存储管理

虹科方案 | 虹科ATTO加速虚拟存储管理 文章来源&#xff1a;虹科网络安全 点此阅读原文&#xff1a;https://mp.weixin.qq.com/s/SYruurSQSodUvyhZBr-BMQ 1 方案背景 企业越来越多地转向服务器虚拟化&#xff0c;以有效利用硬件资源、降低运营成本&#xff0c;并为维护和灾难恢…

WPF中的多重绑定

MultiBinding 将会给后端传回一个数组, 其顺序为绑定的顺序. 例如: <DataGridMargin"10"AutoGenerateColumns"False"ItemsSource"{Binding Stu}"><DataGrid.Columns><DataGridTextColumn Binding"{Binding Id}" Header…

求二叉树叶子节点的个数——递归

节点时NULL——》返回0 节点是叶子——》返回1 节点不是空也不是叶子&#xff1a;递归 代码&#xff1a; int BinaryTreeLeafSize(BTNode* root) {if (root NULL){return 0;}if (root->left NULL && root->right NULL){return 1;} return BinaryTreeLeafSiz…

如何有效改进erp管理系统?erp管理系统改进建议方向

前言&#xff1a; 说到erp&#xff0c;全称是企业资源计划&#xff0c;这可是企业管理的大杀器&#xff0c;也是现在企业管理的必备神器。它的出身可以追溯到上世纪90年代&#xff0c;那时候的企业管理可是个大难题&#xff0c;各种资源调配不灵光&#xff0c;企业主们急需一种…

快速构建代理应对

今天我要和大家分享一个解决反爬策略升级问题的方法&#xff0c;那就是快速构建代理池。如果您是一位爬虫开发人员&#xff0c;一定深知反爬策略的烦恼。但是&#xff0c;通过构建代理池&#xff0c;您可以轻松地应对反爬策略的升级&#xff0c;让您的爬虫持续高效运行。接下来…

vite vite.config.js中的配置

vite打包依赖于 rollup和esbuild rollup中文文档 esbulid中文文档 基本配置 import { defineConfig, loadEnv } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";import Components from "unplugin-vue-com…

pycharm的debug,你知道每个按钮对应哪个功能吗?

本文讲解pycharm的debug 1. debug的汇总图2. 第一个图标&#xff08;Step Over&#xff09;3. 第二个图标&#xff08;Step into&#xff09;4. 第三个图标&#xff08;Step Into My Code&#xff09;5. 第四个图标&#xff08;Step Out&#xff09;6. 第五个图标&#xff08;R…

02 stm32-hal库 timer 基本定时器设定

1.配置始终时钟参数 >2. 初始化 MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3);> 3.增加回调函数 4 中断服务函数 void TIM3_IRQHandler(void) {/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&…