【雕爷学编程】MicroPython手册之 哥伦布 STM32F407 DAC (数模转换)_micropython dac-程序员宅基地

技术标签: stm32  MicroPython手册  python  STM32F407  哥伦布 DAC 数模转换  嵌入式硬件  MicroPython  单片机  

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
哥伦布(Columbus)是指STMicroelectronics推出的一款微控制器系列,其中STM32F407是该系列中的一款型号。下面是关于STM32F407微控制器的详细技术参数:

1、核心处理器:
ARM Cortex-M4核心,具有单周期乘法和硬件除法指令支持。
最高频率可达168 MHz,提供快速的计算和执行能力。
2、存储和存储器:
1 MB的Flash存储器,用于程序代码的存储。
192 KB的SRAM,用于数据存储和变量缓存。
可选的外部存储器接口(如SD卡、NAND闪存等)。
3、外设:
多个通用输入/输出引脚(GPIO):用于连接外部设备和传感器。
多个串行通信接口:包括USART、SPI和I2C等,用于与其他设备进行通信。
USB接口:用于连接外部设备,如计算机或其他USB设备。
定时器和计数器:包括通用定时器、高级定时器和基本定时器,用于定时和计数操作。
模数转换器(ADC):用于模拟信号的采样和转换。
数字模拟转换器(DAC):用于数字信号的模拟输出。
PWM输出:用于产生脉冲宽度调制信号,控制电机和其他执行器。
外部中断:用于检测和响应外部触发事件。
4、电源和时钟:
工作电压范围:通常为1.8V至3.6V,具体型号可能有所不同。
内部时钟源:包括高精度内部振荡器(HSI)和外部晶体振荡器(HSE)。
低功耗模式:支持多种低功耗模式,以延长电池寿命或降低功耗。
5、封装和引脚:
可用的封装类型:LQFP、LFBGA等。
引脚数量和配置:具体取决于型号和封装类型。
6、开发支持:
提供开发工具链和集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench等。
支持多种编程语言,如C和汇编语言。
提供丰富的开发文档、参考手册和示例代码。

需要注意的是,以上列出的技术参数是一般性的描述,具体的技术参数可能因具体的STM32F407型号和封装类型而有所不同。对于特定型号和应用场景,建议查阅STMicroelectronics官方文档和相关资料以获取准确和详尽的技术参数。

在这里插入图片描述

MicroPython的哥伦布(STM32F407)开发板支持数模转换(DAC)功能,下面将以专业的视角为您详细解释DAC的主要特点、应用场景以及需要注意的事项。

主要特点:

数字信号转模拟信号:DAC模块可以将数字信号转换为模拟信号。通过将数字数值转换为相应的模拟电压或电流输出,DAC模块可以实现对模拟电路的控制和驱动。

高精度和分辨率:哥伦布开发板的DAC模块通常具备高精度和分辨率,能够提供准确的模拟输出信号。DAC的分辨率表示可以输出的模拟量级的精度,较高的分辨率可以提供更精细的输出信号。

多通道支持:哥伦布开发板的DAC模块通常支持多个输出通道,可以同时控制多个模拟输出信号。每个通道都可以独立配置输出电压或电流范围,以满足不同的应用需求。

应用场景:

音频信号生成:DAC模块广泛应用于音频信号生成领域。通过将数字音频数据转换为模拟信号,DAC模块可以实现音频播放、音乐合成、语音合成等功能。

波形发生器:DAC模块可以用于产生各种波形信号,如正弦波、方波、三角波等。通过调整DAC输出数值,可以实现不同频率、振幅和相位的波形发生器功能。

传感器模拟输出:DAC模块可以用于模拟传感器输出信号。通过DAC输出模拟电压或电流,可以模拟传感器的输出行为,方便进行系统调试和测试。

需要注意的事项:

输出范围选择:DAC模块通常需要设置输出电压或电流的范围。在使用DAC之前,需要确定合适的输出范围,并将其配置到DAC模块中。

输出负载能力:DAC模块的输出引脚通常有一定的负载能力限制。在选择DAC输出引脚时,需要确保其能够提供足够的电流和驱动能力,以满足连接设备的需求。

采样速率和精度:在使用DAC时,需要根据应用需求选择适当的采样速率和精度。较高的采样速率和精度可以提供更精确和平滑的模拟输出信号,但同时也会增加系统资源的消耗。

综上所述,MicroPython的哥伦布开发板支持数模转换(DAC)功能,具有数字信号转模拟信号、高精度和分辨率,以及多通道支持等特点。DAC广泛应用于音频信号生成、波形发生器、传感器模拟输出等场景。在使用DAC时,需要注意输出范围选择、输出负载能力,以及采样速率和精度的设置。

案例一:使用MicroPython控制STM32F407的DAC输出正弦波

from machine import Pin, DAC
import time
import math

# 初始化DAC和GPIO
dac = DAC(Pin(0))  # 使用PA0引脚
dac.write(0)  # 设置DAC初始值

# 生成正弦波数据
def generate_sine_wave(freq, amplitude, duration):
    num_samples = int(duration * 44100)  # 采样点数
    samples = [int(amplitude * math.sin(2 * math.pi * freq * i / 44100)) for i in range(num_samples)]
    return samples

# 主循环
while True:
    freq = 1000  # 频率为1000Hz
    amplitude = 32767  # 振幅为32767
    duration = 5  # 持续5秒

    sine_wave = generate_sine_wave(freq, amplitude, duration)

    # 将正弦波数据写入DAC
    for sample in sine_wave:
        dac.write(sample)
        time.sleep_ms(1)  # 延时1毫秒,控制采样间隔

要点解读:
导入所需的库:machine、time、math。
初始化DAC和GPIO:使用Pin和DAC类分别创建DAC对象和GPIO对象。
生成正弦波数据:定义一个函数generate_sine_wave,输入参数为频率、振幅和持续时间,返回一个包含采样点的列表。
主循环:在循环中,设置频率、振幅和持续时间,然后调用generate_sine_wave函数生成正弦波数据。接着,遍历正弦波数据,将其写入DAC,并控制采样间隔。

案例二:使用MicroPython控制STM32F407的DAC输出方波

from machine import Pin, DAC
import time

# 初始化DAC和GPIO
dac = DAC(Pin(0))  # 使用PA0引脚
dac.write(0)  # 设置DAC初始值

# 生成方波数据
def generate_square_wave(duty_cycle, duration):
    num_samples = int(duration * 44100)  # 采样点数
    samples = [int(duty_cycle * 32767) for i in range(num_samples // 2)] + \
              [int((1 - duty_cycle) * 32767) for i in range(num_samples // 2)]
    return samples

# 主循环
while True:
    duty_cycle = 0.5  # 占空比为0.5(即高电平时间为低电平时间的两倍)
    duration = 5  # 持续5秒

    square_wave = generate_square_wave(duty_cycle, duration)

    # 将方波数据写入DAC
    for sample in square_wave:
        dac.write(sample)
        time.sleep_ms(1)  # 延时1毫秒,控制采样间隔

要点解读:
导入所需的库:machine、time。
初始化DAC和GPIO:使用Pin和DAC类分别创建DAC对象和GPIO对象。
生成方波数据:定义一个函数generate_square_wave,输入参数为占空比和持续时间,返回一个包含采样点的列表。
主循环:在循环中,设置占空比和持续时间,然后调用generate_square_wave函数生成方波数据。接着,遍历方波数据,将其写入DAC,并控制采样间隔。

案例三:使用MicroPython控制STM32F407的DAC输出三角波

from machine import Pin, DAC
import time
import math

# 初始化DAC和GPIO
dac = DAC(Pin(0))  # 使用PA0引脚
dac.write(0)  # 设置DAC初始值

# 生成三角波数据
def generate_triangle_wave(freq, amplitude, duration):
    num_samples = int(duration * 44100)  # 采样点数
    samples = []
    for i in range(num_samples):
        value = int(amplitude * (4 * i / num_samples - 2) * math.sqrt(2))
        samples.append(value)
    return samples

# 主循环
while True:
    freq = 1000  # 频率为1000Hz
    amplitude = 32767  # 振幅为32767
    duration = 5  # 持续5秒

    triangle_wave = generate_triangle_wave(freq, amplitude, duration)

    # 将三角波数据写入DAC
    for sample in triangle_wave:
        dac.write(sample)
        time.sleep_ms(1)  # 延时1毫秒,控制采样间隔

要点解读:
导入所需的库:machine、time、math。
初始化DAC和GPIO:使用Pin和DAC类分别创建DAC对象和GPIO对象。
生成三角波数据:定义一个函数generate_triangle_wave,输入参数为频率、振幅和持续时间,返回一个包含采样点的列表。
主循环:在循环中,设置频率、振幅和持续时间,然后调用generate_triangle_wave函数生成三角波数据。接着,遍历三角波数据,将其写入DAC,并控制采样间隔。

案例四:用DAC输出三角波
在这个示例中,我们通过DAC输出三角波。在代码中,我们使用MicroPython的HAL库来控制DAC,并通过循环来不断更新DAC的输出值。具体的代码如下:

import machine  
import time  
  
# 初始化DAC  
dac = machine.DAC(0)  # 假设我们使用的是DAC0通道  
  
# 设置三角波的频率  
freq = 1000  # 频率为1Hz  
  
# 初始化计数器和当前值  
cnt = 0  
curr_value = 0  
  
# 通过循环输出三角波  
while True:  
    cnt += 1  
    curr_value += (cnt % 2) * (50000 // freq)  # 根据频率调整步进  
    dac.value(curr_value)  # 将当前值输出到DAC  
    time.sleep(0.001)  # 等待一段时间以调整频率

在这个示例中,我们通过一个计数器来记录循环次数,并根据计数器的奇偶性来改变步进值,从而输出一个三角波。

案例五:用DAC控制LED亮度
在这个示例中,我们通过DAC控制LED的亮度。在代码中,我们通过设置DAC的输出值来调整LED的亮度。具体的代码如下:

import machine  
import time  
  
# 初始化DAC  
dac = machine.DAC(0)  # 假设我们使用的是DAC0通道  
  
# 设置初始亮度  
brightness = 50000  # 初始亮度为50%  
  
# 通过循环控制LED亮度  
while True:  
    for i in range(10):  # 循环10次以产生渐变效果  
        dac.value(brightness)  # 将亮度输出到DAC  
        time.sleep(0.1)  # 等待一段时间以调整亮度  
        brightness += 100  # 增加亮度步进

在这个示例中,我们通过循环来不断更新DAC的输出值,从而控制LED的亮度。我们可以通过调整步进值和等待时间来控制亮度的变化速度。

案例六:用DAC采集模拟信号
在这个示例中,我们通过DAC采集模拟信号。在代码中,我们通过读取DAC的输出值来获取模拟信号的值。具体的代码如下:

import machine  
import time  
  
# 初始化DAC  
dac = machine.DAC(0)  # 假设使用的是DAC0通道  
  
# 设置初始值  
initial_value = 0  # 初始值为0  
  
# 循环采集模拟信号的值  
while True:  
    value = dac.value()  # 读取DAC的输出值  
    if initial_value == 0:  # 如果还没有初始化,则记录初始值  
        initial_value = value  
    value -= initial_value  # 减去初始值以得到相对值  
    print(value)  # 输出模拟信号的值  
    time.sleep(0.1)  # 等待一段时间以采集下一个值

需要注意的是,该代码仅为示例代码,具体的实现可能会因硬件平台、DAC型号等因素而有所不同。因此,在实际应用中,需要根据具体的硬件平台和DAC型号进行相应的调整。

案例七:控制LED亮度:

import pyb

dac = pyb.DAC(1)  # 使用DAC1输出

while True:
    for i in range(0, 4096, 100):  # 从0增加到最大值,步长为100
        dac.write(i)
        pyb.delay(10)

要点解读:
该代码使用pyb模块控制STM32F407上的DAC,通过DAC输出控制LED的亮度。
使用pyb.DAC(1)创建一个DAC对象,指定要使用的DAC通道(这里使用DAC1)。
在主循环中,使用dac.write(i)将递增的值写入DAC输出,从而控制LED的亮度。
使用pyb.delay(10)延迟10毫秒,然后再次更新DAC输出值。
这个示例演示了如何使用DAC控制LED的亮度,通过改变DAC输出值来改变LED的亮度。

案例八:产生音频信号:

import pyb

dac = pyb.DAC(1)  # 使用DAC1输出

notes = [262, 294, 330, 349, 392, 440, 494, 523]  # 音符频率

while True:
    for note in notes:
        for i in range(200):  # 生成200个采样点
            value = int(2047 * (1 + math.sin(i * note * 2 * math.pi / 440)))
            dac.write(value)
            pyb.delay(1)

要点解读:
该代码使用pyb模块控制STM32F407上的DAC,通过DAC输出产生音频信号。
使用pyb.DAC(1)创建一个DAC对象,指定要使用的DAC通道(这里使用DAC1)。
定义了一个音符频率列表notes,用于播放不同的音符。
在主循环中,通过计算正弦函数的值生成音频信号的采样点,并将其写入DAC输出。
使用pyb.delay(1)延迟1毫秒,然后再次生成下一个采样点。
这个示例演示了如何使用DAC输出产生音频信号,通过改变DAC输出值来产生不同音符的声音。

案例九:控制电机速度:

import pyb

dac = pyb.DAC(1)  # 使用DAC1输出

while True:
    for i in range(0, 4096, 100):  # 从0增加到最大值,步长为100
        dac.write(i)
        pyb.delay(10)
    
    pyb.delay(1000)  # 延迟1秒
    
    for i in range(4095, -1, -100):  # 从最大值减小到0,步长为100
        dac.write(i)
        pyb.delay(10)
    
    pyb.delay(1000)  # 延迟1秒

要点解读:
该代码使用pyb模块控制STM32F407上的DAC,通过DAC输出控制电机的速度。
使用pyb.DAC(1)创建一个DAC对象,指定要使用的DAC通道(这里使用DAC1)。
在主循环中,通过递增和递减的方式改变DAC输出值,从而控制电机的速度。
使用pyb.delay(10)延迟10毫秒,然后再次更新DAC输出值。
使用pyb.delay(1000)延迟1秒钟,然后切换方向并再次改变DAC输出值。
这个示例演示了如何使用DAC控制电机的速度,通过改变DAC输出值来控制电机的转速和方向。

案例十:生成正弦波

import pyb
import math

dac = pyb.DAC(1)

while True:
    for i in range(360):
        angle = math.radians(i)
        value = int((math.sin(angle) + 1) * 2048)  # 将正弦波映射到0-4095的DAC值范围
        dac.write(value)
        pyb.delay(1)

要点解读:
该程序使用MicroPython在STM32F407上使用DAC生成正弦波。
使用pyb模块的DAC类初始化一个DAC对象,参数1表示使用DAC通道1。
在一个无限循环中,通过计算正弦波的值,并将其映射到DAC的值范围(0-4095)。
使用write()方法将计算得到的值写入DAC。
使用delay()函数延时1毫秒,控制正弦波的频率。

案例十一:控制LED的亮度

import pyb

led_pin = pyb.Pin('PB0', pyb.Pin.OUT)
dac = pyb.DAC(1)

while True:
    for value in range(0, 4096, 100):
        dac.write(value)
        pyb.delay(100)

要点解读:
该程序使用MicroPython在STM32F407上使用DAC控制LED的亮度。
使用pyb模块的Pin类初始化一个Pin对象,'PB0’表示使用PB0引脚控制LED输出。
使用pyb模块的DAC类初始化一个DAC对象,参数1表示使用DAC通道1。
在一个无限循环中,通过调整DAC的输出值(从0到4095以100的步长),控制LED的亮度。
使用delay()函数延时100毫秒,使每个亮度级别保持一段时间。

案例十二:控制电机的转速

import pyb

motor_pin = pyb.Pin('PA0', pyb.Pin.OUT)
dac = pyb.DAC(1)

while True:
    for value in range(0, 4096, 100):
        dac.write(value)
        pyb.delay(1000)

要点解读:

该程序使用MicroPython在STM32F407上使用DAC控制电机的转速。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚控制电机。
使用pyb模块的DAC类初始化一个DAC对象,参数1表示使用DAC通道1。
在一个无限循环中,通过调整DAC的输出值(从0到4095以100的步长),控制电机的转速。
使用delay()函数延时1秒,使每个转速级别保持一段时间。

这些示例代码展示了MicroPython在哥伦布(STM32F407)上使用DAC的实际运用。第一个示例演示了如何使用DAC控制LED的亮度,通过改变DAC输出值来改变LED的亮度。第二个示例演示了如何通过DAC输出产生音频信号,通过改变DAC输出值来产生不同音符的声音。第三个示例演示了如何使用DAC控制电机的速度,通过改变DAC输出值来控制电机的转速和方向。通过这些示例,您可以了解如何使用pyb模块在哥伦布(STM32F407)上实现DAC输出,并实现LED亮度控制、音频信号生成和电机速度控制等功能。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41659040/article/details/133876308

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search