网站设计与制作教程1,wordpress 知更鸟,做外贸一般上哪些网站,小程序定制开发外包风险欢迎大家点赞、收藏、关注、评论啦 #xff0c;由于篇幅有限#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案2.1本设计设计原理2.1.1单片机基本介绍 二、本设计方案选择三、软件设计AD原理图#xff1a;原理图… 欢迎大家点赞、收藏、关注、评论啦 由于篇幅有限只展示了部分核心代码。 技术交流认准下方 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内核由于其行业标准指令集低单位成本以及DILDIP封装中的这些芯片的可用性因此AT89系列仍然非常受欢迎。这允许在新应用程序中重新使用大量的旧代码而不进行修改。虽然比较新的AT90系列AVR RISC微控制器的功能较弱但AT89系列的新产品开发继续为上述优点。 虽然英特尔不再生产8051核心控制器或其衍生产品但众多供应商制造的增强型二进制兼容衍生产品仍然受欢迎如STC的STC89C51及其衍生产品恩智浦P89v51及其衍生产品等。一些衍生产品集成了数字信号处理器DSP。 除了这些物理设备几家公司还提供MCS-51衍生产品作为FPGA核心用于FPGA或ASIC设计。 2.1.2引脚功能介绍
图2.1 AT89C51引脚图 14 KB芯片程序存储器。 2128字节片上数据存储器RAM。 332个字节专用于注册库。 416位可位寻址存储器。 580字节的通用存储器。 64组并行I/O端口。 7128个用户定义的软件标志。 88位数据总线。 916位地址总线。 1016位定时器通常为2但可能有更多或更少。 113个内部和2个外部中断。 12位和字节可寻址RAM区域为16字节。 13四个8位端口短型号有两个8位端口。 1416位程序计数器和数据指针。 151微秒指令周期12 MHz晶振。 168051的变体还可以有一些特殊的特定模型如UARTADCOp_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口39328位双向I/O口线名称分别为P0.0P0.7P1口188位准双向I/O口线名称分别为P1.0P1.7 P2口21288位准双向I/O口线名称分别为P2.0P2.7 P3口10178位准双向I/O口线名称分别为P3.0P3.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