基于单片机的智能拐杖软件设计

news2024/11/26 12:15:06

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式

文章目录

    • 概要
  • 一、整体设计方案
    • 2.1本设计设计原理
    • 2.1.1单片机基本介绍
  • 二、本设计方案选择
  • 三、软件设计
    • AD原理图:
    • 原理图
    • 程序
  • 四、结论
  • 五、 文章目录

概要

  导盲设备的研发一直是各国科研的一个重点,不仅是因为它有重大的社会意义,还因为它对于机器人视觉等多个研究领域有着不小的研究意义,能够给人类提供道路信息的导盲设备,在自动化机器人上也能起到同样的效果。有许多研究已经有了成功的案例。
本设计采用STC89C51单片机作为主控板,HC-SR04超声测距传感器作为探测装置,达到导盲的效果。这款仪器结构简单,功能可靠,它可以对前方的障碍物进行探测,在达到预设范围时蜂鸣器会提醒使用者小心障碍物,从而达到智能导盲的效果。
关键词:STC89C51单片机 HC-SR04超声测距传感器 智能拐杖

一、整体设计方案

2.1本设计设计原理

2.1.1单片机基本介绍

主控板- ST STC89C51系列是由STC公司制造的STC89C51兼容的8位微控制器(μC)系列。
基于8051内核,由于其行业标准指令集,低单位成本以及DIL(DIP)封装中的这些芯片的可用性,因此AT89系列仍然非常受欢迎。这允许在新应用程序中重新使用大量的旧代码而不进行修改。虽然比较新的AT90系列AVR RISC微控制器的功能较弱,但AT89系列的新产品开发继续为上述优点。
虽然英特尔不再生产8051核心控制器或其衍生产品,但众多供应商制造的增强型二进制兼容衍生产品仍然受欢迎,如STC的STC89C51及其衍生产品,恩智浦P89v51及其衍生产品等。一些衍生产品集成了数字信号处理器(DSP)。 除了这些物理设备,几家公司还提供MCS-51衍生产品作为FPGA核心,用于FPGA或ASIC设计。

在这里插入图片描述

2.1.2引脚功能介绍

图2.1 AT89C51引脚图
(1)4 KB芯片程序存储器。
(2)128字节片上数据存储器(RAM)。
(3)32个字节专用于注册库。
(4)16位可位寻址存储器。
(5)80字节的通用存储器。
(6)4组并行I/O端口。
(7)128个用户定义的软件标志。
(8)8位数据总线。
(9)16位地址总线。
(10)16位定时器(通常为2,但可能有更多或更少)。
(11)3个内部和2个外部中断。
(12)位和字节可寻址RAM区域为16字节。
(13)四个8位端口(短型号有两个8位端口)。
(14)16位程序计数器和数据指针。
(15)1微秒指令周期,12 MHz晶振。
(16)8051的变体还可以有一些特殊的特定模型,如UART,ADC,Op_Amps等,使其成为更强大的微控制器。
这个芯片一共有四十个引脚,并且引脚的排列顺序为靠进芯片的缺口的左边那一列引脚逆时针开始数起,依次为1、2、3、……40,其中芯片的1脚顶上有个凹起的点。在单片机的40个引脚中,电源引脚有2根,外接晶体振荡器引脚有2根,控制引脚有4根以及4组8位可编程I/O引脚有32根。
各个引脚的功能为:VCC(40):电源输入,接+5V电源;GND(20):接地线;XTAL1(19):片内振荡电路的输入端;XTAL2(20):片内振荡电路的输出端;RST/VPP(9):用于将微控制器复位到其初始值;ALE/PROG(30):地址锁存的允许信号;PSEN(29):外部存储器的读选通信号;EA/VPP(31):程序存储器的内外部选通,接高电平从内部程序存储器读指令,接低电平则从外部程序存储器读指令;PO口(39~32):8位双向I/O口线,名称分别为P0.0~P0.7;P1口(1~8):8位准双向I/O口线,名称分别为P1.0~P1.7 ;P2口(21~28):8位准双向I/O口线,名称分别为P2.0~P2.7 ;P3口(10~17):8位准双向I/O口线,名称分别为P3.0~P3.7。

二、本设计方案选择

2.2.1硬件部分
下图是该硬件系统的元器件清单
在这里插入图片描述

图2.4元器件清单

三、软件设计

AD原理图:

在这里插入图片描述

原理图

下图是该硬件部分的原理图,每一个模块所对应的管脚所对应的I/O口都已标注清楚,下面将详细介绍每一个模块的作用。

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

程序

主函数源代码:
#include "main.h"

/*----------------------------------------------*
 * 宏定义                                 *
 *----------------------------------------------*/
#define BEEP_ON                          ( 1 )
#define BEEP_OFF                         ( 0 )

#define BUTTON_NUM_ALARM_INC             ( 0 )
#define BUTTON_NUM_ALARM_DEC             ( 1 )

sbit beep_pin = P2^0;
/*----------------------------------------------*
 * 枚举定义                            *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 结构体定义                              *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 外部函数原型说明                                     *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 内部函数原型说明                                   *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 全局变量                                     *
 *----------------------------------------------*/
time_event_define(key_loop);
button_event_define(key_distance_alarm_inc);
button_event_define(key_distance_alarm_dec);
time_event_define(get_distance);
static uint16_t distance;
static uint8_t display_buf[16];
static uint16_t alarm_distance = 30;
/*----------------------------------------------*
 * 常量定义                                       *
 *----------------------------------------------*/

/*---------------------------------------------------------------------------*/
/**
*@brief 处理按键事件
*
*
*@param key_num:按键编号
*@param button_event:参考 button_event_t
*
*@return static
* 
*
*@note 
*
*/
static void button_response_handle(uint8_t key_num, button_event_t button_event)
{
  switch(key_num){
    case BUTTON_NUM_ALARM_INC:
      if(button_event == BUTTON_PRESS_DOWN){
        INC_LIMIT(alarm_distance, 100);
        sprintf(display_buf, "%ucm  ", alarm_distance);
        lcd1602_display_string(sizeof("Alarm:") - 1, 1, display_buf);
      }
      break;
    case BUTTON_NUM_ALARM_DEC:
      if(button_event == BUTTON_PRESS_DOWN){
        DEC_LIMIT(alarm_distance, 10);
        sprintf(display_buf, "%ucm  ", alarm_distance);
        lcd1602_display_string(sizeof("Alarm:") - 1, 1, display_buf);
      }
      break;
  }
}
/*---------------------------------------------------------------------------*/
/**
*@brief 查询按键是否按下
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
static void key_loop_handle(void)
{
  button_event_scan(key_distance_alarm_inc, BUTTON_NUM_ALARM_INC, get_key_value, button_response_handle);
  button_event_scan(key_distance_alarm_dec, BUTTON_NUM_ALARM_DEC, get_key_value, button_response_handle);
  time_event_start(key_loop);
}
/*---------------------------------------------------------------------------*/
/**
*@brief 获得超声波传感器数据
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
static void get_distance_data(void)
{
  distance = get_ultrasonic_distance();
  printf("distance = %u\r\n", distance);
  time_event_start(get_distance);
}
/*---------------------------------------------------------------------------*/
/**
*@brief 显示查询
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
static void display_loop(void)
{
  static uint16_t distance_bak;

  if(distance_bak != distance){
    distance_bak = distance;
    sprintf(display_buf, "%ucm  ", distance);
    lcd1602_display_string(sizeof("Distance:") - 1, 0, display_buf);
  }
}
/*---------------------------------------------------------------------------*/
/**
*@brief 显示固定字符
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
static void display_fix_string(void)
{
  
  lcd1602_display_string(0, 0, "Distance:");
  lcd1602_display_string(0, 1, "Alarm:");
  sprintf(display_buf, "%ucm  ", alarm_distance);
  lcd1602_display_string(sizeof("Alarm:") - 1, 1, display_buf);
}
/*---------------------------------------------------------------------------*/
/**
*@brief 告警查询
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
static void alarm_loop(void)
{
  if(distance < alarm_distance){
    beep_pin = BEEP_ON;
  }else{
    beep_pin = BEEP_OFF;
  }
}
/*---------------------------------------------------------------------------*/
/**
*@brief 程序入口
*
*
*@param none
*
*@return
* 
*
*@note 程序入口函数main
*
*/
void main(void)
{
  beep_pin = BEEP_OFF;
  uart_init();
  printf("Init...\r\n");
  lcd1602_init();
  ultrasonic_drv_init();
  timer0_mode1_init();
  __enable_irq();
  display_fix_string();
  get_distance_data();
  time_event_start(key_loop);
  while(1){
    time_event_loop(key_loop, key_loop_handle, 20);
    time_event_loop(get_distance, get_distance_data, 1000);
    display_loop();
    alarm_loop();
  }
}

/*---------------------------------------------------------------------------*/
void timer0_irq(void)
{
  ++clock_ticks;
}
/*---------------------------------------------------------------------------*/
/**
*@brief 串口接收中断处理
*
*
*@param ch 串口接收到的字符
*
*@return 
* 
*
*@note 
*
*/
void uart_rx_irq(uint8_t ch)
{
  ch = ch;
    //uart_put_char(ch);
}
/*---------------------------------------------------------------------------*/
/**
*@brief 串口发送中断处理
*
*
*@param none
*
*@return 
* 
*
*@note 
*
*/
void uart_tx_irq(void)
{

}

四、结论

  超声波测距所使用的原理非常简单,即利用超声波收发模块作为传感器,以51系列单片机作为核芯计算机,测定超声波的传播时间来计算出传播距离,然后在显示器(数码管显示器并不是给使用者观看,更多的是给开发者以便利和蜂鸣器上显示出来。实际上本设计所制作的超声导盲系统测定的是从一个“点”到反射面的距离,对于在“线”(例如半空中的钢丝、电线等)以及“点”(例如悬挂的小号霓虹灯)等更小的物体难以进行有效的测量,关于这方面的测定,还需要更复杂的系统来进行检测。

五、 文章目录

目录
1前言 1
1.1研究背景与意义 1
1.2在国内外的发展概况及分析 2
1.2.1导盲杖 2
1.2.2导盲眼镜 3
1.2.3触觉鞋与智能手机 3
1.2.4现状分析 4
1.3本设计应解决的主要问题 6
2本设计 7
2.1本设计设计原理 7
2.1.1单片机基本介绍 7
2.1.2引脚功能介绍 8
2.1.3超声波测距和光学测距的分析对比 9
2.2本设计方案选择 12
2.2.1硬件部分 12
2.2.2Keil软件 15
2.2.3软件程序主要部分及编写思路 16
2.2.4测试数据 20
3.结论 22
4参考文献 24
5谢辞 25
6附录 26

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

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

相关文章

【python基础】python切片—如何理解[-1:],[:-1],[::-1]的用法

文章目录 前言一、基本语法二、切片1.a[i:j]2.a[i:j:k] 总结&#xff1a;[-1] [:-1] [::-1] [n::-1] 前言 在python中&#xff0c;序列是python最基本的数据结构&#xff0c;包括有string&#xff0c;list&#xff0c;tuple等数据类型&#xff0c;切片对序列型对象的一种索引方…

linux傻瓜式安装Java环境及中间件

linux配置Java环境及中间件 1.傻瓜式安装Java1.下载2.追加3.刷新测试 2.傻瓜式安装docker1.docker卸载2.docker安装 3.Docker傻瓜式安装Redis1.傻瓜式安装安装并配置 4.Docker傻瓜式安装RabbitMQ5.Docker傻瓜式安装MySql1.拉取2.配置 6.傻瓜式安装Nacos1.官网下载nacos2.SQL文件…

Java入门篇 之 数组篇

本篇碎碎念&#xff1a;这篇没有碎碎念&#xff0c;嘻嘻&#xff0c;博主个人感觉状态回来了&#xff0c;博主要加油&#xff0c;大家也要加油 今日份励志文案:纵有疾风起&#xff0c;人生不言弃&#xff01; 冲冲冲&#xff01;&#xff01;&#xff01;&#xff01; 目录 一…

Android 13.0 启动app时设置密码锁

1.前言 在13.0的系统产品开发中,对于限制某些app的启动的功能中,在项目中的需求是在点击app启动的时候,根据包名设置密码锁,当输入正确的密码的时候来启动这个app,否则 就不能启动这个app,达到限制使用app的目的,这就需要在app启动的时候,检测app的包名,然后在app启动…

jdbc Preparestatement防止SQL注入的原理

2023-10-28T03:37:11.264132Z 2 Execute select * from users where username liulemon and password \ or \1\ 1\ 可以看到这一行&#xff0c;预编译时&#xff1f;变成了转义字符 useServerPrepStmtstrue加上这句才能预编译

FBM232 P0926GW 一个基于PC的Studio应用程序

FBM232 P0926GW 一个基于PC的Studio应用程序 告别自定义编程&#xff0c;向S88 Builder问好。它可以帮助您轻松地将泵、混合器和阀门等单个批处理设备配置为特定的协调任务&#xff0c;如灌装、加热和混合。 S88 Builder是什么&#xff1f;它包括一个基于PC的Studio应用程序&…

智慧工地管理平台+智慧工地app源码

智慧工地管理平台智慧工地app源码 &#xff08;演示自主知识产权项目应用案例&#xff09; 以施工现场风险预知和联动预控为目标&#xff0c;将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场…

Python实现定时对网站进行签到

文章目录 一、步骤Reference 一、步骤 首先打开我们需要签到的网站&#xff0c;使用Chrome浏览器的F12快捷键&#xff08;或通过鼠标右键菜单“检查”&#xff09;打开浏览器的开发者工具&#xff0c;点击 Network 查看所有加载的请求。 如下方动图所示&#xff0c;这个时候我…

创建Vue实例

我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面&#xff0c;那应该怎么做呢&#xff1f; 核心步骤&#xff08;4步&#xff09;&#xff1a; 准备容器 引包&#xff08;官网&#xff09; — 开发版本/生产版本 创建Vue实例 new Vue() 指定配置项&#xff0c;渲…

Recommender System复习(考试向)

Recommender System Review OverviewCollaborative Filtering基于用户的CF&#xff08;User CF&#xff09;基于物品的CF&#xff08;Item CF&#xff09;Similarity CalculationBias in CF Evaluation of Recommender SystemFactorization MachinesLatent factor modelLFM算法…

不必安装,快速设计数据库表结构

设计数据库架构是一项具有挑战性的任务&#xff0c;当您的应用程序不断变大时&#xff0c;它变得更加困难。 一个好的表结构设计能减少不小开发量&#xff0c;也能提升部分扩展性。 什么是数据库表结构&#xff1f; 表结构就是定义一个表的字段、类型、主键、外键、索引&#x…

Window 创建定时任务

一、打开计算机管理&#xff08;我的电脑右键管理&#xff09; 选择系统工具任务计划程序在右侧边栏&#xff08;创建基本任务&#xff09;在弹出窗口常规栏&#xff08;如下图&#xff09;填写定时任务名&#xff08;随意起自己知道什么程序即可&#xff09;、任务描述 在触发…

html将复选框变为圆形样例

html将复选框变为圆形样例 说明目录使用对勾图标实现圆形复选框原复选框html代码及默认样式取消复选框未勾选前的样式新增复选框未勾选前的样式新增复选框勾选后的样式获取复选框选中后的value值 使用CSS样式写对勾图标实现圆形复选框 说明 这里记录下用原生html实现将原复选框…

<蓝桥杯软件赛>零基础备赛20周--第4周--杂题-1

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

Go 多版本管理

在日常开发工作过程中&#xff0c;很多时候我们都需要在自己的机器上安装多个go版本&#xff0c;像是go1.16引入的embed&#xff0c;go1.18引入了泛型&#xff1b;又或是自己本地使用的是最新版&#xff0c;但公司的项目中使用的go1.14、go1.13甚至是更早的版本。 那么有没有既…

甲方自建ERP这事靠不靠谱?来听听读过中欧商学院的老板怎么说

李总自建ERP开发团队的失败案例&#xff0c;投入三年&#xff0c;花了五六百万&#xff0c;做出来的东西&#xff0c;远不如免费开源的Odoo软件。Odoo有强大的技术平台&#xff0c;有无穷的功能插件。李总现身说法&#xff1a;“早知道有Odoo&#xff0c;何必瞎折腾&#xff0c…

msvcr110.dll丢失的解决方法都有哪些,有效解决msvcr110.dll丢失

今天在使用电脑的时候提示一个和“msvcr110.dll丢失”有关的报错&#xff0c;出现这样的问题小编也是一脸懵&#xff0c;一下也不是知道该怎么处理了&#xff0c;于是小编去了解了一下msvcr110.dll丢失是什么情况&#xff0c;为什么会有这样的问题发生&#xff0c;同时msvcr110…

WebBits库如何使用

WebBits 是一个用于构建 Web 应用程序的 Python 库。以下是使用 WebBits 库的一般步骤&#xff1a; 安装 WebBits&#xff1a;在终端或命令提示符中运行以下命令来安装 WebBits 库&#xff1a; pip install webbits 导入 WebBits 库&#xff1a;在 Python 脚本中导入 WebBits…

一篇新闻稿的标准格式是怎样的呢?建议收藏

企业和品牌每年都需要撰写大量的新闻稿和软文进行投放&#xff0c;优质的新闻稿件可以给品牌带来源源不断的用户流量&#xff0c;新闻稿要按照标准格式进行创作&#xff0c;一篇新闻稿的标准格式是怎样的呢? 接下来伯乐网络传媒就来给大家分享一下。 新闻稿的结构和排版是新闻…

快速了解:什么是优化问题

1. 定义 数学优化问题是&#xff1a;在给定约束条件下&#xff0c;找到一个目标函数的最优解&#xff08;最大值或最小值&#xff09;。 2. 快速get理解 初学者对优化技术陌生的话&#xff0c;可以把 “求解优化问题” 理解为 “解一个不等式方程组”&#xff0c;解方程的。…