![宠物智能喂食器系统设计_第1页](http://file4.renrendoc.com/view2/M01/2D/17/wKhkFmYVNqyAQCfrAAGogP-j-LI471.jpg)
![宠物智能喂食器系统设计_第2页](http://file4.renrendoc.com/view2/M01/2D/17/wKhkFmYVNqyAQCfrAAGogP-j-LI4712.jpg)
![宠物智能喂食器系统设计_第3页](http://file4.renrendoc.com/view2/M01/2D/17/wKhkFmYVNqyAQCfrAAGogP-j-LI4713.jpg)
![宠物智能喂食器系统设计_第4页](http://file4.renrendoc.com/view2/M01/2D/17/wKhkFmYVNqyAQCfrAAGogP-j-LI4714.jpg)
![宠物智能喂食器系统设计_第5页](http://file4.renrendoc.com/view2/M01/2D/17/wKhkFmYVNqyAQCfrAAGogP-j-LI4715.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[19]。宠物智能喂食器系统中的自动化和智能化等方面,这些方面将是宠物喂食器设计的重点和难点等问题随之产生,这些问题都有待进一步深入研究。1.3主要研究内容本课题是一种基于STM32单片机的宠物智能喂食器系统设计,在这当中,检测的是喂养食物设定的时间、温度和湿度,而OLED所显示的就是现在这个时间还有相关的一些温度和湿度以及通过蓝牙设定的阈值。系统采用STM32单片机对信号进行分析处理,判断每次投放食物时的温湿度和设定的喂养时间,只有自动的去将电机模块开启才可以去进行正转再去对投食还有重量进行模拟的时候,只有达到投放标准以后,电机才会反转而停止喂食,这个时候就会提醒宠物去进食,或者说是去暂停进食。通过实验仿真验证了该方法可有效智能投喂宠物,安全饮食,防止宠物健康事故的发生。智能宠物喂食器是一种方便的设备,可以帮助主人自动喂养宠物,确保宠物在适当的时间得到食物。定时喂食:智能宠物喂食器可以设置定时喂食计划,按照预定的时间自动投放食物。你可以根据宠物的饮食需求,设置每天的喂食时间。分段喂食:有些宠物需要分段喂食,避免一次性摄入过多食物。智能宠物喂食器可以分割食物投放,让宠物在一段时间内多次获得小份食物。配置食物量:智能喂食器通常配备食物容器或者可更换的食物碗,你可以根据宠物的体重、年龄和饮食需求设置每餐的食物量。一些高级喂食器还可以通过智能手机应用程序远程调整食物投放量。音频提醒:有些智能宠物喂食器配备语音提醒功能,可以再喂食时间吸引宠物就餐。实现的功能如下:1.可通过STM32单片机来实时自动开启电机模块进行投食,反之,电机反转模拟停止喂食;2.可以通过DHT11温湿度传感器来对当前空气的温湿度的变化进行一个实时的检测;3.当温湿度超过设定阈值是可以通过继电器模块控制空调调节降低温度4.能在手机端设置喂养时间并在OLED实时显示,告知主人;5.可以通过按键进行手动喂食;
第2章系统总体结构2.1设计方案本课题研究的内容为宠物智能喂食器系统设计。该套系统主要由湿度模块、温度模块、蓝牙通信、OLED屏幕、电机、按键、继电器、STM32单片机部分组成;采用STM32单片机技术处理对湿度模块和温度感应模块采集到的参数并显示通过蓝牙模块上传上位机,将手机当做上位机对参数进行一个实时的显示,而且还可以观察到各个时段喂食的状态。当对这个模式进行使用的时候,还可以对现在的时间和喂食的时间进行相应的设置;这个自动喂食模式的定时时间到了,以后舵机逆时针转一圈就会对同时进行模拟,这个时候蜂鸣器就会提示宠物去吃饭,当同时结束了以后,那么电机就会反转一圈,那么蜂鸣器也就会同样关闭。设计成果为实物。结构框图如下:图2-1结构框图2.2单片机型号选择方案一:采用89C51单片机,89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM-FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。方案二:采用STM32F103C6T6单片机,STM32F103C6T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。STM32F103C8T6的GPIO有8种模式,其中包含上拉、下拉输入模式,所以外接按钮时可不设计上下拉电阻。根据他的原理图显示:按键KEY0一端接到3.3V的VCC,一端接到PA0引脚。发光二极管LED0一端也同样经1KΩ电阻接到3.3V的VCC,另一端则接到PC13上。因此,想要让二极管发光的话需要让PC13输出低电平。STM32最大工作电压3.6V,使用了LDO(低压差线性稳压器)将输入电压VIN降到3.3v给微控制器供电。3.3V和GND之间的4个0.1uf的旁路电容(去除高频交流信号)接到了芯片的4个VDD和4个VSS上,芯片拥有四个VDD和四个VSS增强供电能力,保证供电的可靠性)。经过比较分析,方案二的STM32单片机更适合作为本设计的主控芯片,STM32单片机丰富的功能和出色的性能更加符合本设计的需求。STM32F103C6T6具有高性能、低功耗、丰富的外设和灵活性强等特点,在不同的应用场景中有着广泛的应用。本设计需要一个拥有高性能和灵活性、且性能价格比较高的主控芯片,STM32F103C6T6将是一个非常好的选择。图2-232单片机最小系统实物图2.3通讯模块选择方案一:Zigbee是一种低功耗、近距离无线通信技术,专为物联网应用而设计。它基于IEEE802.15.4标准,并提供了一种可靠的、自组织的网络协议栈,适用于各种低功耗、低数据速率的应用。拓扑结构:Zigbee网络采用网状拓扑结构,其中包括一个协调器(Coordinator)和多个设备(Devices)。协调器是网络的控制中心,而设备可以是终端节点(EndDevice)或路由器节点(RouterDevice)。路由器节点可用于扩展网络覆盖范围,并提供多路径的数据传输。通信方式:Zigbee使用2.4GHz无线频段进行通信,支持全双工和半双工通信模式。它采用了频率跳变技术,以减少对其他设备的干扰,同时提供可靠的通信连接。网络协议栈:Zigbee网络协议栈分为应用层、网络层、MAC层和物理层。应用层定义了应用程序的数据格式和通信接口。网络层负责设备之间的路由选择和数据传输。MAC层管理设备之间的数据帧传输和通信时间调度。物理层负责无线信号的调制、解调和发送。低功耗特性:Zigbee专注于低功耗通信,在低数据速率下提供长时间的电池寿命。设备可以在空闲时进入低功耗睡眠状态,并根据需要进行周期性唤醒,以节省能源。自组织网络:Zigbee网络具有自组织和自修复的能力。当新设备加入网络或现有设备离开网络时,网络可以自动重新配置路由,保持网络的连通性。应用领域:Zigbee在许多应用领域中得到广泛应用,包括智能家居、工业自动化、物流和供应链管理、医疗保健、能源管理等。它提供了可靠的远程监测和控制能力,并支持大规模的设备互联。方案二:HC-06是一种经典蓝牙模块,常用于与智能手机、平板电脑和其他蓝牙设备进行无线通信。以下是HC-06蓝牙模块的一般介绍:功能:HC-06模块提供了基本的蓝牙通信功能,支持串口通信协议(UART),可以通过串口与其他设备进行数据交换。它可以作为一个从设备(Slave)与主设备(Master)进行数据传输。通信距离:HC-06模块的通信距离通常在10米左右,适用于近距离的无线通信需求。请注意,实际的通信距离可能受到环境和物理障碍物的影响。工作频率:HC-06模块使用2.4GHz的ISM频段进行通信,采用蓝牙2.0标准,支持蓝牙经典(BluetoothClassic)协议。它与许多蓝牙设备兼容,如智能手机、电脑等。电源需求:HC-06模块通常使用3.3V的电源供电,具有较低的功耗,适合于低功耗应用。它还具有睡眠模式,可以进一步降低功耗。配置与控制:HC-06模块通过AT指令进行配置和控制。你可以通过串口与模块进行通信,发送特定的AT指令来设置蓝牙名称、配对码、通信速率等参数。应用领域:HC-06模块常用于各种简单的蓝牙通信应用,例如串口数据传输、远程控制和监控等。它可以与各种嵌入式系统和微控制器进行集成,实现无线通信功能。经过比较,蓝牙通信和Zigbee通信都是无线通信技术,它们在不同的应用场景中具有各自的优势。以下是蓝牙通信相对于Zigbee通信的一些优势:广泛的设备兼容性:蓝牙是一种广泛应用于消费电子产品(如智能手机、平板电脑、音频设备等)的通信技术。几乎所有现代智能设备都具备蓝牙功能,因此可以轻松连接和交互。相比之下,Zigbee的设备兼容性较低,主要应用于特定的物联网领域。更高的传输速率:蓝牙通信通常提供较高的数据传输速率,适用于音频和视频传输等对速率要求较高的应用。蓝牙5.0版本引入了低功耗倍增(LEAudio),提供更高质量的音频传输。简便的配对和连接:蓝牙设备通常具有较为简单的配对和连接过程。用户可以通过设备的设置界面或简单的按钮操作进行蓝牙设备之间的配对,实现快速连接。这使得蓝牙在消费电子产品中得到广泛应用。多功能性:蓝牙技术提供了多种功能和应用,包括音频传输、数据传输、远程控制和位置服务等。它支持不同的蓝牙协议栈和配置文件,适用于各种应用场景。综合比较本次设计选用蓝牙模块。图2-3HC-06蓝牙模块实物图
第3章系统的硬件部分设计3.1系统总体设计本课题是一种基于STM32单片机的宠物智能喂食器系统设计,系统采用STM32单片机对信号进行分析处理,判断每次投放的喂养时间以及当时的温湿度,达喂食时间,电机就会进行反转,那么就会喂食,与此同时蜂鸣器还会提醒宠物去进食。通过实验仿真验证了该方法可有效智能投喂宠物,安全饮食,防止宠物健康事故的发生。在设计系统里面主要有信息的接收模块,还有控制的模块以及执行的模块,在这当中系统的一个核心部分就是控制的模块。将传感器的信号传输给单片机来去进行相关的处理以后信息接收的模块就可以通过放大的电路将单片机进行连接,那么控制模块的核心部件,就会运用STM32系列的单片机来去分析这些信号,从而去将执行的部分进行一定的控制运作,而在执行模块当中主要是传感器模块,可实时了解当前温湿度状况,控制宠物的饮食。总体原理图如下所示:图3-1总体原理图3.2系统的主要功能模块设计3.2.1电源供电模块设计LM2576系列是美国国家半导体公司生产的3A电流输出降压开关型集成稳压电路,它内含固定频率振荡器和基准稳压器,通常具有完善的保护电路,包括电流限制及热断路器等,利用该器件只需要极少的外围器件便可构成高效稳压电路。LM2576芯片的内部结构分别有一个开关管、电感、二极管和一组滤波电容,由控制器连接,工作过程中将输入端的高电压接入芯片的输入电源引脚VIN上,并将其转化为输出电压。在保持输出稳定的同时,芯片会利用会利用误差放大器反馈引脚FEED来对输出电压进行调节,最终输一个稳定的直流电压。图3-2电源供电模块原理图3.2.2舵机模块设计选用STM32微控制器:选择适合的STM32微控制器,具备足够的计算能力和GPIO引脚数量来控制舵机。将STM32的GPIO引脚与舵机驱动电路的输入引脚连接起来。通常使用PWM输出引脚来控制舵机的位置。确保电路连接正确,舵机能够接收到正确的控制信号。在STM32上编写程序,使用适当的编程语言(如C或C++)来控制舵机的位置和速度。配置GPIO引脚为PWM输出模式,设置适当的PWM频率和占空比来生成舵机控制信号。实现宠物智能喂食器的逻辑,例如根据预定的时间表或用户的输入控制舵机的动作,以实现喂食器的自动喂食功能。原理图如下图。图3-3舵机模块原理图3.2.3温湿度传感器模块设计DHT11数字温湿传感器是一种包含已经校准过的数字信号输出的一种温湿度的复合传感器,这个主要运用的就是一个专门的数字模块,来去对技术进行相应的采集,不需要去运用非常复杂的电路进行处理。在这个传感器里面,主要有电阻式的感知元件,还有一个NTC测温元件,而且在这当中会去和一个高性能的8位单片机进行相应的连接。单线制的串行接口会让这个系统集成的时候变得非常简单,因为其体积非常小,而且在功耗方面也不是特别高,对信号传输的时候距离可以比20米以上还要长,所以说在那些比较苛刻的环境当中使用的时候,这将会是最好的一个选择。图3-4温湿度传感器模块原理图3.2.4时钟模块设计DS1302时钟芯片主要由震荡电路、计数器、RAM和I/O端口等组成,可通过SPI接口与微控制器连接,实现时钟系统的读写以及相关操作。时钟计数原理采用32.768kHz的震荡频率作为时钟源,由振荡电路得到一定的脉冲数量,然后经过计数器来生成实时的时钟信号。时钟芯片DS1302提供了BCD码格式的时间存储,在设置和读取式需要进行相应转换。通过SPI接口可以直接对时间寄存器进行写入和读取。本设计同时加入CR2032纽扣锂电池,为时钟芯片在意外掉电情况下,依旧可以提供电源,对时间做补偿。图3-5时钟模块原理图
3.2.5继电器模块设计继电器也称电驿,是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。继电器工作时,电磁铁通电,把衔铁吸下来使D和E接触,工作电路闭合。电磁铁断电时失去磁性,弹簧把衔铁拉起来,切断工作电路。因此,继电器就是利用电磁铁控制工作电路通断的开关。继电器控制电路的作用:用低电压控制高电压,远距离控制,自动控制。继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在输出电路的时候,可以导致控量发生一定的变化的电气。继电器的主要作用如下:(1)扩大控制范围:在实际操作的过程当中,当多触点继电器达到某一个值的时候,可以按照不同的组成形式形成多种形态的电路状态。(2)放大:可以通过使用一个灵敏型的继电器或者是中间型继电器,将一个很小的控制量放大成为大功率的电路。(3)综合信号:在实际操作的过程当中,可以将多个控制信号按照规定的要求输入到继电器当中,然后进行一系列的操作,最终达到想要的效果。(4)自动、遥控、监测:通常情况下可以将自动装置上的继电器和其他的继电器连接在一起,最终形成一个控制线路,从而实现整体的自动化,保证运行的时候更加的自动流畅。本文采用两个继电器,分别控制温度和湿度。原理图如下图。图3-6温湿度继电器控制原理图3.2.6蓝牙模块设计HC-06蓝牙串口通信模块是一种基于蓝牙协议的数传模块,它的无线工作频段为2.4GHzISM,调制方式是GFSK。该模块使用的是邮票孔封装方式,尺寸为27mm×13mm×2mm,板载PCB天线,可实现10米以内的无线通信。同时,该模块直观地展示了蓝牙连接状态的LED状态指示灯,方便使用者体验。此外,该模块采用了CSR的BC417芯片,支持AT指令,使用者可根据自身需求配置主从角色、串口波特率、设备名称等参数,从而实现更加灵活的应用。总之,HC-06蓝牙串口通信模块是一款非常实用的数传模块,具有广泛的应用前景。图3-7HC06蓝牙模块原理图
3.2.7蜂鸣器模块设计蜂鸣器一般分为线圈式和压电陶瓷式。线圈式又分为有源和无源两大类,有源线圈式蜂鸣器内部集成有振荡器,能够直接驱动蜂鸣器工作。该设计采用5V高电平触发式蜂鸣器,仅有高电平信号输入时才会响起。电阻R10为限流电阻,防止流过基极电流过大损坏三极管。三极管Q1起开关管的作用,其基极的高电平使三极管饱和导通,使蜂鸣器发声;而基极低电平则使三极管关闭,蜂鸣器停止发声。图3-8蜂鸣器模块原理图3.2.8OLED显示模块设计OLED,即有机发光二极管(OrganicLight-EmittingDiode),又称为有机电激光显示(OrganicElectroluminesenceDisplay,OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始MP3播放器就已经运用了这种显示设备。可是LCD的显示屏幕都需要去背着光,OLED显示屏就不需要去背着光,主要原因就是因为后者是自己进行发光的,所以说进行同样显示的时候,OLED的效果会比LCD更好,从现在我们所掌握到的这些技术来讲,OLED的尺寸是没有办法去进行扩大的,可是OLED的分辨率却可以变得非常高。OLED模块默认设置是BS0接GND,BS1和BS2接VCC(8080模式),即使用8080并口方式,如果想要设置成其他的模式,则需要在OLED的背面,用烙铁修改BS0-BS2的设置。OLED显示模块原理图如下图。图3-9显示模块原理图第4章系统的软件设计4.1单片机初始化流程图在单片机中,初始化是指在程序开始执行之前对相关寄存器、变量和外设进行设置和配置的过程。单片机初始化的目的是确保系统的稳定性和可靠性,以及为后续的程序执行提供正确的环境和状态。首先进行单片机初始化,流程图如下。图4-1单片机初始化流程图
4.2温湿度检测模块设计当温湿度高于阈值时候,继电器会动作打开空调功能降低温湿度,可以通过蓝牙模块连接上位机在手机端设置温湿度的阈值。图4-2温湿度传感器模块流程图
4.3舵机模块设计由于喂食器分为手动模式和自动模式,所以舵机有两种起动方式:手动模式下打开按键开关,舵机起动;自动模式下只有达到设定的喂食时间时,舵机才会起动。图4-3舵机模块流程图
4.4继电器模块设计温湿度传感器分别检测当时环境的温度和湿度,再由STM32单片机进行处理,如果温度超过阈值,则温度继电器动作,进行降温,直到低于温度阈值,温度继电器停止动作。湿度继电器工作模式同上。图4-4继电器模块流程图
4.5蓝牙模块设计可以使用蓝牙来进行连接,通过手机做为上位机打开蓝牙进行搜索,然后选择相应的蓝牙HC-06名称点击连接,如果显示连接成功的话,便可以在手机端进行阈值更改设置。图4-5蓝牙连接模块子程序流程图
4.6蜂鸣器模块设计首先初始化为后续程序提供正确的环境和状态,初始化成功开始喂食,同时蜂鸣器接响起,提醒宠物进食。图4-6蜂鸣器模块流程图
4.7OLED显示模块设计初始化成功后,OLED屏幕显示模块可以显示由传感器检测出的当前温度,当前湿度,提前设定的温湿度阈值,实时时间,设定的喂食时间。图4-7OLED显示模块流程图
第5章系统测试5.1系统实物图图5-1系统完整实物图5.2测试原理需要测试的方面主要包含了测试功能是否正常,以及输入数据之后和应该输出的结果所产生的误差,所以在选择测试数据方面要选择比较小并且高效的数据来进行测试,以便进行一套完整的测试结果。进行测试的基本测试目标就是进行一组数据测试,然后检查是否会发生特定的错误或者是错误情况,在测试的过程当中主要包含着以下几个方面,首先是输入用户的实际数据情况,然后再进行系统的检验但是必须要注意的是,选择的数据一定要包含着实际应用当中所需求的所有的功能测试,并且结果是正常的。
5.3喂食功能测试待机状态下舵机箭头指向左侧,时刻准备喂食图5-2舵机实物图按下喂食开关按键,舵机逆时针旋转180度,蜂鸣器响起,舵机开始喂食。当喂食结束时,再次按下喂食开关按键,舵机顺时针旋转180度,停止喂食。图5-3舵机实物图
5.4继电器功能测试当温度超过设定阈值30度时,左侧温度继电器动作,控制空调降低温度,并且红色灯亮起提示温度超过阈值。图5-4温度继电器实物图(左侧)当湿度超过设定阈值相对湿度60%时,右侧湿度继电器动作,控制空调降低湿度,并且红灯亮起提示湿度超过阈值。图5-5湿度继电器实物图(右侧)
5.5温湿度模块功能测试当接通电源后,温湿度传感器接通,测出温湿度值在显示屏上显示。图5-6温湿度测试实物图人为调节温湿度(例如放一杯热水在传感器旁边)并且当超过温湿度阈值,温湿度传感器可以检测到并且红灯闪亮报警提示。图5-7温湿度测试实物图
5.6显示功能测试通过上图当中的数据,我们可以发现在第一行所显示的是当前时间的温度以及湿度,温度为28.6度,相对湿度为39.4%。在屏幕第二行显示的数值是温度和湿度的阈值,温度的上限为30度,相对湿度的上限值为60%,然后第三行为当前时间的显示。第四行为设定的喂食时间。图5-8OLED显示屏幕5.7按键功能测试在手动模式下,当按下左边按键,蜂鸣器检测到高电平信号长响一声,舵机转动,按下右边按键舵机关闭。图5-9按键功能测试实物图
5.8蓝牙功能测试5-6蓝牙功能测试实物图图5-10蓝牙功能测试实物图打开手机蓝牙进行初始配对,找到HC-06进行蓝牙连接,提示连接成功。进行上限、喂食时间设置,点击设置,则设置成功。点击校对时间可以将喂食器与手机时间进行校对,同一时间。喂食器的温湿度传感器检测到实时温湿度也会通过蓝牙模块传送到手机上。
第6章总结与展望6.1总结在设计过程中,主要针对硬件部分和功能模块进行了设计。在单片机选型时考虑到后续功能的增加,可能需要更高性能的STM32单片机。当然后续过程中除了基础的喂食功能,我们添加了蓝牙控制,温湿度检测,温湿度控制等功能。在手机端也可以实时显示喂食器所在位置的温湿度。同时为时钟模块添加一块纽扣电池,在掉电时为时间做补偿。在设计过程中因为考虑到电源电压不稳定,于是加入降压稳压模块,以此适应大多数环境。6.2展望在未来宠物的营养搭配,也可以由宠物智能喂食器进行搭配,为每一个宠物做定制的科学膳食。在平时智能喂食器可以在宠物进食的时间内,采集宠物的身体数据,例如体重,毛发颜色以及宠物饮食情况等。通过喂食器采集的数据,我们可以成立一个大的数据库,请专业的营养健康分析人员,为每一只宠物提供专门的饮食方案。这样可以有效避免宠物的饮食安全,与身体健康等问题。并且因为宠物有专门的饮食方案,并且日常的身体特征数据也被记录,所以当宠物生病时,宠物医生也可以第一时间做出专业判断,避免错过最佳治疗时间,而对宠物造成长久的不可挽回的影响。在一般情况下,主人与宠物为双向的情感奔赴,是互为家人的存在。那么喂食器,在可以解决例如主人出差宠物喂食等问题的情况下,是否可以解决主人与宠物的互动呢?比如为宠物喂食器可以加入视频沟通,语音交流等,但宠物毕竟不懂人类语言,更多的还是提示类的动作或声音等指令。那么智能家具将会显得格外重要,比如宠物因为距离喂食器太远,而无法获得进食指令时,那么在宠物附近的智能家具可以在联网情况下,该家具可以获得宠物智能喂食器的提示宠物进食的指令信号,从而做出动作提醒宠物进食。在未来的几十年发展过程当中,宠物喂食器的生产和发展可以非常满足人们未来的生活需要,不但节能环保,更加便捷人们的生活。在构建宠物智能喂食器建设当中一定要依靠坚实的信息基础和相关的体系保障,在构建的过程当中一定要结合信息基础保障信息资源得到充分有效的利用,并且将信息化的好处覆盖到更多个方面,促使人们的生活更加的便捷,享受到信息化社会带来的便利条件。
参考文献张世清,钟麟,王许鹏.基于STM32的宠物喂食系统设计[J].无线互联科技,2021,18(01):40-42.周锦荣,张振宇,袁忠强.家居宠物智能喂食管理控制系统设计与应用[J].家畜生态学报,2019,40(04):77-80.邝华款.远程智能的宠物照料系统开发与应用[J].无线互联科技,2022,19(08):40-41.王凝.关于宠物喂食器的智能化发展趋势及设计方案研究[J].科技与创新,2022(11):93-95.洪熠,徐婷,何睿,罗彬,朱苍璐.基于STM32单片机的智能宠物系统的未来发展[J].电脑知识与技术,2021,17(14):199-200.长虹产品设计中心.智能化时代的家电产品设计与管理[J].北京理工大学出版社,2015.夏进军,赵佳妮.基于情感化设计层次理论的智能宠物创新设计[J].包装工程,2017,38(6):123-128.朱庆祥,潘锁.家庭智能宠物喂食器造型设计[J].机械设计,2016,33(4):130.2019(6).蒋一明.从专利视角分析宠物智能监控技术的发展现状[J].电视技术,2017,41(9/10):92-95.曹妍.基于单片机的智能宠物喂食器设计[J].电子技术,2021,50(09):32-33.胡名睿,郝晓健,王昊辰,李佳静,周雨笛,张小辉.基于互联网+及云存储的宠物自动喂食嵌入式系统[J].电子制作,2021(11):64-67.魏忠强.智能化的家养宠物喂食器设计要点探讨[J].新型工业化,2022,12(04):18-21+26.白亚梅.智能化的家养宠物喂食器设计[J].电子世界,2021(06):192-193.杨庆.以情感需求为导向的智能宠物猫喂食器设计研究[D].青岛大学,2020.孟艳艳,陈伟海,贾长洪,赵敬芬.智能宠物喂食喂水系统研究与设计[J].中国高新科技,2020(21):137-141.Patents;"PetFeedingRobot.AutomaticPetWetFoodDispenserRobot"inPatentApplicationApprovalProcess[J].Robotics&MachineLearning,2013.Shyh-KuangUeng,Guan-ZhiChen.Visionbasedmulti-userhumancomputerinteraction[J].MultimediaToolsandApplications,2016,Vol.75(16),pp.10059-10076TaeHoWoo.NanoscopicdesignsofradiologicalprotectioninenvironmentalscalefortheFukushimanuclearaccident:Strategybydispersion,dissolution,andfiltration[J].AnnalsofNuclearEnergy,2016,87.ArduinobasedPETFeedingAutomation[J].InternationalJournalofInnovativeTechnologyandExploringEngineering,2019,8(11).G.Landsberg,W.Hunthausen,L.Ackerman.BehaviorProblemsoftheDogandCat[M].附录电路图源代码#include"delay.h"#include"sys.h"#include"timer.h"#include"usart.h"#include"24l01.h"#include"spi.h"#include"oled.h"#include"bmp.h"#include"dht11.h"#include"ds1302.h"#definejdq1PBout(5)//PC13 #definejdq2PBout(6)//#definejdq3PBout(7)#definejdq4PBout(8)#defineLEDPCout(13)#definebeepPBout(9)//蜂鸣器#definePC15GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15)#definekey5GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)//湿度+#definekey6GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//湿度-#definekey7GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)//湿度+#definekey8GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//湿度-#definekey1GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)//温度+#definekey2GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)//温度-#definekey3GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)//温度+#definekey4GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)//温度-//unsignedcharsp_d[]="00%RH";unsignedcharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L;//unsignedcharwd[]="00.0c00.0%rh";;//unsignedcharset_wd[]="00s";//unsignedcharset_sd[]="80%RH";externunsignedchartime_buf[8];//????externunsignedcharreadtime[20];//当前时间externunsignedcharly_dat;externunsignedcharly_dat2;unsignedintdq_time=0;//读取到的时间换算成分钟unsignedintnz_time=0;unsignedintmode_xz=0;u16hw=0;unsignedcharset_time[30]={0,0,0};unsignedintks_flg=0;unsignedintks_cot=0;u16msHcCount=0;//定时器中断计数unsignedcharfm_flg=0;unsignedcharwd_xs[]="00.0c00.0%rh";unsignedcharfs_xs[]="温度:00.0c湿度:00.0%rh";unsignedcharset_wd[]="30c60%";unsignedchards_time[]="12:20";unsignedcharsx_wd=30,xx_wd=10,sx_sd=60,xx_sd=30;unsignedintsetval1=0,setval2=80;unsignedcharxs_time[]="00:00:00";externunsignedcharrc_dat[20];externunsignedcharrc_dat2[10];voiddde(u16time){u16i=0; while(time--) {i=12000; while(i--); }}voidGPIO_Config(void)//配置PA2,PA3{GPIO_InitTypeDefGPIO_InitStructure;/*GPIOAclockenable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);///*GPIOAConfiguration:TIM3channel1and2asalternatefunctionpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //LED0-->PC.13端口配置 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC,&GPIO_InitStructure); //根据设定参数初始化GPIOC.13 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //??GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M????GPIO_Init(GPIOA,&GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15; //LED0-->PC.13端口配置// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //推挽输出// //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHz// GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //LED0-->PC.13端口配置 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB,&GPIO_InitStructure); //根据设定参数初始化GPIOC.13 // GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;//摁键初始化//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //??////GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M????//GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //??//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50M????GPIO_Init(GPIOB,&GPIO_InitStructure); beep=1;jdq1=0;jdq2=0;jdq3=0;jdq4=0;}voidsend(unsignedchardata){USART1->DR=data;while((USART1->SR&0X40)==0);//等待发送结束}voidsen3_str(unsignedchar*dat){while(*dat!='\0'){send(*dat); dat++;}}voidDelay_Ms(uint16_ttime)//毫秒延时{uint16_ti,j;for(i=0;i<time;i++)for(j=0;j<10260;j++);}//voidqj_led()//{// OLED_ShowChinese(47,18,0,16);//?// OLED_ShowChinese(65,18,1,16);//?//OLED_Refresh();//}//voidzz_led()//{// OLED_ShowChinese(47,18,4,16);//?// OLED_ShowChinese(65,18,5,16);//?//OLED_Refresh();//}//voidht_led()//{// OLED_ShowChinese(47,18,2,16);//?// OLED_ShowChinese(65,18,3,16);//?//OLED_Refresh();//}//voidyz_led()//{// OLED_ShowChinese(47,18,6,16);//?// OLED_ShowChinese(65,18,7,16);//?//OLED_Refresh();//}//voidtz_led()//{// OLED_ShowChinese(47,18,8,16);//停// OLED_ShowChinese(65,18,9,16);//止//OLED_Refresh();//} unsignedcharwd_flg=0;unsignedcharsd_flg=0;voidbjhs(){if(U8T_data_H>sx_wd&&wd_flg!=1){jdq1=1;jdq2=0;wd_flg=1;}if(U8T_data_H<xx_wd&&wd_flg!=2){jdq1=0;jdq2=1; wd_flg=2;}if(U8T_data_H<=sx_wd&&U8T_data_H>=xx_wd&&wd_flg!=3){jdq1=0;jdq2=0; wd_flg=3;}if(U8RH_data_H>sx_sd&&sd_flg!=1){jdq3=1;jdq4=0;sd_flg=1;}if(U8RH_data_H<xx_sd&&sd_flg!=2){jdq3=0;jdq4=1; sd_flg=2;}if(U8RH_data_H<=sx_sd&&U8RH_data_H>=xx_sd&&sd_flg!=3){jdq3=0;jdq4=0; sd_flg=3;}}//voidjpsz()//{//if(key1==0)//{//if(sx_wd<50)// {// sx_wd++;// set_wd[0]=sx_wd/10+'0';// set_wd[1]=sx_wd%10+'0';// OLED_ShowString(0,18,set_wd,16);//// OLED_Refresh();// dde(200);// }//////}//elseif(key2==0)//{//if(sx_wd>xx_wd)// {// sx_wd--;// set_wd[0]=sx_wd/10+'0';// set_wd[1]=sx_wd%10+'0';// // OLED_ShowString(0,18,set_wd,16);// OLED_Refresh();// dde(200);// }//////}//if(key3==0)//{//if(xx_wd<sx_wd)// {// xx_wd++;// set_wd[4]=xx_wd/10+'0';// set_wd[5]=xx_wd%10+'0';// OLED_ShowString(0,18,set_wd,16);//OLED_Refresh(); // dde(200);// }//////}//elseif(key4==0)//{//if(xx_wd>0)// {// xx_wd--;// set_wd[4]=xx_wd/10+'0';// set_wd[5]=xx_wd%10+'0';// // OLED_ShowString(0,18,set_wd,16);// OLED_Refresh();// dde(200);// }//////}//if(key5==0)//{//if(sx_sd<99)// {// sx_sd++;// set_wd[8]=sx_sd/10+'0';// set_wd[9]=sx_sd%10+'0';// OLED_ShowString(0,18,set_wd,16);//// OLED_Refresh();// dde(200);// }//////}//elseif(key6==0)//{//if(sx_sd>xx_sd)// {// sx_sd--;// set_wd[8]=sx_sd/10+'0';// set_wd[9]=sx_sd%10+'0';// // OLED_ShowString(0,18,set_wd,16);// OLED_Refresh();// dde(200);// }//////}//if(key7==0)//{//if(xx_sd<sx_sd)// {// xx_sd++;// set_wd[12]=xx_sd/10+'0';// set_wd[13]=xx_sd%10+'0';// OLED_ShowString(0,18,set_wd,16);//// OLED_Refresh();// dde(200);// }//////}//elseif(key8==0)//{//if(xx_sd>0)// {// xx_sd--;// set_wd[12]=xx_sd/10+'0';// set_wd[13]=xx_sd%10+'0';// // OLED_ShowString(0,18,set_wd,16);// OLED_Refresh();// dde(200);// }//////}//}voidjdsj()//校对时间{time_buf[4]=((rc_dat2[0]-'0')<<4)+(rc_dat2[1]-'0'); time_buf[5]=((rc_dat2[3]-'0')<<4)+(rc_dat2[4]-'0'); time_buf[6]=((rc_dat2[6]-'0')<<4)+(rc_dat2[7]-'0'); ds1302_write_time();}voidsz_time(){//time_buf[0]=((set_time[0]-'0')<<4)+(set_time[1]-'0');// time_buf[1]=((set_time[2]-'0')<<4)+(set_time[3]-'0');// time_buf[2]=((set_time[4]-'0')<<4)+(set_time[5]-'0');// time_buf[3]=((set_time[6]-'0')<<4)+(set_time[7]-'0'); time_buf[4]=((set_time[0]-'0')<<4)+(set_time[1]-'0'); time_buf[5]=((set_time[2]-'0')<<4)+(set_time[3]-'0'); time_buf[6]=((set_time[4]-'0')<<4)+(set_time[5]-'0'); ds1302_write_time();}voidsj_dq()//读取时间参数{unsignedinti=0;ds1302_read_time();//????readtime[0]=(time_buf[0]>>4)+'0';readtime[1]=(time_buf[0]&0x0F)+'0';readtime[2]=(time_buf[1]>>4)+'0';readtime[3]=(time_buf[1]&0x0F)+'0'; readtime[4]=(time_buf[2]>>4)+'0';readtime[5]=(time_buf[2]&0x0F)+'0';readtime[6]=(time_buf[3]>>4)+'0';readtime[7]=(time_buf[3]&0x0F)+'0';readtime[8]=(time_buf[4]>>4)+'0';//小时十位readtime[9]=(time_buf[4]&0x0F)+'0';//小时个位readtime[10]=(time_buf[5]>>4)+'0';//分钟十位readtime[11]=(time_buf[5]&0x0F)+'0';//分钟个位readtime[12]=(time_buf[6]>>4)+'0';//秒十位readtime[13]=(time_buf[6]&0x0F)+'0';//秒个位dq_time=((readtime[8]-'0')*10+readtime[9]-'0')*60+((readtime[10]-'0')*10+readtime[11]-'0');// for(i=0;i<14;i++)//send(readtime[i]); xs_time[0]=readtime[8];xs_time[1]=readtime[9];xs_time[3]=readtime[10];xs_time[4]=readtime[11];xs_time[6]=readtime[12];xs_time[7]=readtime[13];OLED_ShowString(26,32,xs_time,16);//???? OLED_Refresh();}u8dz_flg=0;floataa=0;unsignedcharbb=0;intmain(void){ u8tmp_buf[33];unsignedcharws_flg=0; u8move_sta=0;floatjl=0;unsignedchartemp=0,sd_dat=0;shorttemperature;unsignedintbj_wd=0;unsignedintbj_sd=0; SystemInit();// delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 GPIO_Config(); //LED,PWM端口初始化,配置PA2,PA3PA4PA5 //TIM2_PWM_Init(47999,2); //分频。最小单位钟频率=72000000/(2+1)=24MhzTIM2_PWM_Init(199,7199); uart_init(9600); //串口初始化为9600beep=0; dde(500); OLED_Init();OLED_ColorTurn(0);//0正常显示,1反色显示OLED_DisplayTurn(0);//0正常显示1屏幕翻转显示OLED_ShowString(0,0,wd_xs,16);//???? OLED_ShowString(0,16,set_wd,16);//???? OLED_ShowString(46,48,ds_time,16);//???? OLED_Refresh(); DS1302_GPIOInit(); dde(300); //ds1302_write_time(); dde(200); while(DHT11_Init()); TIM_SetCompare3(TIM2,5); TIM3_Int_Init(499,7199);//设置定时器3中断,50ms中断一次; while(1) { if(mode_xz==0) { if(key6==0) {TIM_SetCompare3(TIM2,20); beep=1; ws_flg=1; } if(ws_flg==3) { beep=0; ws_flg=0; } if(key7==0) {TIM_SetCompare3(TIM2,5); beep=0; ws_flg=0; } } if(ly_dat==1) { mode_xz=rc_dat[0]-'0'; ds_time[0]=rc_dat[1]; ds_time[1]=rc_dat[2]; ds_time[3]=rc_dat[3]; ds_time[4]=rc_dat[4]; set_wd[0]=rc_dat[5]; set_wd[1]=rc_dat[6]; set_wd[6]=rc_dat[7]; set_wd[7]=rc_dat[8]; sx_wd=(rc_dat[5]-'0')*10+(rc_dat[6]-'0'); sx_sd=(rc_dat[7]-'0')*10+(rc_dat[8]-'0'); nz_time=((ds_time[0]-'0')*10+ds_time[1]-'0')*60+((ds_time[3]-'0')*10+ds_time[4]-'0'); ly_dat=0; OLED_ShowString(0,16,set_wd,16);//???? OLED_ShowString(46,48,ds_time,16);//???? OLED_Refresh(); } if(ly_dat2==1) { jdsj(); ly_dat2=0; } if(msHcCount>=20)//1秒钟读取温湿度一次{ if(ws_flg>0&&ws_flg<20) ws_flg++; DHT11_Read_Data(&U8T_data_H,&U8T_data_L,&U8RH_data_H,&U8RH_data_L); wd_xs[0]=U8T_data_H/10+'0'; wd_xs[1]=U8T_data_H%10+'0'; wd_xs[3]=U8T_data_L%10+'0'; wd_xs[8]=U8RH_data_H/10+'0'; wd_xs[9]=U8RH_data_H%10+'0';wd_xs[11]=U8RH_data_L%10+'0'; fs_xs[5]=wd_xs[0]; fs_xs[6]=wd_xs[1]; fs_xs[8]=wd_xs[3]; fs_xs[9]=wd_xs[4];fs_xs[16]=wd_xs[8]; fs_xs[17]=wd_xs[9]; fs_xs[18]=wd_xs[10]; fs_xs[19]=wd_xs[11]; OLED_ShowString(0,0,wd_xs,16);//???? OLED_Refresh();if(U8T_data_H>=sx_wd) { jdq1=1; } else jdq1=0; if(U8RH_data_H>=sx_sd) { jdq2=1; } else jdq2=0; sj_dq(); if(mode_xz==1) {if(nz_time==dq_time) {TIM_SetCompare3(TIM2,20); beep=1; ws_flg=1; nz_time=0; } else {TIM_SetCompare3(TIM2,5); beep=0; } if(ws_flg==5) { beep=0; ws_flg=0; } } msHcCount=0;sen3_str(fs_xs);// bjhs(); } switch(ly_dat) { case'A':jdq1=1;break; case'B':jdq1=0;break; case'C':jdq2=1;break; case'D':jdq2=0;break; case'E':jdq3=1;break; case'F':jdq3=0;break; case'G':jdq4=1;break; case'H':jdq4=0;break; } //jpsz(); }}voidTIM3_IRQHandler(void)//TIM3中断{ if(msHcCount<20) msHcCount++; if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//检查TIM3更新中断发生与否 { //msHcCount++; TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志 }}/**/*Includes*/#include"stm32f10x_it.h"voidNMI_Handler(void){}voidHardFault_Handler(void){/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/while(1){}}voidMemManage_Handler(void){/*GotoinfiniteloopwhenMemoryManageexceptionoccurs*/while(1){}}voidBusFault_Handler(void){/*GotoinfiniteloopwhenBusFaultexceptionoccurs*/while(1){}}voidUsageFault_Handler(void){/*GotoinfiniteloopwhenUsageFaultexceptionoccurs*/while(1){}}voidSVC_Handler(void){}voidDebugMon_Handler(void){}voidPendSV_Handler(void){}voidSysTick_Handler(void){}/******************************************************************************/#include"dht11.h"#include"delay.h"//复位DHT11voidDHT11_Rst(void) { DHT11_IO_OUT(); //SETOUTPUTDHT11_DQ_OUT=0; //拉低DQdelay_ms(20); //拉低至少18msDHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us}//等待DHT11的回应//返回1:未检测到DHT11的存在//返回0:存在u8DHT11_Check(void) { u8retry=0; DHT11_IO_IN();//SETINPUT while(DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return1; elseretry=0;while(!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return1; return0;}//从DHT11读取一个位//返回值:1/0u8DHT11_Read_Bit(void) { u8retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待变高电平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return1; elsereturn0; }//从DHT11读取一个字节//返回值:读到的数据u8DHT11_Read_Byte(void){u8i,dat;dat=0; for(i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit();} returndat;}//从DHT11读取一次数据//temp:温度值(范围:0~50°)//humi:湿度值(范围:20%~90%)//返回值:0,正常;1,读取失败u8DHT11_Read_Data(u8*temp,u8*temp2,u8*humi,u8*humi2){ u8buf[5]; u8i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *humi2=buf[1]; *temp=buf[2]; *temp2=buf[3]; } }elsereturn1; return0; }//初始化DHT11的IO口DQ同时检测DHT11的存在//返回1:不存在//返回0:存在 u8DHT11_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PG端口时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; //PG11端口配置 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化IO口 GPIO_SetBits(GPIOA,GPIO_Pin_4); //PG11输出高 DHT11_Rst();//复位DHT11 returnDHT11_Check();//等待DHT11的回应}#include"oled.h"#include"stdlib.h"#include"oledfont.h" #include"delay.h"u8OLED_GRAM[144][8];//反显函数voidOLED_ColorTurn(u8i){ if(i==0) { OLED_WR_Byte(0xA6,OLED_CMD);//正常显示 } if(i==1) { OLED_WR_Byte(0xA7,OLED_CMD);//反色显示 }}//屏幕旋转180度voidOLED_DisplayTurn(u8i){ if(i==0) { OLED_WR_Byte(0xC8,OLED_CMD);//正常显示 OLED_WR_Byte(0xA1,OLED_CMD); } if(i==1) { OLED_WR_Byte(0xC0,OLED_CMD);//反转显示 OLED_WR_Byte(0xA0,OLED_CMD); }}//起始信号voidI2C_Start(void){ OLED_SDIN_Set(); OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr();}//结束信号voidI2C_Stop(void){ OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SDIN_Set();}//等待信号响应voidI2C_WaitAck(void)//测数据信号的电平{ OLED_SCLK_Set(); OLED_SCLK_Clr();}//写入一个字节voidSend_Byte(u8dat){ u8i; for(i=0;i<8;i++) { OLED_SCLK_Clr();//将时钟信号设置为低电平 if(dat&0x80)//将dat的8位从最高位依次写入 { OLED_SDIN_Set();} else { OLED_SDIN_Clr();} OLED_SCLK_Set();//将时钟信号设置为高电平 OLED_SCLK_Clr();//将时钟信号设置为低电平 dat<<=1;}}//发送一个字节//向SSD1306写入一个字节。//mode:数据/命令标志0,表示命令;1,表示数据;voidOLED_WR_Byte(u8dat,u8mode){ I2C_Start(); Send_Byte(0x78); I2C_WaitAck(); if(mode){Send_Byte(0x40);}else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度城市综合体开发代理佣金合同
- 漯河2024年河南漯河市委网信办所属事业单位人才引进3人笔试历年参考题库附带答案详解
- 湖北2025年湖北武汉纺织大学人才引进120人笔试历年参考题库附带答案详解
- 永州2025年湖南永州市零陵区引进急需紧缺专业人才66人笔试历年参考题库附带答案详解
- 2025年中国小便盆市场调查研究报告
- 2025年中国单相共差模电涌保护器市场调查研究报告
- 2025年中国LED方形灯市场调查研究报告
- 2025至2031年中国铜徽章行业投资前景及策略咨询研究报告
- 2025年海绵清洁块项目可行性研究报告
- 2025年机械手式水冷碳氧枪系统项目可行性研究报告
- 风险分级管控和隐患排查治理体系培训考试试题(附答案)
- 生鲜超市未来工作计划
- 北京市大兴区2023-2024学年七年级下学期期中考试英语试卷
- 劳动合同薪酬与绩效约定书
- 消除医疗歧视管理制度
- JT-T-1180.2-2018交通运输企业安全生产标准化建设基本规范第2部分:道路旅客运输企业
- QCT848-2023拉臂式自装卸装置
- 2024交管12123驾照学法减分必考题库附答案
- 脑脊液常规检查
- 2024年苏州经贸职业技术学院单招职业适应性测试题库附答案
- 柴油机油-标准
评论
0/150
提交评论