Arduino程序设计(六)蜂鸣器实验

news2024/11/27 11:49:47

蜂鸣器实验

  • 前言
  • 一、蜂鸣器简介
    • 1、蜂鸣器的工作原理
    • 2、有源蜂鸣器和无源蜂鸣器的区别
    • 3、蜂鸣器模块电路原理图
  • 二、有源蜂鸣器实验
    • 有源蜂鸣器控制
  • 三、无源蜂鸣器实验
    • 1、调节蜂鸣器输出频率
    • 2、无源蜂鸣器触发报警声
    • 3、无源蜂鸣器播放音乐
  • 参考资料


前言

  • 本文主要介绍两种蜂鸣器的区别和蜂鸣器控制实验,主要内容包括:
  • 1、有源蜂鸣器和无源蜂鸣器的工作原理及主要区别;
  • 2、有源蜂鸣器实验主要介绍有源蜂鸣器的控制;
  • 3、无源蜂鸣器实验分为三个实验,分别为调节蜂鸣器输出频率、无源蜂鸣器触发报警声及无源蜂鸣器播放音乐。

一、蜂鸣器简介

1、蜂鸣器的工作原理

  • (1)有源蜂鸣器:
  • ① 有源蜂鸣器(Active buzzer)内建了一组固定的频率,只要接通电源,就会发出固定的音调。蜂鸣器的源,这里指的是震荡源。也就是说有源蜂鸣器内部带有多谐振荡器,可以产生 1.5kHZ-2.5kHZ 的电压信号,由此有源蜂鸣器才能发声。
  • ② 有源蜂鸣器、无源蜂鸣器的外型很像,一般有源蜂鸣器会在上面贴一个白色贴纸,另外,有源蜂鸣器底部也会有胶封,无源蜂鸣器的底部可以直接看到电路板。有源蜂鸣器往往比无源的贵一点,就是因为里面多个震荡电路。
  • ③ 有源蜂鸣器的优点是,编程控制简单方便,适合大部分的简单使用场景。缺点是只能在固定频率上运行,从而降低了随着应用需求变化而实现备用频率的灵活性。
  • ④ 有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从而实现磁场交变,带动铝片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
  • (2)无源蜂鸣器:
  • ① 无源蜂鸣器(Passive Buzzer)在字义上说,即不带振荡源,在没有振荡电路情况下接上直流电,因输出电压没有变化,蜂鸣器片仍然保持沉默,所以我们需从外接振荡器。
  • ② 优点:首先,零件数量少,售价较低,其次,我们可脱离一般蜂鸣器只可发出单音的局限,自由控制输出声音频率,便可透过编程写出不同音阶和延续时间,合成一首旋律美妙的音乐。
  • ③ 无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给予直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。

2、有源蜂鸣器和无源蜂鸣器的区别

  • 有源蜂鸣器和无源蜂鸣器的区别分为以下6部分,具体内容如下:
  • ① 这里的“源”不是电源,而是指震荡源;
  • ② 有源蜂鸣器内部带震荡源,所以一通电就会叫;
  • ③ 无源蜂鸣器内部不带震荡源,所以用直流信号无法令其鸣叫,必须用2K~5K的方波驱动;
  • ④ 外观不同:如下图所示,左侧带标签纸的是有源蜂鸣器,右侧是无源蜂鸣器;
    在这里插入图片描述
  • ⑤ 高度不同:有源蜂鸣器高度为9mm,而无源蜂鸣器高度为8mm;
  • ⑥ 优点不同:
  • a. 无源蜂鸣器的优点:便宜,声音频率可控,可以做出多来米发索拉西的效果,在一些特例中,可以和LED复用一个控制口;
  • b. 有源蜂鸣器的优点:程序控制方便。

3、蜂鸣器模块电路原理图

  • 带放大功能的蜂鸣器模块原理图,如下图所示:
    在这里插入图片描述

二、有源蜂鸣器实验

有源蜂鸣器控制

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)有源蜂鸣器控制的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:

  • ① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;

  • ② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;

  • ③ 第三次按下按键,重复操作①;

  • ④第四次按下按键,重复操作②,以此类推。

代码实现:

//有源蜂鸣器实验
/*① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;
  ② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;
  ③ 第三次按下按键,重复操作①;
  ④第四次按下按键,重复操作②,以此类推*/

#define LED 9
#define KEY 7
#define Buzzer 11

int KEY_NUM = 0;      //按键键值变量

void setup()
{
  pinMode(LED, OUTPUT);     //LED为IO输出
  pinMode(KEY, INPUT_PULLUP); //按键为IO带上拉输入
  pinMode(Buzzer, OUTPUT);  //蜂鸣器为IO输出
  digitalWrite(Buzzer, LOW); //蜂鸣器初始为不鸣叫
}

void loop()
{
  ScanKey();              //按键扫描
  if (KEY_NUM == 1)       //当有按键按下时
  {
    digitalWrite(LED, !digitalRead(LED)); //LED状态翻转
    BuzzerDi();          //滴一声
  }
}

void ScanKey()
{
  KEY_NUM = 0;
  if (digitalRead(KEY) == LOW)
  {
    delay(20);              //延时去抖动
    if (digitalRead(KEY) == LOW)
    {
      KEY_NUM = 1;        //设置键值
      while (digitalRead(KEY) == LOW); //松手检测
    }
  }
}

void BuzzerDi()
{
  digitalWrite(Buzzer, HIGH);     //蜂鸣器响
  delay(500);                      //延时500ms
  digitalWrite(Buzzer, LOW);      //蜂鸣器关闭
}

三、无源蜂鸣器实验

1、调节蜂鸣器输出频率

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)调节蜂鸣器输出频率的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:电位器调节蜂鸣器输出频率

代码实现:

//无源蜂鸣器实验
//电位器调节蜂鸣器输出频率

#define Pot A0
#define Buzzer 11

int PotBuffer = 0;

void setup()
{
  pinMode(Buzzer,OUTPUT);  //蜂鸣器引脚设定为输出
}

void loop()
{
  PotBuffer = analogRead(Pot);    //读取AD值
  
  for(int i = 0 ; i < 100 ; i++)    //循环100次
  {
    digitalWrite(Buzzer,HIGH);    //设置输出高电平
    delayMicroseconds(PotBuffer); //延时PotBuffer值 us
    digitalWrite(Buzzer,LOW);     //设置输出低电平
    delayMicroseconds(100);       //延时100us
  }

  delay(1000);                    //延时1000ms
}

2、无源蜂鸣器触发报警声

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)无源蜂鸣器触发报警声的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音。

代码实现:

//无源蜂鸣器实验
//按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音

#define KEY 7
#define Buzzer 11

int KEY_num = 0;      //按键按下标志

void setup()
{
  pinMode(KEY, INPUT); //按键为IO输入
  pinMode(Buzzer, OUTPUT);  //蜂鸣器为IO输出
  digitalWrite(Buzzer, LOW); //没有按键按下,蜂鸣器不鸣叫
}

void loop()
{
  ScanKey();              //按键扫描

  //蜂鸣器发出报警声
  if (KEY_num == 1)
  {
    for (int j = 0; j < 100; j++)
    {
      for (int i = 200; i <= 800; i++) //频率不断上升
      {
        tone(Buzzer, i);
        delay(5);
      }
      delay(4000);//保持频率最高的点延迟4秒
      for (int i = 800; i >= 200; i--) //频率在不断下降
      {
        tone(Buzzer, i);
        delay(10);
      }
    }
  }
  else
  {
    noTone(Buzzer);//关闭蜂鸣器
  }
}

void ScanKey()
{
  KEY_num = 0;
  if (digitalRead(KEY) == LOW)
  {
    delay(10);              //延时去抖动
    if (digitalRead(KEY) == LOW)
    {
      KEY_num = 1;      //按键按下标志
      while (digitalRead(KEY) == LOW); //松手检测
    }
  }
}

3、无源蜂鸣器播放音乐

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)无源蜂鸣器播放音乐的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:蜂鸣器播放音乐《天空之城》,伴随LED灯闪烁

代码实现:

//无源蜂鸣器实验
//实现功能:蜂鸣器播放音乐《天空之城》,伴随LED灯闪烁


//定义把每个音符和频率值对应起来
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112

//用英文对应拍子
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625

//整首曲子的音符部分,用了一个序列定义为tune,整数
int tune[] =
{
  NOTE_D0, NOTE_D0, NOTE_D0, NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3,
  NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D3, NOTE_D4, NOTE_D3, NOTE_D4, NOTE_DH1,
  NOTE_D3, NOTE_D3, NOTE_D0, NOTE_DH1, NOTE_DH1, NOTE_DH1, NOTE_D7, NOTE_D4, NOTE_D4, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D0, NOTE_D6, NOTE_D7,
  NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D2, NOTE_D3, NOTE_D4, NOTE_DH1, NOTE_D7, NOTE_D7, NOTE_DH1, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH3, NOTE_DH1, NOTE_DH1, NOTE_DH1,
  NOTE_DH1, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D7, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_DH1, NOTE_DH2, NOTE_DH3, NOTE_DH2, NOTE_DH3, NOTE_DH5,
  NOTE_DH2, NOTE_DH2, NOTE_DH2, NOTE_D5, NOTE_D5, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3,
  NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH2, NOTE_DH2, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_DH4, NOTE_DH3, NOTE_DH2, NOTE_DH1,
  NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5, NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1,
  NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH5, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5,
  NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1, NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D7
};

//整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)
float duration[] =

{
  1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,     1, 1, 1, 1,          1 + 0.5, 0.5, 1, 1,
  1, 1, 0.5, 0.5, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.25, 0.25, 0.5,    0.5, 0.5, 0.5, 0.25, 0.5, 1,
  0.5, 0.5, 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1.5, 0.5, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1.5, 0.25, 0.5, 1,    1, 1, 1, 1,
  1, 1, 1, 1,    1, 1, 1, 1,    0.5, 0.5, 1, 1, 0.5, 0.5,
  1, 0.5, 0.5, 1, 1,    1, 1, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.5, 1,    1, 1, 1, 0.5, 0.5
};

int length;//定义一个变量,表示共有多少个音符
int tonePin = 11; //定义蜂鸣器引脚
int led = 10;//定义LED引脚

void setup()
{
  pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
  pinMode(led, OUTPUT);
  length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数, 可以查出tone序列里有多少个音符
}

void loop()
{
  for (int x = 0; x < length; x++) //循环音符的次数
  {
    //此函数依次播放tune序列里的数组,即每个音符
    tone(tonePin, tune[x]);

    //每个音符持续的时间,即节拍duration,调整时间的越大,曲子速度越慢,越小曲子速度越快,节奏可自行调整
    digitalWrite(led, HIGH);
    delay(300 * duration[x]);
    digitalWrite(led, LOW);
    delay(200 * duration[x]);
    
    //停止当前音符,进入下一音符
    noTone(tonePin);
  }
  delay(5000);//等待5秒后,循环重新开始
}

附录:《天空之城》音乐简谱
在这里插入图片描述


参考资料

参考资料1: 【雕爷学编程】Arduino动手做(49)—有源蜂鸣器模块2
参考资料1: Arduino应用笔记(一)利用蜂鸣器播放天空之城

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952556.html

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

相关文章

基于jeecg-boot的flowable流程审批时增加下一个审批人设置

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为有时…

工服穿戴检测算法 工装穿戴识别算法

工服穿戴检测算法 工装穿戴识别算法利用yolo网络模型图像识别技术&#xff0c;工服穿戴检测算法 工装穿戴识别算法可以准确地识别现场人员是否穿戴了正确的工装&#xff0c;包括工作服、安全帽等。一旦检测到未穿戴的情况&#xff0c;将立即发出警报并提示相关人员进行整改。Yo…

python中的模块和包

模块 模块就是一个Python文件&#xff0c;里面有类、函数、变量等&#xff0c;我们可以拿过来用&#xff08;导入模块去使用&#xff09; 模块的导入方式 模块在使用前需要先导入。导入的语法如下: 常用的组合形式如&#xff1a; import 模块名from 模块名 import 类、变量、…

JavaScript闭包漏洞与修补措施

请先看下面一段代码 var obj (function () {var sonObj {a: 1,b: 2}return {getObj: function (v) {return sonObj[v]}}})()可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a var obj (function () {var s…

企业合规改革如何进行?

企业合规是现代商业运作中的重要议题&#xff0c;合规改革是促使企业适应法规变化、规范经营行为的必经之路。本文将介绍企业合规改革的步骤和方法&#xff0c;帮助企业建立健全的合规机制&#xff0c;增强竞争力&#xff0c;并赢得社会信任。 一、评估和分析 合规改革的第一…

明厨亮灶监控实施方案 opencv

明厨亮灶监控实施方案通过pythonopencv网络模型图像识别算法&#xff0c;一旦发现现场人员没有正确佩戴厨师帽或厨师服&#xff0c;及时发现明火离岗、不戴口罩、厨房抽烟、老鼠出没以及陌生人进入后厨等问题生成告警信息并进行提示。OpenCV是一个基于Apache2.0许可&#xff08…

eureka服务注册和服务发现

文章目录 问题实现以orderservice为例orderservice服务注册orderservice服务拉取 总结 问题 我们要在orderservice中根据查询到的userId来查询user&#xff0c;将user信息封装到查询到的order中。 一个微服务&#xff0c;既可以是服务提供者&#xff0c;又可以是服务消费者&a…

六、事务-1.简介

一、简介 例&#xff1a;张三转账1000元给李四 step1&#xff1a;查询张三账户余额是否有2000元 step2&#xff1a;若张三账户余额有2000元&#xff0c;张三账户余额-1000 step3&#xff1a;李四账户余额1000 若step2执行成功&#xff0c;step3执行失败&#xff0c;此时需要…

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

【ES】illegal_argument_exception“,“reason“:“Result window is too large

查询ES数据返回错误&#xff1a; {"root_cause":[{"type":"illegal_argument_exception","reason":"Result window is too large, from size must be less than or equal to: [10000] but was [999999]. See the scroll api for…

直播预告|博睿学院第四季即将开讲:博睿数据资深运维团队现身说法!

博睿学院第四季开讲啦&#xff01;本季博睿学院的课程将于本周四&#xff08;8月31日&#xff09;16点正式启动。本季我们邀请到了博睿数据平台支撑中心的四位资深运维专家现身说法&#xff0c;来为我们分享一体化智能可观测平台Bonree ONE的实践干货。 他们&#xff0c;见多识…

Gradio使用介绍

与他人分享你的机器学习模型、API或数据科学工作流的最佳方式之一&#xff0c;就是创建一个交互式应用程序&#xff0c;让用户或同事可以在他们的浏览器中尝试演示,Gradio是创建提供了用非常方便的方式快速创建一个前端交互应用&#xff0c;那如何使用Gradio呢&#xff1f;因为…

element侧边栏子路由点击不高亮问题

最近自己封装侧边栏 又碰到了点击子路由不高亮的问题 <template><div class"aside"><el-scrollbar :vertical"true" class"scrollbar_left_nav"><el-menu :default-active"defaultActive" :collapse"$stor…

MySQL高级篇_13_事务基础知识_尚硅谷_宋红康

MySQL高级篇_事务基础知识 1. 数据库事务概述1.1 存储引擎支持情况1.2 基本概念1.3 事务的ACID特性原子性&#xff08;atomicity&#xff09;一致性&#xff08;consistency&#xff09;隔离性&#xff08;isolation)持久性&#xff08;durability&#xff09; 1.4 事务的状态 …

Openlayers 教程 - 获取地图中心点、范围以及缩放等级

Openlayers 教程 - 获取地图中心点、范围以及缩放等级 核心代码完整代码&#xff1a;在线示例 之前项目中需要实时获取地图中心点以及范围&#xff0c;难度不高&#xff0c;为了方便使用&#xff0c;这里记录分享一下。 本文包括核心代码、完整代码以及在线示例。 核心代码 //…

Consul原理介绍

官方文档&#xff1a;https://www.consul.io/docs Raft动画演示&#xff1a;http://thesecretlivesofdata.com/raft/ 注册中心对比 Consul特点 服务发现、健康检查、Key/Value存储、安全服务通信&#xff08;TLS证书&#xff09;、多数据中心 架构 角色 数据中心 数据中心内…

windows 中pycharm中venv无法激活

1.用管理员身份打开Windows PowerShell 2.进入项目的&#xff1a;venv\Scripts 如&#xff1a;D: (1): cd .\project\venv\Scripts\ (2): 执行命令&#xff1a; Set-ExecutionPolicy RemoteSigned (3): 选择&#xff1a;Y (4): .\activate

使用生成式 AI 和 Amazon Kendra 实现企业规模的图像字幕创建和搜索

Amazon Kendra 是一个由机器学习(ML)驱动的智能搜索服务。Amazon Kendra 重新构想了您的网站和应用程序的搜索功能,以便您的员工和客户可以轻松地找到散布在您组织内多个位置和内容存储库中的内容。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、…

Linux启动黑屏卡住Logo登录界面无法进入系统的终极解决方式

Linux启动黑屏 卡住Logo登录界面无法进入系统的终极解决方式 "⮫适用于ubuntu系统⮨" 起因经过方法1--甲说方法2--乙说方法3--丙说方法4--丁说 结果中途误删ubuntu的etc文件如何恢复于是&#xff0c;我重装了系统&#xff0c;没想到有意外收获&#xff08;中途还把新…

C语言每日一练-------Day(9)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;字符个数统计 多数元素 投票法 &#x1f493;博主csdn个人主页&#xf…