版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章国内外现状2.1国内研究现状在中国,越来越多的家庭选择饲养小猫小狗等宠物。不过,丢失的情况越来越多,相对应的丢器却不多。因此,基于单片机设计了一款宠物防走失系统,当宠物距离主人超过一定范围时,蓝牙模块会发出信号,并且根据信号强度来判断宠物距离主人的远近。此时,如果宠物偏离预设区域,则GPS模块会启动实时定位功能,并将宠物位置信息发送到主人的手机上。同时,报警模块也会发出声音和光线提示,以便主人能够及时察觉宠物走失的情况。在测试中,模拟了多种宠物走失的情况,包括宠物意外跑出门口、逃离绳索等,结果显示该系统能够准确地监测宠物位置,并及时向主人发出警报。因此,该系统可以帮助宠物主人及时发现宠物走失,从而尽快找回宠物,保障宠物的安全。目前,宠物防丢器的研究主要集中于以下几方面:优化传感器设计,研究人员正在尝试开发新型压力传感器、声音传感器等,以获得更准确的信息,提高定位精度和稳定性;结合机器学习和数据挖掘等技术,对采集到的数据进行分析和处理,以提高设备的准确性和稳定性;更新网络通信技术,随着物联网技术的发展,研究人员开始尝试使用物联网技术,如NB-IoT、LoRa等,以提高系统的可靠性和覆盖范围。同时,在设计宠物防丢器时必须重视数据的安全和隐私保护。因此,研究人员正在探索各种不同的技术,如加密传输、身份验证等,来保护用户数据的安全和隐私。此外,还有部分研究人员致力于设计更高效的电源管理系统,以延长设备的使用寿命。2.2国外研究现状FargrowingLiao等人提出了一种宠物防丢可穿戴设备,该设计的可穿戴设备为宠物防丢提供了全新的解决方案。传统的宠物定位器通常需要用户手动查找,而且其精确度较低,很难保证准确性。相比之下,该可穿戴设备不仅具有更高的精确度,而且还能够快速响应并提供即时的位置信息。这对于那些经常带宠物出门的人来说是非常重要的,特别是在公共场合或者陌生环境中,这种设备可以帮助主人及时寻找和控制宠物,避免宠物丢失造成的安全隐患和财产损失。其语音识别功能使得用户可以更加便捷地控制设备,不需要进行手动操作,进一步提高了用户体验。宠物防丢可穿戴设备解决了宠物丢失、找回困难的问题,提供了一个高效、准确的解决方案,然而,宠物防丢定位系统还存在一些问题,比如设备成本较高、电池寿命短、信号覆盖范围有限等。此外,一些用户对个人隐私和数据安全存在担忧,因为这些设备需要收集宠物和主人的位置信息。总体而言,宠物防丢定位系统在未来有很大的发展空间,可以通过技术创新和更好的模块搭配来解决现有的问题。第3章整体设计3.1硬件设计3.1.1单片机最小系统本设计选择了STM32F103RCT6单片机作为主控芯片进行设计。本研究通过对比使用51单片机和该单片机实现GPS数据接收的效果,得出了使用该单片机更为适合的结论。下面将详细介绍两种单片机在GPS数据接收方面的差异。由于GPS数据需要进行缓存和编码转换,因此需要较大的内存和快速的运算速度。然而,51单片机内存较小,只有几十KB,且运算速度较慢,在处理复杂任务时容易出现卡顿、延迟等问题,难以胜任GPS数据接收的要求。例如,在处理高精度GPS定位时,由于其需要频繁地进行位移计算和卫星信号解算,51单片机计算速度会变得较慢,从而影响定位精度。相比之下,该单片机拥有更大的程序存储容量、随机存储容量和更快的运行速度,能够满足GPS对于缓存和编码转换的内存和速度要求,从而更好地完成GPS数据接收的任务。例如,在处理高精度GPS定位时,该单片机的计算速度更快,能够更加稳定地进行位移计算和卫星信号解算,从而提高定位精度。因此,使用该单片机比起51单片机来实现GPS数据接收更为适合。尤其是对于需要缓存和编码转换等操作的本设计,STM32单片机更加适合。STM32主控芯片的实物图如图3-1所示。图3-1STM32主控芯片图在市场上,有多种型号的单片机可供选择,从低端的8位51系列控制器到基于ARM内核的32位控制器不等。考虑到单片机需要接入多个模块,需要存储多模块的指令,因此需要单片机拥有足够多的引脚和更大的储存容量。同时,在对多个模块进行信号管理和传输时,单片机需要拥有更快的执行速度和良好的信号处理性能。基于这些因素,控制系统的主控芯片决定选择ST公司的STM32F103单片机,因为该芯片性能优异,储存容量大,开发环境相对简单,而且价格便宜。通过在单片机上编写程序,控制系统可以不仅显示经纬度和连接状态,还可以实现信息的收发,并支持语音播报和手机绑定等功能,满足大多数客户的需求。为了满足高性能、易于开发、低功耗、高可靠性等要求,STM32系列采用了ARMCortex-M内核,专门设计用于嵌入式系统。其中,STM32F1系列是其主要的产品系列之一,它还具备三个十二位十六通道的us级A/D转换器,不同型号的单片机,拥有不同数量的最多高达112个端口,且所有端口均可映射到16个外部中断向量。可进行双采样和保持信号,以及一个十二位双通道D/A转换器。研究通过实验验证了数字电路和模拟电路需要接地隔离的结论,并采用了电阻隔离来解决干扰问题。在测试中,我们使用了一个电子系统,其中包含数字和模拟电路。当数字电路和模拟电路共地时,数字电路会出现错误。为了解决这个问题,我们在数字电路和模拟电路之间加入了0欧姆电阻。测试结果表明,在加入电阻后,数字电路出现的错误明显减少。我们还测试了其他隔离方法,例如磁珠隔离和电感隔离,但发现电阻隔离是最有效的方法。因此,本研究建议在数字电路和模拟电路接地时采用电阻隔离来确保电路运行稳定。该系列产品还采用ECOPACK封装。单片机系统及引脚分配电路图如图3-2所示。图3-2单片机最小系统电路图3.1.2电源系统设计我们的设计方案采用了USB供电方式。由于我们的系统包含了感性负载和数字设备两部分,我们需要分别给它们供电,以避免相互影响。具体地,我们采用了分离电源的设计,将电源分别给感性负载和数字设备供电,并通过USB接口实现供电。对于感性负载部分,我们采用了线性稳压器,它能够提供非常稳定的输出电压,并且在静态工作时无需任何外部元件。这种设计方式简单可靠、成本较低,适合传感器等设备的供电。对于数字设备部分,由于其对功率波动比较敏感,因此我们采用了开关稳压器进行供电。这种稳压器能够提供高效、高精度的供电,可以满足我们的要求。此外,为了保证系统的稳定性,我们还采用了输入输出滤波电容和TVS二极管等器件,以抑制干扰和过压等问题。我们的设计方案采用了USB供电方式,并采用了分离电源的设计,将电源分别给感性负载和数字设备供电,以保证系统的稳定性和可靠性。题。源接口和开关电路如图3-3所示。图3-3电源电路3.1.3显示电路设计OLED屏幕因其价格低廉、广泛应用和高性价比而成为常用显示屏。因此,在本次设计中我们首选OLED屏幕,选用了OLED12864型号,其分辨率为128*64,屏幕尺寸为0.96寸。这使得它具有良好的便携性和显示性能,在本次电路原理图设计中,我们将SCL和SDA引脚分别与主控芯片的PB8和PB9引脚相连,以实现各参数的显示功能。图3-4OLED显示屏实物图图3-5显示模块电路原理图通过OLED显示屏,可以显示经纬度信息和蓝牙连接状态,帮助我们进行信息的获取。3.1.4短信模块电路设计GSM模块可实现发送语音通话、GPRS数据传输以及短信等功能。SIM800L模块还集成了蓝牙、GPS定位和LBS基站定位等多种功能。这些功能都符合本设计的需要。本设计中,GSM模块将宠物位置信息传输到主人手机上,以便主人及时发现宠物走失和进行定位。图3-6SIM800LSIM模块由1N4007二极管、插卡SIM板和电容组成,SIM800L是一款功能强大、价格低、体积不大、可以满足不同需求的四频GSM/GPRS模块。电容和二极管用于稳压降压,以防总体电路电压过高造成SIM模块损坏。其原理图如图3-7所示,SIM800L的特性包括:1.压范围为3.4V至4.4V2.频段分为GSM850、EGSM900、DCS1800和PCS19003.可以通过AT命令设置频段,4.内置TCP/IP协议。图3-7GSM短信模块电路设计通过SIM800L可以实现短信的收发,从而远距离的获取宠物的信息。3.1.5GPS模块电路设计本设计采用以GPS定位为主、基站定位为辅的定位方式,在无法接收到GPS信号时利用基站进行定位。在现实场景中,GPS信号常常因城市建筑物遮挡或室内环境等原因而受干扰或无法接收到。因此,本设计选择采用基站定位作为辅助定位方式。例如,当车辆行驶在隧道、高楼林立的城市街道和密闭空间中,GPS信号可能会受到影响而无法接收到,这时就需要利用基站定位来确定位置信息。同时,在一些偏远地区或者室内场所,由于GPS信号接收不到,只能通过基站定位来实现定位功能。此外,基站定位也可以辅助提高导航系统的定位精度,比如在百度地图中,除了使用GPS信号进行定位,还可以通过Wi-Fi定位和基站定位来获得更加准确的定位结果。因此,本设计采用以GPS定位为主、基站定位为辅的定位方式,能够提高定位的准确性和适用性,在无法接收到GPS信号时,依然可以保证定位功能的正常使用。图3-8GPS模块工作原理图1978年2月22日,第一颗GPS试验卫星成功进入轨道并开始运行,这标志着以导航卫星为动态已知点的无线电导航定位新时代的开创。这些卫星在距离地表20200公里的轨道上发送GPS信号,并由地面控制中心监控和控制其运行。在1973年至1979年之间,共发射了4颗设计寿命为5年的BlockI试验卫星。GPS定位是通过基于时间算法实现的。卫星会不断地广播当前的时间和位置信息,而利用电磁波的传输速度是一定的,接收器可以通过不同卫星信号传递到的时间差计算出距离不同卫星的距离,并根据这些数据综合推断出接收器所在的位置信息。这是一种空间的距离交汇原理,需要至少四颗卫星才能进行定位,而卫星数量越多,获得的位置信息就越精确。GPS定位设备的主要结构包括天线单元和接收单元两大部分。这里介绍的是使用u-blox公司的VK2828U7GPS定位模块进行定位。这款模块具有高灵敏度、低功耗、轻便小巧的特点,并且内置电池,可以在掉电情况下保存卫星数据。GPS卫星每颗都会发射两个频率的载波信号,分别是L1(1575.42MHz)和L2(1227.60MHz),而本模块使用的信号是L1。该模块提供多种接口:包括1个UART接口、1个USBV2.0全速12Mbit/s接口,定位数据更新速率为每秒5次。1个DDC接口和1个SPI接口,同时,该模块支持NMEA和UBX二进制协议。串口和I/O电压均为3V电平,数字输入输出接口可以设置不同的时钟频率。设有一个外部中断输入接口。VK2828U7是一种高精度GPS模块,大多数情况下被用于定位和导航应用。它采用了全球通用的串行通讯协议,因此可以很容易地集成到各种电子设备中。该模块使用现代化的GPS技术,可以在任何天气条件下进行准确的位置测量。VK2828U7的设计非常简单,它由一个小型PCB板组成,尺寸大约为25mmx25mm,并且带有一个内置的天线。这个小巧的设计使得它非常适合嵌入式系统、移动设备或者车辆中。此外,VK2828U7还具有低功耗特性,因此其使用寿命相当长,适用于长时间运行的应用场景。VK2828U7模块支持多种定位模式,包括热启动、暖启动和冷启动。热启动模式下,它只需要几秒钟就可以重新定位,而在冷启动模式下,可能需要几分钟的时间才能重新定位。此外,它还支持WAAS(广域增强系统)、EGNOS(欧洲地区导航增强系统)和MSAS(日本多功能卫星辅助系统),这些系统能够提供更高的定位精度和可靠性。VK2828U7模块还支持异步串行通讯协议,因此可以很容易地与各种微控制器、单片机或其他设备进行通信。它还具有强大的数据处理能力,可以在模块内部计算并输出经纬度、速度、方向等信息。此外,它还支持多个数据输出格式,包括NMEA-0183协议和二进制协议。这些输出格式可以根据不同的应用程序和用户需求进行选择和配置。图3-9VK2828U7定位模块这款GPS模块具有小巧的体积和优异的性能,其增加的放大电路有利于快速搜星,可配备多种有源天线,同时集成了RF射频芯片、基带芯片和核心CPU。模块自带SMA接口,并且PPS引脚连接到了状态指示灯,常亮表示模块已开始工作但未实现定位,闪烁则表示已定位成功。该模块采用RT9193芯片组成电源模块,提供DDR供电总线调压,控制内存供电并采用标准的NMEA-0183数据输出格式。利用VK2828U7定位模块,可实现宠物位置的获取。GPS模块电路示意图见图3-10。图3-10GPS模块接口图3.1.6蓝牙模块蓝牙技术是一种适用于近距离通信的无线通信技术,它的成本较低且具有广泛的应用场景,一般而言,其可靠连接范围在10米左右。在个人电子设备和物联网方面,蓝牙得到了广泛的应用。本次设计选用的是HC-06,该产品具有指令简单、体积小和供电灵活等特点。此外,HC-06采用V2.0蓝牙协议,在与单片机共用5V电源时,省去了匹配蓝牙模块电压而降压限流的操作。图3-11HC-06蓝牙模块在现代智能设备的普及和物联网的发展下,蓝牙技术在数据传输中的应用越来越广泛。其中,HC-06蓝牙模块作为一种低成本、易于使用的蓝牙模块,受到了广泛的关注和应用。HC-06蓝牙模块具有6个引脚,包括RXD、TXD、VCC、GND和EN。其中,RXD和TXD分别用于串行通信的接收和发送;VCC和GND则是电源引脚,EN是使能脚,用于控制模块的工作状态。通过这些引脚的连接,HC-06蓝牙模块可以实现与手机端的数据传输,并且支持自动连接模式和AT指令设置模式。在自动连接模式下,当手机端与模块连接时,模块会自动进行配对和连接,方便用户的使用;而在AT指令设置模式下,用户可以通过串口发送AT指令,对模块进行各种参数的设置和配置,从而满足不同场景下的需求。比如将GPS模块获取的经纬度信息发送到手机端。下面是蓝牙模块的电路图(见图3-12)。图3-12蓝牙模块电路3.1.7语音报警电路语音合成技术是语音播报系统的核心技术,就是可以理解为我们可以把任意的文字信息用语音的方式表达出来。它的原理是将我们给的文字和符号的信息进行一些处理和转化后,用模仿人说话的方式表达出来。如图3-13所示。图3-13语音播报模块电路图通过WT588D芯片,可以实现语音播报的功能,例如“主人,我在这里”,帮助宠物主人更快准确的知道宠物的位置。WT588D的实物图如图3-14所示。图3-14WT588D3.2软件设计3.2.1软件介绍Keil5可以帮助用户更好地进行软件开发,提高开发效率,减少出错概率。以下将举例说明Keil5在软件开发中的实用性。首先,Keil5相比于Keil4有着更快的SWD下载速度。根据测试,Keil5的SWD下载速度比Keil4快五倍以上,这对于大型项目来说是非常重要的,可以显著缩短下载时间。其次,在安装Keil5时需要注意路径必须使用英文路径,并且不能与Keil4软件互相冲突,这也是一个需要特别注意的细节。最后,在使用Keil5时需要添加芯片包,这个操作可以通过包管理器来完成,方便且高效。总之,Keil5是一个非常实用、全面、完整的C语言软件开发系统,它的出现为程序设计师们带来了很多便利。通过Keil5,用户可以轻松完成代码编写、调试、烧录等工作,从而更好地实现软件开发目标。Keil5的软件界面如图3-15所示:
图3-15Keil5软件界面3.2.2系统主程序主程序的设计流程第一步进行各模块初始化,然后开始调用各个子程序,主程序如下开始各模块初始化调用子程序结束开始各模块初始化调用子程序结束
3.2.3语音识别子程序设计我们采用LD3320语音识别模块进行语音指令的识别。包括麦克风输入、音频输入和串口输入等,可以满足不同场景下的需求。在识别模式下,LD3320语音模块能够准确地识别语音指令,该模块采用了高性能数字信号处理器和专业的语音算法,具有较高的识别准确率和响应速度,并对其进行信息处理后执行相应的动作控制。具体的语音识别子程序设计如下图所示:语音识别指令执行指令信息处理Y语音识别指令执行指令信息处理Y开始各模块初始化语音模块进入识别模式结束N3.2.4定位模式的程序设计该系统采用了两种定位技术:LBS基站定位和GPS卫星定位。由于GPS定位在室内使用效果不佳,因此在室内时需要通过基站定位等其它定位来获取位置信息。在设计程序时,系统会首先尝试使用GPS定位,如果接收到有效的GPS数据,则使用GPS定位。如果连续20秒以上未能接收到有效的GPS数据,则系统会切换到基站定位,并进行定位处理。当系统再次接收到有效的GPS数据时,重新切换回GPS定位,并重新计时,如此循环。定位模式处理函数的程序流程图如下图所示:否是解析GPS信息是否接收到GPS信息是否有20秒没接收到GPS数据否是解析GPS信息是否接收到GPS信息是否有20秒没接收到GPS数据解析GPS信息获取基站定位信息经纬度数据更新数据发送标志置位20秒定时重置是否是有效的GPS信息是是否否3.2.5SIM800L模块子程序本设计使用SIM800L模块和手机进行通信,通过串口与单片机进行通信,并最终实现了传感器数据的发送和接收。在具体实现过程中,我们将SIM800L模块连接到无线网络,此后我们设定了标志位以确定有效数据的一致性,并在确认校验正确后进行数据解析。随后我们读取短信模块的数据并发送传感器数据,在确保数据帧正确性后,我们将传感器数据解析并发送,最终将数据显示在手机端接收。例如,我们在一个智能家居系统中应用本设计。该智能家居系统包括多个传感器,如温度、湿度、光线等。我们将SIM800L模块与单片机相连,并设置标志位以确保有效数据的一致性。一旦传感器数据已被读取并经过了适当的处理,它将被发送到SIM800L模块,经过解析并发送至接收方,即用户的手机。当接收方收到数据时,会立即将其解析并显示出来。通过这种方式,用户可以及时地监测智能家居系统中各种环境参数的变化,并做出相应的控制和调整。串口程序初始化流程如图3-19所示。开始初始化串口工作方式开始初始化串口工作方式设置波特率使能中断使能串口结束3.2.6蓝牙模块子程序首先,接通设备的电源,打开手机蓝牙助手。接着,进行蓝牙初始化,与此同时对设备也进行初始化。在手机端的蓝牙助手中扫描设备的蓝牙模块并检测连接状态。搜索到设备蓝牙模块,选择连接。如果未成功连接,可持续检测并尝试连接,直到成功为止。
建立连接数据收发断开连接开始蓝牙设备初始化系统初始化监测连接建立连接数据收发断开连接开始蓝牙设备初始化系统初始化监测连接连接上?扫描是否按键NNYY当前许多电子产品的控制系统往往被禁锢在封闭空间中,数据传输和交换大多采用自带的串口。这种模式一旦系统存在问题,很难快速定位问题所在并将信息发送给用户。出现错误时,仅能依赖系统报警信号来解决问题。因此,如何解决这个问题成为近年来的一大难题。直到蓝牙技术的出现,为解决这一问题提供了一种解决方案。在本设计中,我们使用蓝牙技术来实现系统数据的传输、采集和分析。。由于开发蓝牙应用程序的难度较大,因此我们使用了开源蓝牙助手应用程序。一旦两个终端设备连接成功,我们就可以使用手机移动端进行数据发送和控制。
图3-21蓝牙助手app搜索界面图3-22蓝牙助手调试界面3.3系统设计总结总的来说,整个系统由嵌入式STM32、蓝牙、全球定位系统GPS和全球移动通信系GSM统组成,其设计主要包括两部分,底层程序设计和应用界面设计,系统的整体框架如图3-23所示。图3-23系统整体框架目前市场上有基于不同技术实现的多种防丢方案。其中,基于RFID(RadioFrequencyIdentification)技术的防丢方案需要搭配RFID标签和读卡器使用,通过2.4G无线射频技术进行传输,可以实现较远的传输距离,最远可达100米左右。该方式的耗电量低,操作相对简单,但预警距离无法随意设置,需要特定硬件电路才能调控。另外一种主流的防丢技术是基于蓝牙(Bluetooth)技术实现的,适用范围更广泛,并且预警距离可以灵活调整。蓝牙防丢方案只需与智能手机连接即可使用,无需额外硬件支持,具有操作简便、成本较低等优点。相比于RFID防丢技术,蓝牙防丢技术的实现难度更低,功能也更为简单灵活。针对我们的项目,我们决定采用蓝牙技术来实现防丢功能。我们设计的防丢模式包括可控预警距离的防丢报警,在设备远离我们一定距离时会发出警报提醒;同时,我们还设计了定位模式,可以随时通过地图实时定位、追踪目标的位置。防丢报警不仅会在防丢设备端发出,同时也会通过双向提醒方式通知手机端,更加高效地提高防丢效果。此外,我们还为防丢设备设计了一个按键,可以主动向指定手机发送短信请求帮助信息,提高了设备的求救能力。设计的基本功能主要体现在以下几个方面:防丢模式下防丢目标在远离我们一定距离时能发会警报提醒,其预警距离可控的防丢报警;定位模式下我们可以随时随地通过地图实时定位、追踪到目标当前位置;防丢报警不仅仅是防丢端的报警,手机端同样会有提示的双向提醒,能有效提高防丢效果;防丢端可以通过按键主动向指定手机发送短信请求帮助短信。第4章测试4.1硬件测试根据我们所学的知识,我们知道系统中最容易出现问题也是最重要的部分就是硬件电路。因此,在我的焊接过程中,我十分严谨和仔细,每一个动作都小心翼翼地完成,特别是在组装电源时更是如此。主要有以下四个步骤:第一步:检查。首先,选择合适的元器件后,利用万用表等仪器测量自己所选择的元器件能否使用。第二步:焊接。在焊接时,要根据焊接元器件的类型和数量选择不同的焊接方式和工具,并掌握正确的焊接技巧和方法。第三步:调试。在焊接剩下的元器件时,一定要注意芯片的引脚顺序、LED的正负极等问题,完成后再将写好的hex文件刻录到单片机中。第四步:整合组装。当所有模块都焊接完成后,才可以组装整个系统。在这一步中,我们也不能嫌麻烦,必须再次使用万用表监测所有的功能模块,检测它们是否能正常运行。焊接完成的效果图如图4-1所示。图4-1焊接完成效果图
图4-2实物正面图4.2软件测试这段文字中已经确定了本次设计所需的主控制器是STM32F103C8T6,开发环境是KEIL5。根据4.1内容,软件调试是在KEIL5MDK平台上进行的,目的是为了解决在编译过程中出现的问题。在按照事先制定好的步骤进行操作时,需要先写好一个小的模块,然后点击按钮进行编译,逐步完善直至达到自己所理想的效果。图4-3KEIL5MDK软件最终调试图通过软硬件的系统设计,将最终编写的程序通过烧录器下载到单片机,内容如图4-4所示。
图4-4KEIL5MDK选项调试图然后,我们再点击Debug选项卡,设置为如图4-5所示。图4-5Debug选项调试图先将ST-link连接到STM32的调试接口,设置完成后,点击Download按钮就可以进行下载,下载完成界面效果如图4-6所示。图4-6下载调试结果图4.3系统调试硬硬件整体测试是确保电子系统能够按照设计要求进行工作的重要步骤。它通常包括静态调试和动态调试两种主要方法,以确认电路板、模块或整个系统没有任何设计或制造缺陷。静态调试主要是通过观察、测量和检查来验证系统的正确性和一致性,其中有四种方式可供选择。第一种方法是肉眼观察,它是最简单但也最基本的方法之一。通过检查电路板上是否存在明显的焊接错误、短路或开路等问题,可以初步判断出问题所在。例如,当电路板上的元器件安装不正确时,在肉眼观察下可以看到引脚不正确插入插槽的情况。第二种方法是使用万用表,这是一种非常常见的电子测试工具。通过测量电路板各个点的电压、电流和电阻等参数,可以确定元器件的工作状态和电路的连通性。例如,在测量电路板上一个IC芯片的电源电压时,如果读数偏离了预期值,就可以怀疑是电源线有问题。第三种方法是上电检查,它适用于那些需要通过电源供电才能正常工作的电路板。在此方法中,电路板被连接到一个稳定的电源,并使用万用表来验证各个部分的电压、电流和功率等参数是否正常。例如,在上电检查过程中,如果发现某些元件没有工作,就可以通过测试确定其是否需要更换。第四种方法是综合检查测试,它是一种全面的静态调试方法。它结合了前三种方法,通过肉眼观察、使用万用表和上电检查等方式,系统地检查电路板上每个元件的工作状态,以保证整个系统的完整性和正确性。例如,在综合检查测试中,可以通过肉眼观察并使用万用表测量电路板上所有元器件的引脚连接,然后再对整个系统进行上电检查,以验证所有元器件的工作状态。除了静态调试外,动态调试也是确保电子系统能够按照设计要求进行工作的重要步骤之一。动态调试旨在保证元器件正常工作,提高系统性能。例如,通过使用信号发生器和示波器等仪器来模拟电路板上的实际工作条件,可以验证电子系统的性能是否符合预期。4.4实物测试我通过仔细阅读说明书并深入研究硬件电路,最终设计了一张令我满意的电路板。在整个过程中,我按照先焊接小部件再焊接大部件的流程进行了制作。接着,我进行了上电测试,对各个模块进行测试,各模块正常运行,显示屏显示了蓝牙状态和经纬度信息,蓝牙正常连接且语音播报功能正常,断开蓝牙后手机可以正常通过短信获取经纬度信息,接下来为实物测试的具体步骤。第一步:接通电源按下开关按键,各模块进入初始状态。系统会显示经纬度信息到显示屏上,如下所示。图4-7初始状态图4-8搜索设备第二步:打开手机软件并开启蓝牙,点击软件右上角连接,系统通过蓝牙并利用蓝牙模块子程序与手机app进行连接,输入密码1234进行连接。图4-9连接蓝牙第三步:打开“聊天界面”系统会通过VK2828U7定位模块与GPS子程序获取经纬度,并通过蓝牙连接实时发送宠物GPS位置信息到手机屏幕。图4-10获取经纬度信息第四步:通过蓝牙连接利用单片机控制wt588d语音模块可实现语音播报。当按下按键后喇叭会播放提前设置好的语音图4-11语音播报第五步:当宠物跑远蓝牙连接断开,系统通过SIM800L模块与GSM模块子程序发送短信至用户。图4-12位置短信总结本次设计是关于一款GPS宠物防丢器,它集成了多个模块,包括液晶显示器和SIM800L模块,它能够记录位置,并将位置信息发送出去,功能非常多样化。这款防丢器的器件十分复杂,需要多个模块和传感器共同协作才能正常工作。这也给整个设计过程带来了不少的问题。在本次设计中,首先开展了市场调查和国内外研究,了解了整体情况,针对需求设计了几个主要模块。在选择器件时,综合考虑了器件性能、实用性和性价比等因素,进行了多方面的评估。随后,进行了硬件电路设计,充分考虑各个模块之间的影响,并且更加注重基础设计,从多个角度防止电路出错,确保电平稳定。在准备阶段,需要深入理解设计课题,并认真研究涉及到的内容,以掌握有关知识。通过查阅文献来获取研究资料,同时初步构想系统所要实现的功能,如定位、GPS传感器技术、短信通讯技术等,并收集相关资料作为系统设计的素材。对软件的各项功能进行具体分析,以明确开发目标。通过对文献的深入研究,并运用归纳、演绎、分析、综合、抽象、概括等方法,了解软件和硬件开发的相关技术,并熟悉系统中各个功能模块之间的关系,掌握系统工作的原理和本质,并确定开发流程。设计出一套优良的系统并规范地编写程序,同时进行选型和查找相关硬件说明来设计硬件模块,逐个确定各个模块,例如单片机STM32F103C8T6、定位模块、短信通讯模块、按键输入模块、声光报警模块。在硬件设计完成后开始系统软件部分的设计,通过模块化编程进行调试和修改。设计出对应电路图进行仿真,并用Keil5软件编写设计程序,并绘制软件流程图,进行模拟仿真。在调试的过程中,要全面检查系统,以防止系统存在隐性的BUG,并及时调整参数,确保系统的严谨性。最后检查系统是否能够按照要求实现控制功能,并整理论文。这样就能完成一个整体的宠物防丢位置查询系统设计,并实现各个功能。通过本次毕业设计,我得以充分回顾和应用我在大学四年所学的知识。在老师和同学的悉心帮助下,虽然整个过程曲折坎坷,但是最终我们成功地完成了毕业设计,令我感到十分兴奋和自豪。
参考文献[1]黄伟成,金亮,卢俊硕,霍文豪,刘德强.基于STM32单片机的智能宠物屋的设计与实现[J].信息与电脑(理论版),2022,34(10):162-164.[2]曹妍.基于单片机的智能宠物喂食器设计[J].电子技术,2021,50(09):32-33.[3]刘伟峰,陈廷炫.基于单片机的智能宠物牵引绳设计[J].电子制作,2021(18):16-18+69.[4]张楠楠,盛赛男.基于单片机的宠物防走失系统设计[J].周口师范学院学报,2021,38(05):36-39.[5]黄建军,邵中魁,陶仁和,姜耀林.基于单片机的位置实时精调伺服控制系统开发[J].精密制造与自动化,2021(03):17-21.[6]洪熠,徐婷,何睿,罗彬,朱苍璐.基于STM32单片机的智能宠物系统的未来发展[J].电脑知识与技术,2021,17(14):199-200.[7]龙小丽,杨泽锋,黄闯,李楷,宫占霞.基于单片机的智能宠物投食系统设计[J].信息技术与信息化,2021(04):235-237.[8]饶云,程莉,胡文雅,刘忠成.基于STM32单片机的GPS定位技术的应用[J].计算机与数字工程,2020,48(04):970-973.[9]张红月.基于单片机的太阳能智能宠物喂养系统[J].电脑编程技巧与维护,2019(12):142-143+162.[10]亓浩名,王利,武毅等.基于单片机的GSM短信收发模块设计[J].电子测试,2012,No.245(03):63-68.[11]王骐,何嘉斌.单片机控制GSM模块实现短信收发的软件设计[J].单片机与嵌入式系统应用,2005(01):63-66.[12]孔德力.基于STC52单片机GSM短信上报GPS经纬度信息的设计[J].南方农机,2019,50(24):130-131.[13]沈广冲,禹平.基于GPS和短信技术的迷路报警器[J].通信电源技术,2010,27(05):66-67.DOI:10.19399/ki.tpt.2010.05.019.[14]AlM.SmartPetFeederSystemandBigDataProcessingtoPredictPetFoodShortage[J].TurkishJournalofComputerandMathematicsEducation(TURCOMAT),2021,12(3):1858-1865.[15]HeoSP,JeongS.InternetofThingsintheBathroom:SmartHealth-MonitoringBidetSystem[J].MathematicalProblemsinEngineering,2021,2021.[16]MMartínez-Zarzuela.CustomIMU-BasedWearableSystemforRobust2.4GHzWirelessHumanBodyPartsOrientationTrackingand3DMovementVisualizationonanAvatar[J].Sensors,2021,21.[17]ZahabyM,GaonjurP,FarajianS.LocationtrackinginGPSusingKalmanFilterthroughSMS[C]//IEEEEUROCON2009.IEEE,2009:1707-1711.[18]KristianY,ArmantoH,FransM.Utilizinggpsandsmsfortrackingandsecuritylockapplicationonandroidbasedphone[J].Procedia-SocialandBehavioralSciences,2012,57:299-305.[19]Al-MazloumA,OmerE,AbdullahMFA.GPSandSMS-basedchildtrackingsystemusingsmartphone[J].InternationalJournalofElectronicsandCommunicationEngineering,2014,7(2):238-241.[20]ReinauKH,HarderH,WeberM.TheSMS–GPS-Tripmethod:Anewmethodforcollectingtripinformationintravelbehaviorresearch[J].TelecommunicationsPolicy,2015,39(3-4):363-373.附录A原理图附录B源程序main主程序#include"sys.h"#include"delay.h"#include"gpio.h"#include"OLED_I2C.h"#include"usart1.h"#include"usart2.h"#include"usart3.h"#include"stmflash.h"#include"wt588d.h"#include"timer.h"#include"GPS.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#defineFLASH_SAVE_ADDR ((u32)0x0800F000) //设置FLASH保存地址(必须为偶数)#defineSTM32_RX1_BUF Usart1RecBuf#defineSTM32_Rx1Counter RxCounter#defineSTM32_RX1BUFF_SIZE USART1_RXBUFF_SIZE#defineSTM32_RX2_BUF Usart2RecBuf#defineSTM32_Rx2Counter Rx2Counter#defineSTM32_RX2BUFF_SIZE USART2_RXBUFF_SIZE#defineSTM32_RX3_BUF Usart3RecBuf#defineSTM32_Rx3Counter Rx3Counter#defineSTM32_RX3BUFF_SIZE USART3_RXBUFF_SIZE#defineGPS_STR_LEN48GPS_INFO GPS; //GPS信息结构体externunsignedcharrev_start;externunsignedcharrev_stop;externunsignedchargps_flag;u8GPS_rx_flag=0;u8gpsInitFlag=0;u8 sendFlag=0x00; //发短信标志u8 hc05sendFlag=0; //hc05发送数据标志u8 shuaxin=0; //刷新标志char PhoneNumber[11]; //手机号码charConversionNum[44]; //手机号码转码后存放数组unsignedchardisplay[32];//显示缓存数组voidUsartRxBufClear(u8USARTx)//清除指定串口接收缓存{ switch(USARTx) { case(1):memset(STM32_RX1_BUF,0,STM32_RX1BUFF_SIZE);//清除缓存 STM32_Rx1Counter=0;break; case(2):memset(STM32_RX2_BUF,0,STM32_RX2BUFF_SIZE);//清除缓存 STM32_Rx2Counter=0;break; case(3):memset(STM32_RX3_BUF,0,STM32_RX3BUFF_SIZE);//清除缓存 STM32_Rx3Counter=0;break; default:break; }}voidpc13LED(void)//核心板上的PC13小灯闪烁{ PC13_LED=0; delay_ms(60); PC13_LED=1; delay_ms(60); PC13_LED=0; delay_ms(60); PC13_LED=1; delay_ms(60); PC13_LED=0; delay_ms(60); PC13_LED=1;}voidPhoneNumTranscoding(void)//手机号转码{ u8i=0; for(i=0;i<11;i++)//发送中文短信手机号必须转码,前面需要加上003 { ConversionNum[i*4+0]='0'; ConversionNum[i*4+1]='0'; ConversionNum[i*4+2]='3'; ConversionNum[i*4+3]=PhoneNumber[i];}}voidgsm_atcmd_send(char*at)//GSMAT指令发送函数{unsignedshortwaittry;//延时变量do{gsm_rev_start=0;//接收开始标志清零gsm_rev_okflag=0;//接收完成标志清零waittry=0;//延时变量清零uart1_send((unsignedchar*)at,0xFF);//串口发送内容while(waittry++<3000)//进入while延时{if(gsm_rev_okflag==1)//等待GSM返回OK{return;//返回出去}delay_ms(1);}}while(gsm_rev_okflag==0);}voidgsm_init(void)//gsm初始化{gsm_atcmd_send("AT\r\n");//测试用的delay_ms(1000);gsm_atcmd_send("AT+CSCS=\"UCS2\"\r\n");//设置为unicode编码delay_ms(1000);gsm_atcmd_send("AT+CMGF=1\r\n");//设置为文本模式delay_ms(1000);gsm_atcmd_send("AT+CNMI=2,1\r\n");//来短信时提示,并存储到模块内存 delay_ms(1000); gsm_atcmd_send("AT+CMGD=1,4\r\n");//清除短信 delay_ms(1000); gsm_atcmd_send("AT+CSMP=17,0,2,25\r\n");//设置短信保留为5分钟,发送中文 delay_ms(1000); gsm_atcmd_send("AT+COLP=1\r\n"); delay_ms(1000); gsm_atcmd_send("AT+CLIP=1\r\n");//来电显示 delay_ms(1000);}/**number为对方手机号*/voidgsm_send_msg(constchar*number,char*content){u8len;unsignedchar gsm_at_txbuf[60];//GSMAT命令缓存区memset(gsm_at_txbuf,0,60);//缓存清零strncpy((char*)gsm_at_txbuf,"AT+CMGS=\"",9);//将AT+CMGS=\",复制到gsm_at_txbufmemcpy(gsm_at_txbuf+9,number,44);//将手机号码复制到AT+CMGS=\"之后len=strlen((char*)gsm_at_txbuf);//获取gsm_at_txbuf字符串长度gsm_at_txbuf[len]='"';//AT+CMGS=\"12345678901\"gsm_at_txbuf[len+1]='\r';gsm_at_txbuf[len+2]='\n';//gsm_at_txbuf最终的格式"AT+CMGS=\"手机号码\"\r\n"uart1_send(gsm_at_txbuf,0xFF);//发送需要接受短信的手机号码delay_ms(1000);uart1_send((unsignedchar*)content,0xFF); //发短信内容delay_ms(100);printf("%c",0x1a); //发送结束符号delay_ms(10);}voidsim800_send_sms(unsignedchar*content)//sim800发送短信{ u8send_error=0; u16send_count=0; gsm_rev_okflag=0; OLED_ShowStr(0,6,"SendSms...",2); gsm_send_msg(ConversionNum,(char*)content);//发送短信 delay_ms(2000);//延时2秒 delay_ms(2000);//延时2秒 delay_ms(2000);//延时2秒 while(gsm_rev_okflag==0)//等待返回OK指令 { if(send_count++>8000) { send_count=0; send_error=1; break; } delay_ms(1); }; gsm_rev_okflag=0; if(send_error==1) OLED_ShowStr(0,6,"SendFail!",2);//显示发送超时 else OLED_ShowStr(0,6,"SendOK!",2); UsartRxBufClear(1); delay_ms(2000);//延时2秒 delay_ms(2000);//延时2秒 delay_ms(2000);//延时2秒 OLED_ShowStr(0,6,"",2);}voidreceive_sim800_com(void) //接收sim800的命令{ char *presult1=0,*presult2=0; char gsm_at_txbuf1[20]; char SmsNum[3],len=0; if(strstr(STM32_RX1_BUF,"83B753D66570636E")!=NULL)//接收到获取数据命令 { UsartRxBufClear(1); //串口1清除缓存 pc13LED();sendFlag=0x02; //发送短信标志 } if(strstr(STM32_RX1_BUF,"+CMTI:")!=NULL)//接收到短信 { presult1=strstr(STM32_RX1_BUF,"+CMTI:"); if(strstr(presult1,"\"SM\",")!=NULL) { presult2=strstr(presult1,"\"SM\","); //+CMTI:"SM",1 delay_ms(50); memset(gsm_at_txbuf1,0,20); //清空发送缓存区 memset(SmsNum,0,3); //清空缓存区 strncpy(gsm_at_txbuf1,"AT+CMGR=",8);//将AT+CMGR=",复制到gsm_at_txbuf memcpy(SmsNum,presult2+5,2); memcpy(gsm_at_txbuf1+8,SmsNum,2); len=strlen(gsm_at_txbuf1); //获取gsm_at_txbuf字符串长度 gsm_at_txbuf1[len]='\r'; gsm_at_txbuf1[len+1]='\n'; //gsm_at_txbuf最终的格式"AT+CMGR=XXX\r\n" uart1_send((unsignedchar*)gsm_at_txbuf1,0xFF); UsartRxBufClear(1); //串口1清除缓存 } }}voidCheckNewMcu(void) //检查是否是新的单片机,是的话清空存储区,否则保留{ u8comper_str[6]; STMFLASH_Read(FLASH_SAVE_ADDR+0x10,(u16*)comper_str,5); comper_str[5]='\0'; if(strstr((char*)comper_str,"FDYDZ")==NULL) //新的单片机 { STMFLASH_Write(FLASH_SAVE_ADDR+0x10,(u16*)"FDYDZ",5);//写入“FDYDZ”,方便下次校验 delay_ms(50); STMFLASH_Write(FLASH_SAVE_ADDR+0x40,(u16*)"12345078910",11);//存入初始手机号 } STMFLASH_Read(FLASH_SAVE_ADDR+0x40,(u16*)PhoneNumber,11);//读出手机号 PhoneNumTranscoding(); delay_ms(100);}voidGet_GPS(void)//获取GPS数据{ staticu8errorNum=0; staticu8timeCount=0; if(rev_stop==1&&timeCount++>=5) //如果接收完一行 { if(GPS_RMC_Parse(STM32_RX3_BUF,&GPS))//解析GPRMC { errorNum=0; gps_flag=0; rev_stop=0; gpsInitFlag=1; } else { if(errorNum++>=30)//如果数据无效超过30次 { errorNum=30; gpsInitFlag=0; } gps_flag=0; rev_stop=0; } timeCount=0; } sprintf((char*)display,"%10.6f",GPS.longitude_Degree); OLED_ShowStr(40,2,(u8*)display,2);//显示经度 sprintf((char*)display,"%10.6f",GPS.latitude_Degree); OLED_ShowStr(40,4,(u8*)display,2);//显示纬度}voidLongiAndLatiChangeUnicode(char*str1,char*str2)//经纬度坐标转Unicode码{ u8i=0,len; char*buf=str1; len=strlen(buf);//获取字符串长度 for(i=0;i<3;i++)//小数点前3位 { if(buf[i]!='') {*str2++='0'; *str2++='0'; *str2++='3'; *str2++=buf[i]; } } *str2++='0';*str2++='0';//小数点 *str2++='2';*str2++='E'; i++; for(;i<len-1;i++)//小数点后6位 { *str2++='0'; *str2++='0'; *str2++='3'; *str2++=buf[i]; } *str2='\0';}voidtrx_hc05_data(void) //发送接收蓝牙数据{ u8i=0; staticu8bobaoFlag=0xFF; staticu16bobao_delay=0; staticu8init_flag=0; char *str1=0,*str2=0; char tempbuf[20]; if(strstr(STM32_RX2_BUF,"设置手机号码")!=NULL)//接收到设置手机号码指令 { str1=strstr(STM32_RX2_BUF,"设置手机号码"); delay_ms(20); str2=str1+12; //把“设置手机号码”这几个字符截去掉 while(*str2>='0'&&*str2<='9') //判断是不是0到9有效数字 { tempbuf[i]=*str2; i++; str2++; if(i>11)break; //超出手机号长度范围,直接退出while循环 delay_ms(10); }tempbuf[i]='\0'; //加上结尾符 if(strlen(tempbuf)!=11) //手机号码长度必须是11,不然都是设置失败 { Uart2_SendStr("设置失败,请核对号码格式!\r\n");//设置失败标志 } else { for(i=0;i<11;i++)PhoneNumber[i]=tempbuf[i]; //设置新的手机号 STMFLASH_Write(FLASH_SAVE_ADDR+0x40,(u16*)PhoneNumber,11); //把手机号存储一遍 PhoneNumTranscoding(); Uart2_SendStr("手机号码设置成功!\r\n"); //设置成功 } UsartRxBufClear(2); //串口2清除缓存 pc13LED(); hc05sendFlag=0; } if(strstr(STM32_RX2_BUF,"查看手机号码")!=NULL)//接收到设置手机号码指令 { memcpy(tempbuf,PhoneNumber,11); tempbuf[11]='\0'; sprintf((char*)display,"接收短信号码为:%s\r\n",tempbuf); Uart2_SendStr((char*)display); UsartRxBufClear(2); //串口2清除缓存 pc13LED(); hc05sendFlag=0; } if(strstr(STM32_RX2_BUF,"cf")!=NULL) //接收到吃饭指令 { bobaoFlag=0; bobao_delay=0; UsartRxBufClear(2); //串口2清除缓存 pc13LED(); } if(strstr(STM32_RX2_BUF,"hj")!=NULL) //接收到回家指令 { bobaoFlag=1; bobao_delay=0; UsartRxBufClear(2); //串口2清除缓存 pc13LED(); } if(strstr(STM32_RX2_BUF,"gl")!=NULL) //接收到过来指令 { bobaoFlag=2; bobao_delay=0; UsartRxBufClear(2); //串口2清除缓存 pc13LED(); } if(strstr(STM32_RX2_BUF,"qx")!=NULL) //取消播报指令 { bobaoFlag=0xFF; UsartRxBufClear(2) //串口2清除缓存 pc13LED(); } if(STATE==0)//蓝牙断开 { if(init_flag==1) { init_flag=0; for(i=0;i<2;i++)OLED_ShowCN(i*16+80,0,i+10,1); //显示中文:断开 sendFlag=0x01; bobaoFlag=2; bobao_delay=0; } } else { if(init_flag==0) { init_flag=1; for(i=0;i<2;i++)OLED_ShowCN(i*16+80,0,i+8,1); //显示中文:连接 bobaoFlag=0xFF; } } if(bobaoFlag!=0xFF) { if(bobao_delay==0)Line_1A(bobaoFlag);//播报内容 if(bobao_delay++>=450)bobao_delay=0; } if(hc05sendFlag==1) { hc05sendFlag=0; sprintf((char*)display,"经度:%10.6f\r\n",GPS.longitude_Degree); Uart2_SendStr((char*)display); sprintf((char*)display,"纬度:%10.6f\r\n",GPS.latitude_Degree); Uart2_SendStr((char*)display); Uart2_SendStr("\r\n"); }}intmain(void){ unsignedchari; charSEND_BUF[400];//发送短信缓存 charBUF1[50],BUF2[50];//BUF1为经纬度转换前缓存区,BUF2为转换后缓存区 delay_init(); //延时函数初始化 NVIC_Configuration(); //中断优先级 I2C_Configuration(); //OLEDIIC引脚初始化 GPS_rx_flag=0; CheckNewMcu(); //校验单片机 WT588D_GPIO_Init(); //wt588d语音播报模块引脚初始化 STATE_GPIO_Init(); //hc-05STATE引脚初始化 OLED_Init(); //OLED初始化 OLED_CLS(); //清屏 OLED_ShowStr(0,2," GSMInit...",2); uart1_Init(9600); gsm_init();//gsm初始化 usart2_init(9600); USART3_Init(9600); OLED_CLS();//清屏 UsartRxBufClear(1); //串口1清除缓存 UsartRxBufClear(2); //串口2清除缓存 GPS_rx_flag=1; for(i=0;i<4;i++)OLED_ShowCN(i*16,0,i+4,0);//显示中文:蓝牙状态 for(i=0;i<2;i++)OLED_ShowCN(i*16,2,i+0,0);//显示中文:经度 for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+2,0);//显示中文:纬度 OLED_ShowChar(64,0,':',2,0); OLED_ShowChar(32,2,':',2,0); OLED_ShowChar(32,4,':',2,0); for(i=0;i<2;i++)OLED_ShowCN(i*16+80,0,i+10,1); //显示中文:断开 TIM2_Init(500-1,7199);//计数到500为50ms 500*100=50000us=50ms //Tout=((arr+1)*(psc+1))/Tclk; //Tclk:定时器输入频率(单位MHZ)//Tout:定时器溢出时间(单位us) while(1) { trx_hc05_data(); //发送接收蓝牙数据 receive_sim800_com(); //接收GSM的命令 if(shuaxin==1) //大概500ms执行一次以下内容 { shuaxin=0; Get_GPS();//获取经纬度 if(sendFlag!=0x00) { /***以下为短信内容处理部分,发送中文短信必须转换为Unicode码***/ memset(SEND_BUF,0,400); //清空缓冲区 if(sendFlag==0x01) { strncpy(SEND_BUF,"8BF76CE8610FFF0C72D772D75DF27ECF8DD18FDCFF01",44); //请注意,狗狗已经跑远! } sendFlag=0x00; strcat(SEND_BUF,"7ECF5EA6"); //经度 memset(BUF1,0,50); //清空缓冲区 memset(BUF2,0,50); //清空缓冲区 sprintf((char*)BUF1,"%10.6f",GPS.longitude_Degree); LongiAndLatiChangeUnicode(BUF1,BUF2);//将经度转码 strcat(SEND_BUF,BUF2); strcat(SEND_BUF,"FF0C7EAC5EA6");//,纬度 memset(BUF1,0,50); //清空缓冲区 memset(BUF2,0,50); //清空缓冲区 sprintf((char*)BUF1,"%10.6f",GPS.latitude_Degree); LongiAndLatiChangeUnicode(BUF1,BUF2);//将纬度转码 strcat(SEND_BUF,BUF2); strcat(SEND_BUF,"3002"); sim800_send_sms((unsignedchar*)SEND_BUF);//发送短信} } delay_ms(10); }}voidTIM2_IRQHandler(void)//定时器2中断服务程序{ staticunsignedinttimeCount1=0; staticunsignedinttimeCount2=0; if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) //检查指定的TIM中断发生与否:TIM中断源 { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位 if(timeCount1++>=10)//500ms { timeCount1=0; shuaxin=1; } if(timeCount2++>=20)//1s { timeCount2=0; hc05sendFlag=1; } }}引脚初始化程序#include"gpio.h"/////////////////////////////////////////////GPIO设置/////////////////////////////////////////////voidSTATE_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); //使能PAC端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; //端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //输入GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_13); //输出GAO电平}#ifndef__GPIO_H#define__GPIO_H #include"sys.h"#definePC13_LED PCout(13) #defineSTATE PAin(4) voidSTATE_GPIO_Init(void);//初始化#endifOLED液晶初始化程序/**************************************************************************************Description:128*64点阵的OLED显示屏驱动文件SD1306驱动IIC通信方式显示屏**Others:none;**FunctionList:* 1.voidI2C_Configuration(void)--配置CPU的硬件I2C*2.voidI2C_WriteByte(uint8_taddr,uint8_tdata)--向寄存器地址写一个byte的数据*3.voidWriteCmd(unsignedcharI2C_Command)--写命令*4.voidWriteDat(unsignedcharI2C_Data)--写数据*5.voidOLED_Init(void)--OLED屏初始化*6.voidOLED_SetPos(unsignedcharx,unsignedchary)--设置起始点坐标*7.voidOLED_Fill(unsignedcharfill_Data)--全屏填充*8.voidOLED_CLS(void)--清屏*9.voidOLED_ON(void)--唤醒*10.voidOLED_OFF(void)--睡眠*11.voidOLED_ShowStr(unsignedcharx,unsignedchary,unsignedcharch[],unsignedcharTextSize)--显示字符串(字体大小有6*8和8*16两种)*12.voidOLED_ShowCN(unsignedcharx,unsignedchary,unsignedcharN)--显示中文(中文需要先取模,然后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教PEP版五年级升六年级英语形容词副词专项复习教学设计
- 聚焦结构与功能:人体代谢废物排出的奥秘(初中七年级生物 教学设计)
- 初中七年级音乐五线谱系统性识读与多维应用教学设计
- 核心素养导向的初中数学七年级上册《一元一次方程应用与单元整合复习》教学设计
- 苏教版四年级数学上册《等量代换与几何计数》经典奥数专题教学设计
- 九年级英语上册Module 8 Sports life单元知识梳理与整体教学设计(外研版)
- 安徽省亳州市涡阳县牌坊镇丁集中学等校2025-2026学年七年级下学期6月期末英语试卷(含答案无听力音频及原文)
- 2026开展宣讲会面试题及答案
- 2026娄底市语文面试题及答案
- 2026商丘运营面试题及答案
- 2025年邢台市水务发展集团有限公司招聘真题
- DBJ33-T 1358-2025 建筑与市政工程有限空间作业安全技术规程
- 常见手术麻醉配合要点
- 包装组管理制度
- 集成电路测试指南
- 交通工程施工组织设计方案
- 住宅屋面防水施工安全方案
- DL∕T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
- JT-T-1008.1-2015公路交通情况调查设备第1部分:技术条件
- 2023江苏中考数学试题分类汇编:反比例函数(纯word)
- 储能技术-电化学储能
评论
0/150
提交评论