STC89C51基础及项目第15天:小车测速、添加语言识别控制

2023-10-12 23:52

本文主要是介绍STC89C51基础及项目第15天:小车测速、添加语言识别控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 小车测速的原理(281.126)

测速模块

在这里插入图片描述

  • 用途:
    • 广泛用于电机转速检测,脉冲计数,位置限位等。
  • 逻辑:
    • 有遮挡,输出高电平;无遮挡,输出低电平
  • 接线
    • VCC 接电源正极 3.3 - 5V
    • GND 接电源负极
    • DO TTL开关信号输出
    • AO 此模块不起作用

测试原理和单位换算

  • 轮子走一圈经过一个周长,C = 2 x 3.14 x 半径 = 3.14 x 直径(6.5cm)
  • 对应的码盘也转了一圈。码盘有20个格子,每经过一个格子,会遮挡(高电平)和不遮挡(低电平)
  • 那么一个脉冲就是走了 3.14 x 6.5 cm /20 = 1.0205cm
  • 定时器可以设计成一秒,统计一秒内的脉冲数,一个脉冲就是 1cm
  • 假设一秒有 80 脉冲,那么就是 80cm/s

2. 小车测速代码实现(282.127)

  • 代码(20./11. 测速数据通过串口发送到上位机01)
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"sbit speedIO = P3^2;		   //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal;			   //主程序1s后可以发速度数据的信号void Ex0Init(){EX0 = 1;//允许中断//EA = 1;在串口初始化函数中已经打开了总中断IT0 = 1;//外部中断的下降沿触发
}void main(){Timer0Init();UartInit();//串口相关初始化Ex0Init(); //外部中断初始化while(1){if(signal){//定时器1s到点,把signal置一,主程序发送速度SendString("speed:");SendByte(speed);//速度发出去//用sendByte不合理signal = 0;//清0}}
}void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数speedCnt++;//码盘转动了一个格子
}
  • SendByte(speed) 并不合理,应该这么做:
    在这里插入图片描述

3. 小车测速代码验证和BUG修改(283.128)

  • 代码(20./11. 测速数据通过串口发送到上位机02)
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"sbit speedIO = P3^2;		   //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal;			   //主程序发速度数据的信号
char speedMes[24];  			 //主程序发速度数据的字符串缓冲区void Ex0Init(){EX0 = 1;//允许中断//EA = 1;在串口初始化函数中已经打开了总中断IT0 = 1;//外部中断的下降沿触发
}void main(){Timer0Init();UartInit();//串口相关初始化Ex0Init(); //外部中断初始化while(1){if(signal){//定时器1s到点,把signal置一,主程序发送速度sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区SendString(speedMes);//速度发出去signal = 0;//清0}}
}void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数speedCnt++;//码盘转动了一个格子
}

4. OLED二次开发为了显速度(284.129)

  • 代码(20./12. OLED代码二次开发)
#include "reg52.h"
#include "intrins.h"
#include "OLED.h"void main(){Oled_Init();Oled_Clear();Oled_Show_Str(2,2,"speed:35cm/s");while(1);//不让程序结束
}

5. 蓝乐控制且OLED和蓝牙显示速度(285.130)

  • 代码(20./13. 蓝牙测速并本地显示的小车)
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"
#include "OLED.h"sbit speedIO = P3^2;		   //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal;			   //主程序发速度数据的信号
char speedMes[24];  			 //主程序发速度数据的字符串缓冲区void Ex0Init(){EX0 = 1;//允许中断//EA = 1;在串口初始化函数中已经打开了总中断IT0 = 1;//外部中断的下降沿触发
}void main(){Timer0Init();UartInit();//串口相关初始化Ex0Init(); //外部中断初始化Oled_Init();Oled_Clear();while(1){if(signal){//定时器1s到点,把signal置一,主程序发送速度sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区SendString(speedMes);//速度发出去signal = 0;//清0Oled_Show_Str(2,2,speedMes);}}
}void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数speedCnt++;//码盘转动了一个格子
}

6. wifi控制小车并发送速度(286.131)

  • 代码(20./14. wifi测速并本地显示的小车)
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"
#include "OLED.h"
#include "esp8266.h"sbit speedIO = P3^2;		   //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal;			   //主程序发速度数据的信号
char speedMes[24];  			 //主程序发速度数据的字符串缓冲区
//4 发送数据
code char sendData [] = "AT+CIPSEND=0,6\r\n";void Ex0Init(){EX0 = 1;//允许中断//EA = 1;在串口初始化函数中已经打开了总中断IT0 = 1;//外部中断的下降沿触发
}void main(){Timer0Init();UartInit();//串口相关初始化Delay1000ms();//给espwifi模块上电时间initWifi_AP();//初始化wifi工作在ap模式waitConnect();//等待客户端的连接Ex0Init();    //外部中断初始化Oled_Init();  //oled初始化Oled_Clear(); //OLED清屏while(1){if(signal){//定时器1s到点,把signal置一,主程序发送速度		SendString(sendData);//4 发送数据Delay1000ms();sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区SendString(speedMes);//速度发出去signal = 0;//清0Oled_Show_Str(2,2,speedMes);}}
}void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数speedCnt++;//码盘转动了一个格子
}

7. 4g模块控制小车(287.132)

  • 代码不做修改,直接复制蓝牙测速小车
  • 4g 模块只要做好内网穿透外网透传就可以了
  • 代码(20./15. 4g模块控制小车)

8. 非特定语音识别方案介绍(~.133)

  • SU-03T(还有 LD3320)
  • 购买地址:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.4c9d2e8d7NyISY&id=660663988887&_u=nbdq6ut5ec8
    在这里插入图片描述
  • 此语音模块不需编程,不需二次开发:通过厂家给的网站配置后即可使用,傻瓜式操作
  • 想要稍微开发点语音相关代码,LD3320 模块需要二次开发,根据厂家给的源码并二次开发添加识别词条

9. SU-03T语音模块的配置使用(~.134)

  • 非特定人语音识别特征提取算法的研究
    • https://xueshu.baidu.com/usercenter/paper/show?paperid=1c530gm02v7400n0er5g08m07n159657
  1. 进入官网,注册并登陆

    • http://www.smartpi.cn/#/
  2. 创建产品

    • 其他产品、纯离线方案、SU-03T、名称、中文、下一步
      在这里插入图片描述
  3. Pin脚配置

    • A25-A27 改为默认高电平
      在这里插入图片描述
  4. 唤醒词自定义和唤醒回复配置
    在这里插入图片描述

  5. 命令词自定义
    1)“基础信息”配置
    在这里插入图片描述
    在这里插入图片描述

    2)“控制详情”配置:添加控制
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3)“识别灵敏度”配置:中
在这里插入图片描述
6. 发音人配置
在这里插入图片描述
7. 其他配置
在这里插入图片描述
8. 发布版本
在这里插入图片描述
9. 半小时左右后下载sdk固件
在这里插入图片描述
在这里插入图片描述

10. SU-03T固件烧录并语音识别测试(288.135)

  • 提前做 语言模块和 ttl 的接线:
    • B7 引脚 接 串口工具 RXD
    • B6 引脚 接 串口工具 TXD
    • GND 接 串口工具 GND
    • VCC 接 串口工具 5V
  1. 将上节课生成的文件解压
    在这里插入图片描述
  2. 将解压后的文件夹放至非中文路径下、以管理员身份打开 “UniOneUpdateTool.exe” 文件
    在这里插入图片描述
  3. 将 usb-ttl 插入电脑接口
    在这里插入图片描述
  4. 打开软件,选择镜像文件 “uni_app_release_update.bin”
    在这里插入图片描述
  5. 下电至 OFF
    在这里插入图片描述
  6. 点“烧录”
    在这里插入图片描述
  7. 上电至 ON
    在这里插入图片描述
  8. 开始烧录
    在这里插入图片描述
  9. 下载完成,烧录结束
    在这里插入图片描述
  10. 即可进行语音测试

11. 语音识别切换小车循迹避障跟随且OLED显示状态(289.136)

  • 代码(20./16. 语音识别切换小车寻迹避障跟随并oled显示)
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"
#include "OLED.h"#define MIDDLE 0
#define LEFT 1
#define RIGHT 2#define XJ 3
#define GS 4
#define BZ 5
#define ST 6sbit A25 = P1^5;
sbit A26 = P1^6;
sbit A27 = P1^7;sbit leftSensorXJ = P2^7;
sbit rightSensorXJ = P2^6;sbit leftSensorGS = P2^5;
sbit rightSensorGS = P2^4;char dir;
double disMiddle;
double disLeft;
double disRight;void xunjiMode(){if(leftSensorXJ == 0 && rightSensorXJ == 0){//左右都反射回来,都低电平,直走,灯都亮goForward();}if(leftSensorXJ == 1 && rightSensorXJ == 0){//左边没反射回来,左高电平,左转,右灯亮goLeft();}	if(leftSensorXJ == 0 && rightSensorXJ == 1){//右边没反射回来,右高电平,右转,左灯亮goRight();}if(leftSensorXJ == 1 && rightSensorXJ == 1){//左右都没反射回来,都高电平,停,灯都不亮stop();}
}void gensuiMode(){if(leftSensorGS == 0 && rightSensorGS == 0){//两边都反射回来了,都低电平,直走goForward();}if(leftSensorGS == 1 && rightSensorGS == 0){//右边反射回来了,右低电平,右转goRight();}if(leftSensorGS == 0 && rightSensorGS == 1){//左边反射回来了,左低电平,左转goLeft();}if(leftSensorGS == 1 && rightSensorGS == 1){//两边都没反射回来,都高电平,停stop();}
}void bizhangMode(){if(dir != MIDDLE){sgMiddle();dir = MIDDLE;Delay300ms();}disMiddle = getDistance();if(disMiddle > 35){//前进goForward();}else if(disMiddle < 10){goBack();}else{//停止stop();//sg左转 测左边距离sgLeft();Delay300ms();disLeft = getDistance();sgMiddle();Delay300ms();//sg右转 测右边距离sgRight();dir = RIGHT;Delay300ms();disRight = getDistance();if(disLeft < disRight){goRight();Delay150ms();stop();}if(disLeft > disRight){goLeft();Delay150ms();stop();}}
}void main(){int mark = 0;Timer0Init();//定时器0初始化(为舵机)Timer1Init();//定时器1初始化(为超声波测距)sgMiddle();  //舵机初始化位置(避障)Delay2000ms();dir = MIDDLE;Oled_Init(); //OLED初始化Oled_Clear();Oled_Show_Str(2,2,"-----Ready----");while(1){//满足寻迹模式的条件if(A25 == 0 && A26 == 1 && A27 == 1){if(mark != XJ){Oled_Clear();Oled_Show_Str(2,2,"-----XunJi----");}mark = XJ;xunjiMode();}//满足跟随模式的条件if(A25 == 1 && A26 == 0 && A27 == 1){if(mark != GS){Oled_Clear();Oled_Show_Str(2,2,"-----GenSui----");}mark = GS;gensuiMode();}//满足避障模式的条件if(A25 == 1 && A26 == 1 && A27 == 0){if(mark != BZ){Oled_Clear();Oled_Show_Str(2,2,"-----BiZhang----");mark = BZ;bizhangMode();}}//满足stop的条件if(A25 == 0 && A26 == 0 && A27 == 0){if(mark != ST){Oled_Clear();Oled_Show_Str(2,2,"-----STOP----");mark = ST;stop();}}}
}

12. 效果演示(290.137)

这篇关于STC89C51基础及项目第15天:小车测速、添加语言识别控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/199326

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧