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

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 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.mzph.cn/news/131443.shtml

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

相关文章

阿里云多款ECS产品全面升级 性能最多提升40%

“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新&#xff0c;为客户创造业务价值。”10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云弹性计算计算产品线负责人张献涛表示&#xff0c;通过持续的产品和技术创新&#xff0c;阿里云发布了HPC优化实例等多…

基于Magma构建灵活、低成本无线接入网

传统蜂窝网络一般基于特定接入技术并针对大规模公共网络设计&#xff0c;无法灵活适配小规模网络以及异构无线技术。本文介绍了Magma在构建低成本异构无线接入方面的探索。原文: Building Flexible, Low-Cost Wireless Access Networks With Magma 摘要 当今仍然有数十亿人受限…

深度好文|听懂这些逻辑,你会越变越好。

哈喽&#xff0c;大家好&#xff0c;我是雷工。 最近看了一篇文章&#xff0c;噱头很大&#xff0c;说是手把手的教你&#xff0c;如何从一个普通人&#xff0c;成长为身价千万的中产。 这种话我肯定是不信的&#xff0c;要么标题党&#xff0c;要么割韭菜&#xff0c;千万的中…

Verilog HDL语言基础知识

目录 Verilog HDL语言基础知识 6.1.2 Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1 常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例6.1 一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,…

企业服务总线ESB有什么作用?和微服务有什么区别?会如何发展?

企业服务总线ESB是什么 下面这张图&#xff0c;稍微了解些IT集成的朋友应该不陌生。 随着信息化发展不断深入&#xff0c;企业在不同的阶段引入了不同的应用、系统和软件。这些原始的应用系统互不连通&#xff0c;如同一根根独立的烟囱。 但是企业业务是流程化的&#xff0c;…

VulnHub jarbas

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

动态规划算法实现0-1背包问题Java语言实现

问题介绍&#xff1a; 动态规划算法&#xff1a; 动态规划&#xff08;Dynamic Programming&#xff09;是一种解决多阶段决策问题的优化算法。它通过将问题分解为一系列子问题&#xff0c;并利用子问题的解来构建更大规模问题的解&#xff0c;从而实现对整个问题的求解。 动态…

懒汉模式和饿汉模式

目录 单例模式 饿汉模式 懒汉模式 单例模式 所谓单例模式,就是在有些场景中,有些特定的类,只能创建一个实例(对象),当程序员不小心创建多个实例,就会出现编译报错. ★ 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创…

基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

项目介绍 本系统是针对目前交通管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的市轨道交通线路查询系统存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率…

go语言 | grpc原理介绍(二)

gRPC gRPC 是一个高性能、通用的开源 RPC 框架&#xff0c;其由 Google 2015 年主要面向移动应用开发并基于 HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf 序列化协议开发&#xff0c;且支持众多开发语言。 由于是开源框架&#xff0c;通信的双方可以进行二次开发&#x…

关于编程不得不说的事

这些年&#xff0c;互联网爆炸式的发展&#xff0c;促生了无数程序员&#xff0c;也促生了大量 IT培训机构。短短数年间&#xff0c;科班出生的程序员和培训机构出生的程序员呈指数增长。程序员的职业也不再是金饭碗。写了这么多代码&#xff0c;有些感触&#xff0c;所以写下来…

Python--快速入门二

Python--快速入门二 1.Python数据类型 1.可以通过索引获取字符串中特定位置的字符&#xff1a; a "Hello" print(a[3]) 2.len函数获取字符串的长度&#xff1a; a "Hello" print(a) print(len(a)) 3.空值类型表示完全没有值&#xff1a; 若不确定当…

用户自定义消息及层次划分

有些人对术语 WM_USER 表示消息范围基的名称有不同的意见&#xff0c;因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是&#xff0c;用户不能使用它们&#xff0c;因为它们属于窗口类定义的一部分。 但是&#xff0c;问题是&#xff0c;”这里的用户是谁&#xff1f;”…

IOS渲染流程之提交图层数据至RenderThread进程

大致链路 UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU 图层树/视图树 一个UIView&#xff08;视图&#xff09;对应一个CALayer&#xff08;图层&#xff09;&#xff0c;CALayer对应显示的数据其有个content代表Bitamp&#…

循环队列练习

循环队列练习 相关内容&#xff1a; 1.队列顺序存储的不足 2.循环队列&#xff08;队列头尾相接的顺序存储结构&#xff09; //队列的初始化、入队、出队、取对头、计算队长度 #include<stdio.h> #define MAXSIZE 10 typedef int Status; #define OK 1 #define ERROR 0…

Java用log4j写日志

日志可以方便追踪和调试问题&#xff0c;以前用log4net写日志&#xff0c;换Java了改用log4j写日志&#xff0c;用法和log4net差不多。 到apache包下载下载log4j的包&#xff0c;解压后把下图两个jar包引入工程 先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参…

幂等性(防重复提交)

文章目录 1. 实现原理2.使用示例3. Idempotent注解4. debug过程 主要用途&#xff1a;防止用户快速双击某个按钮&#xff0c;而前端没有禁用&#xff0c;导致发送两次重复请求。 1. 实现原理 幂等性要求参数相同的方法在一定时间内&#xff0c;只能执行一次。本质上是基于red…

微信小程序获取剪切板的内容到输入框中

xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …

爆料!马斯克 xAI 打造的ChatGPT竞品被曝光!

夕小瑶科技说 原创 作者 | 王二狗 马斯克旗下公司 xAI 的第一款AI模型曝光&#xff01; 名为&#xff1a;Grōk &#xff0c;有望成为ChatGPT最强竞品&#xff01; Grōk是什么意思呢&#xff1f;二狗我问了一下GPT-4&#xff1a; Grōk AI 曝光12项功能 这次Grōk模型都曝…