DSP大作业——控制蜂鸣器

合集下载

单片机控制蜂鸣器发声(分析“蜂鸣器”文档)共6张PPT

单片机控制蜂鸣器发声(分析“蜂鸣器”文档)共6张PPT

掌握蜂鸣器的驱动电路
理解蜂鸣器发声的程序设计
பைடு நூலகம்
1.蜂鸣器的分类
蜂鸣器分为电磁式蜂鸣器和压电式蜂鸣器两种。
从结构上蜂鸣器分为有源和无源两种。
电磁式蜂鸣器
有源蜂鸣器
压电式蜂鸣器
无源蜂鸣器
2.蜂鸣器的驱动电路
杜邦线
知识回顾
蜂鸣器的分类和驱动电路 1KHZ方波的程序设计
单片机控制蜂鸣器发声
学习目标
从1有蜂从从理理从理有 从有 有从从蜂有从理从从 有有从1从从从有从有 理有1有有理蜂从KKK结源鸣结结解解结解源结源源结结鸣源结解结结源源结结结结源结源解源源源解鸣结HHHZZZ构 蜂 器 构 构 蜂 蜂 构 蜂 蜂构 蜂蜂 构 构 器 蜂 构 蜂 构 构蜂 蜂 构 构 构 构 蜂 构 蜂蜂 蜂 蜂 蜂 蜂 器 构方方方上鸣分上上鸣鸣上鸣鸣 上鸣 鸣上上分鸣上鸣上上 鸣鸣上上上上鸣上鸣 鸣鸣鸣鸣鸣分上波波波蜂器为蜂蜂器器蜂器器 蜂器 器蜂蜂为器蜂器蜂蜂 器器蜂蜂蜂蜂器蜂器 器器器器器为蜂的的的鸣电鸣鸣发发鸣发鸣鸣鸣电鸣发鸣鸣 鸣鸣鸣鸣鸣发发电鸣程程程器磁器器声声器声器器器磁器声器器 器器器器器声声磁器了序序序分式分分的的分的分分分式分的分分 分分分分分的的式分设设设解为蜂为为程程为程为为为蜂为程为为 为为为为为程程蜂为计计计有鸣有有序序有序有有有鸣有序有有 有有有有有序序鸣有蜂源器源源设设源设源源源器源设源源源源源源源设设器源鸣和和和和计计和计和和和计和和 和和和和和计计和和器无压无无无无无无压无无无 无无无无无压无的源电源源源源源源电源源源 源源源源源电源无无 无 无无无无无无 无无无两式两两两两两两式两两两 两两两两两式两分源源 源 源源源源源源 源源源种蜂种种种种种种蜂种种种 种种种种种蜂种蜂蜂 蜂 蜂蜂蜂蜂蜂蜂 蜂蜂蜂类。鸣。。。。。。鸣。。。 。。。。。鸣。鸣鸣 鸣 鸣鸣鸣鸣鸣鸣 鸣鸣鸣器器器器器 器 器器器器器器 器器器两两两种种种。。。

蜂鸣器的作用和工作原理

蜂鸣器的作用和工作原理

蜂鸣器的作用和工作原理
蜂鸣器是一种声音生成器,用于产生连续或间断的声音信号。

它通常由振荡器、放大器和扬声器等组成。

其工作原理如下:
1. 振荡器:含有一个电容元件和一个可振动的发生器。

当输入电压施加到电容上时,它开始充电并随着时间的流逝而增加。

当电容充电到一定程度时,振荡器会触发,导致电容放电并开始重新充电。

这个过程以一定频率循环进行,形成了一个振荡信号。

2. 放大器:振荡器输出的振荡信号被输入到放大器中,用于增大信号的幅度。

这样可以确保信号足够强大以驱动扬声器。

3. 扬声器:放大器输出的信号被传送到扬声器中,其中包含一个薄膜或振动元件。

当信号通过扬声器时,薄膜或振动元件会振动,从而产生声音。

蜂鸣器通过不断重复这个过程,产生连续或间断的声音信号,用于提醒、警报、指示和其他应用。

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作的时候会有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。

1.控制方式说明此处以型号为SH2225T2PA的蜂鸣器(谐振频率2.6KHz)为例。

蜂鸣器模块有两个驱动引脚与MCU相连,一个是振荡信号输入引脚,由MCU提供相应频率的方波信号驱动蜂鸣器发声,一个是供电控制端,供电切断后蜂鸣器靠电解电容放电维持其发声,会有音量渐渐变小的效果。

原理图如下所示,MC9为供电控制端,MC8为振荡信号输入端。

MC9为高电平时,三极管Q4导通,然后Q2导通,蜂鸣器开始供电,同时电容CD2充电。

若MC8有一定频率的方波信号发出,则蜂鸣器可发出鸣叫。

若此时先关掉供电,即MC9置低电平,MC8依然发出方波信号,则蜂鸣器可依靠CD2放电发出声音,但随着电容电量减少,音量会逐渐减小,形成蜂鸣声渐隐的和弦音效果。

要实现变调的效果,则可通过短时间内切换发出几种不同频率的蜂鸣声来实现。

以下是3种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(ms)Tv:电压给定持续时间(ms)F:输出频率(KHz))单声和弦音:短暂鸣响后音量渐隐▪F=2.6,Tv=200,Tf=1000开机和弦音:三升调,按音调分3个阶段1.F=2.3,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.9,Tv=100,Tf=2100关机和弦音:三降调,按音调分3个阶段1.F=2.9,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.3,Tv=100,Tf=21002.编程实例MCU:STM8S903K3 开发环境:STVD 4.1.6+Cosmic 4.2.8/* buzzer.h文件*/[Copy to clipboard]View Code C1 2 3 4 5 6 #ifndef __BUZZER_H #define __BUZZER_H#include "common.h" #include "beep.h" typedef enum7 8 91011121314151617181920212223 {MONO =0,//单音POLY_ON =1,//开机和弦POLY_OFF =2//关机和弦}Tone_Type;//蜂鸣器声音类型typedef struct{FREQ_Type Freq;//频率u8 OSCTime;//振荡持续时间,最小单位为10ms u8 PWRTime;//供电持续时间,最小单位为10ms } TONE_Def;//音调结构体void BuzzerStart(Tone_Type ToneType); void BuzzerCtrl(void);#endif /* __BUZZER_H *//* buzzer.c文件*/[Copy to clipboard]View Code C1 2 3 4 5 6 7 8 910111213141516171819 #include "buzzer.h"const TONE_Def Tone1[]={{FREQ_2K6,100,20},{FREQ_NO,0,0}};//单音const TONE_Def Tone2[]={{FREQ_2K3,20,20},{FREQ_2K6,20,20},{FREQ_2K9,210,10},{FREQ_NO,0,0}};//开机和弦音const TONE_Def Tone3[]={{FREQ_2K9,20,20},{FREQ_2K6,20,20},{FREQ_2K3,210,10},{FREQ_NO,0,0}};//关机和弦音TONE_Def * pTone;static u8 BuzzerStatus =0;//蜂鸣器启动,需要发声时调用void BuzzerStart(Tone_Type ToneType){switch(ToneType){case MONO:pTone = Tone1;break;case POLY_ON:20212223242526272829303132333435363738 pTone = Tone2;break;case POLY_OFF:pTone = Tone3;break;default:pTone = Tone1;break;}BuzzerStatus =0;}//蜂鸣器控制,每10ms执行一次void BuzzerCtrl(void){static TONE_Def Tone;switch(BuzzerStatus){39404142434445464748495051525354555657case0:Tone =*pTone;if(Tone.Freq!= FREQ_NO)//非结束符{//先判断供电持续时间if(Tone.PWRTime!=0){Tone.PWRTime--;BeepPwrOn();}else{BuzzerStatus =2;break;}//再判断振荡持续时间if(Tone.OSCTime!=0){Tone.OSCTime--;58596061626364656667686970717273747576 BEEP_SetFreq(Tone.Freq);BEEP_On();}else{BeepPwrOff();BuzzerStatus =2;break;}//判断完成,开始递减计时BuzzerStatus =1;}else/* Tone.Freq == FREQ_NO *///是结束符{BuzzerStatus =2;}break;case1:if(Tone.PWRTime!=0)77787980818283848586878889909192939495{Tone.PWRTime--;}else{BeepPwrOff();}if(Tone.OSCTime!=0){Tone.OSCTime--;}else{BEEP_Off();pTone ++;//取下一个音调 BuzzerStatus =0;}break;default:9697break; }}以上代码中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在头文件beep.h中声明,由底层代码实现。

交通灯DSP上课实验报告(精)

交通灯DSP上课实验报告(精)

一、课题名称 DSP实验—按键弹奏音乐及显示二、实验目的在硬件上,通过实验了解ICETEK –VC5509-A 评估板技术指标以及原理图和实物图。

对于试验箱的链接和使用及其原理,也有了一定的了解;在软件上,熟悉了DSP 开发集成环境Code Composer Studio的使用,了解Code Composer Studio3.1 软件的操作环境和基本功能以及DSP 开发系统和计算机与目标系统的连接方法。

学会了基本的编译和调试功能、观察窗口的使用。

三、实验内容及设计思想本次试验,主要完成了通过按键来弹奏音乐,单独按下1-6时,分别弹奏不同的音调,并且在液晶显示屏上显示相应的数字,当按下按键9时,自动弹奏一首指定的音乐,然后自动退出程序。

四、实验设备计算机,ICETEK-VC5509-A 实验箱(或ICETEK 仿真器+ICETEK-VC5509-A 系统板+相关连线及电源)。

DSP 教学实验箱结构图ICETEK –VC5509-A 原理框图五、实验原理1.EMIF 接口:TMS320C5509DSP 的扩展存储器接口(EMIF用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。

这一接口提供地址连线、数据连线和一组控制线。

ICETEK-VC5509-A 将这些扩展线引到了板上的扩展插座上供扩展使用。

2.蜂鸣器:蜂鸣器由DSP 通用I/O 管脚输出控制,可将此管脚上的频率输出转换成声音输出。

5509A 的通用I/O 口S13 控制蜂鸣器的输出频率。

控制的方法是使用DSP 通用定时器设置S13 以一定的频率改变高低状态,输出方波。

对于通用定时器周期寄存器的设置,计数值为所需频率计数值的二分之一。

音乐的频率(C 调:C D E F G A B ^C1 2 3 4 5 6 7 ^1C: 264,297,330,352, 396,440,495,5283.蜂鸣器的连接:由于选用的蜂鸣器所需电流较小,所以采用将DSP 通用I/O 引脚直接驱动的方式。

单片机蜂鸣器编程技巧

单片机蜂鸣器编程技巧

单片机蜂鸣器编程技巧1.音乐节奏控制:在编写程序时,可以使用定时器来控制蜂鸣器的音符持续时间。

通过调整定时器的参数值,可以实现不同音长的音符,从而控制节奏感。

2.音符频率控制:不同音符具有不同的频率,可以根据乐谱中各个音符的频率,将其对应的频率值存储在一个数组中。

通过控制蜂鸣器输出的频率,可以实现不同音高的音符。

3.延时函数:在单片机编程中,经常需要使用延时函数来控制时间间隔。

在输出音乐时,可以通过延时函数控制每个音符的持续时间。

通过调整延时函数的参数值,可以实现不同音符间的时间间隔,从而实现更好听的音乐效果。

4.音乐合奏:在编写程序时,可以将不同乐器的音符同时输出到不同的蜂鸣器上,从而实现多个乐器的合奏效果。

通过合理地组合不同乐器的频率和节奏,可以编写出更丰富的音乐作品。

5.音乐循环播放:通过编写循环结构,可以实现音乐循环播放的效果。

通过精确地确定循环次数,可以实现指定音乐节拍的循环播放效果。

6.音乐速度调节:通过调整延时函数的参数值,可以控制音乐的播放速度。

加快延时时间可以使音乐播放加速,减慢延时时间可以使音乐放慢。

7.音乐音量控制:通过控制蜂鸣器输出的PWM信号的占空比,可以实现音乐的音量控制。

调整PWM信号占空比的大小,可以改变音量的大小。

8.音乐渐变效果:在编写程序时,可以使用渐变效果来实现音乐的过渡效果。

通过逐渐增加或减小频率和音量,可以实现音乐渐变的效果,使音乐更加流畅自然。

9.使用音乐库:在单片机编程中,有一些常用的音乐库可以使用。

通过引用这些音乐库,可以简化音乐的编写过程,提高编程效率。

10.节奏变化:在编写程序时,可以尝试在音乐的不同位置加入一些节奏变化,使音乐更加有层次感。

例如,在特定位置加入加速、变慢、停顿等效果。

总结:以上是一些常用的单片机蜂鸣器编程技巧。

通过合理运用这些技巧,可以编写出更多样化、更复杂的音乐效果。

当然,这只是冰山一角,还有很多其他的编程技巧可以尝试,通过对单片机蜂鸣器的深入研究和实践,我们可以更好地掌握这些技巧,创作出独特的音乐作品。

单片机蜂鸣器音乐

单片机蜂鸣器音乐

单片机蜂鸣器音乐单片机在我们的生活中无处不在,它被广泛地应用在各种电子产品中,为我们的生活带来了便利。

今天,我要向大家介绍的是一种基于单片机的蜂鸣器音乐播放器。

一、硬件部分1、单片机:我们选用的是AT89C51单片机,它具有低功耗、高性能的特点,非常适合用于音乐播放器。

2、蜂鸣器:蜂鸣器是用来发出声音的,我们将其连接在单片机的输出口上。

3、存储芯片:为了能够播放存储在芯片中的音乐,我们需要将音乐以某种格式存储在芯片中。

常用的存储芯片有EEPROM和Flash芯片。

4、按键:为了能够选择播放不同的音乐,我们需要添加一个按键。

二、软件部分1、音乐编码:我们需要将音乐转换成二进制编码,这样才能被单片机读取并播放。

常用的音乐编码格式有MIDI、WAV等。

2、音乐播放:当按下按键时,单片机读取存储芯片中的音乐数据,并通过蜂鸣器播放。

3、音乐选择:通过按键可以选择不同的音乐进行播放。

4、音量控制:我们可以通过编程来控制蜂鸣器的音量大小。

三、调试与测试1、硬件调试:检查连接是否正确,确保没有短路或断路的情况。

2、软件调试:将程序下载到单片机中进行调试,确保能够正常播放音乐。

3、综合测试:将所有硬件和软件都连接起来进行测试,确保能够正常工作。

四、总结与展望通过本次实验,我们成功地制作了一个基于单片机的蜂鸣器音乐播放器。

它具有简单、实用的特点,可以用来播放存储在芯片中的音乐。

未来,我们可以进一步扩展其功能,例如添加更多的按键来选择不同的音乐、添加显示屏来显示歌曲名称等。

我们也可以将其应用到其他领域,例如智能家居、智能安防等。

单片机蜂鸣器唱歌程序在许多应用中,单片机蜂鸣器经常被用来发出声音或音乐。

下面是一个使用单片机蜂鸣器唱歌的程序示例。

我们需要确定单片机和蜂鸣器的连接方式。

通常,单片机具有一个内置的蜂鸣器输出引脚,可以将蜂鸣器连接到这个引脚上。

在以下的示例中,我们将假设单片机具有一个内置蜂鸣器输出引脚,并将其连接到P1.0端口上。

蜂鸣器程序

蜂鸣器程序

要求:让蜂鸣器响,频率为1KHZ1、延时子程序实现汇编: ORG 0000HSJMP STARTORG 0030HSTART : MOV P2,#11110111B //P2^3控制蜂鸣器 LCALL DELAYMOV P2,#11111111BLCALL DELAYAJMP STARTDELAY :MOV R5,#125L1:NOP //()ms us us us 5.0125211=⨯++ NOPDJNZ R5,L1RET //返回主程序ENDC 语言:#include 〈reg52.h>#define uint unsigned int //宏定义void delay(uint z ) //延时0。

5ms{uint i,j ;for(i=z ;i 〉0;i ——)for(j=55;j 〉0;j ——);}sbit beep=P2^3; //位定义void main(){while (1) //大循环{delay (1); //延时0.5msbeep=~beep; //取反}}2、用定时器1、方式2实现延时方式2最大定时:256⨯1us=0.256ms所以选择定时0。

25ms ,那么循环2次实现0。

5ms 延时 计数值0.25ms/1us=250则256-250=06H汇编: ORG 0000HSJMP STARTORG 0030HSTART:MOV P2,#11110111BLCALL DELAYMOV P2,#11111111BLCALL DELAYAJMP STARTDELAY:MOV R5,#02H //置计数循环初值2 MOV TMOD,#20H //置定时器1方式2MOV TH1,#06H //置定时器初值MOV TL1,#06HSETB TR1 //启动定时器1LP1:JBC TF1,LP2 //查询计数溢出SJMP LP1 //未溢出继续计数LP2:DJNZ R5,LP1 //未到0。

gpio按键控制蜂鸣器响实验心得

gpio按键控制蜂鸣器响实验心得

gpio按键控制蜂鸣器响实验心得
最近,我进行了一个有关GPIO按键控制蜂鸣器响的实验,并取得了一些有趣的结果。

在此分享我的实验心得。

在实验前,我先准备了一个树莓派和一个蜂鸣器,接下来通过GPIO 引脚将它们连接起来。

然后,我使用Python编程语言编写了一个简单的代码来控制蜂鸣器的工作。

该代码使用了GPIO库来读取按键的输入状态,并根据按键的状态来控制蜂鸣器的响声。

在实验过程中,我发现了一些有趣的现象。

首先,当按下按键时,蜂鸣器会发出一声短促的响声。

这是因为按键按下时,GPIO引脚会发送一个高电平信号,导致蜂鸣器工作。

当释放按键时,蜂鸣器停止响声。

这是因为GPIO引脚发送了一个低电平信号,使蜂鸣器停止工作。

此外,我还尝试了不同的按键操作,例如长按、快速连续按等。

我发现,当我长按按键时,蜂鸣器会持续不断地发出响声。

这是因为GPIO 引脚一直发送高电平信号,使蜂鸣器保持工作状态。

而当我快速连续按下按键时,蜂鸣器会发出一系列短促的响声。

这是因为GPIO引脚在每次按下按键时都会发送高电平信号,然后在按键释放后发送低电平信号,使蜂鸣器停止工作。

通过这个实验,我不仅学习到了如何使用GPIO引脚来控制蜂鸣器的
工作,还深入了解了按键的工作原理。

我还发现,通过合理的编程方式,可以实现按键的不同操作,从而控制蜂鸣器发出不同的声音。

这对于一些交互式的项目来说,非常有用。

总的来说,这个实验让我对GPIO按键控制蜂鸣器有了更深入的了解。

我将继续探索GPIO的其他应用,并尝试更复杂的实验,以提升我的编程和电子技能。

蜂鸣器实验技术及应用实验报告

蜂鸣器实验技术及应用实验报告

DSP技术及应用实验报告(电气与信息工程学院)实验项目名称:蜂鸣器实验专业班级:指导教师:学生姓名/学号:实验地点:实验日期:贵州理工学院实验报告实验原理从电路图可知,当输出高电平时蜂鸣器鸣叫,输出低电平时蜂鸣器不鸣叫,即CPLD_IO输出 1 蜂鸣器鸣叫,输出 0 蜂鸣器不鸣叫。

实验步骤与内容1.首先打开CCS, 菜单栏点击<Debug><Connect>连接设备,然后<Project><Open...>打开该目录中的工程文件:buzz.pjt;2.然后点击菜单栏的<File> <Load Program>,选择buzz目录中Debug 文件夹里面的buzz.out文件(后缀.out)。

4.然后点击菜单<Debug>下的<Go Main>,进入主函数入口处,接着便可以通过左边的按钮或<Debug>菜单进行相应调试,现在直接Run ,运行程序,这时注意观察开发板上的变化。

源程序:#include”DSP28_Device.h”}void Delay(Uint16 data); }void main(void) void Delay(Uint16 data) {InitSysCtrl(); //初始化系统{ Uint16 1;DINT; //关中断for(i=0;i<data;i++) {;}IER=0x0000; }IFR=0x0000;InitPieCtrl(); //初始化PIEInitPieVectTable();//初始化PIE中断矢量表InitPeriperals();//初始化外设InitGpio();//初始化GPIOEALLOW;EDIS;EINT;ERTM;While(1){GpioDataRegs.GPBDAT.bit.GPIOB4=1;Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);GpioDataRegs.GPBDAT.bit.GPIOB4=0;Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);。

单片机按键控制蜂鸣器发声程序

单片机按键控制蜂鸣器发声程序
void Time0_Init()//定时器T0方式1,定时10ms
{
TMOD = 0x01;
IE= 0x82;
TH0 = 0xDC;
TL0 = 0x00;
}
void Time0_Int() interrupt 1
{
TH0 = 0xDC;
TL0 = 0x00;
Count++;
}
void delay (uint8 k)//按键防抖延时
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR0 = 1;
while(1)
{
Speak = ~Speak;
Delay_xMs(Temp1);
if(Temp2 == Count)
{CΒιβλιοθήκη unt = 0;break;
}
}
}
}
}
void keyscan (void)//按键切换声音函数
单片机按键控制蜂鸣器发声程序单片机蜂鸣器音乐程序单片机蜂鸣器程序单片机蜂鸣器报警程序蜂鸣器发声程序单片机按键程序单片机独立按键程序单片机按键扫描程序单片机按键消抖程序单片机按键中断程序
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
{
uint8 Temp1,Temp2;
uint8 Addr;
Count = 0;//中断计数器清0
Addr = i *3;
while(1)
{
Temp1 = SONG[Addr++];

DSP大作业

DSP大作业

DSP大作业一.要求1.利用matlab软件对audio1211.wav音频信号进行数字信号采样,分别对采样后的信号进行时/频域分析,并提供仿真图和分析说明;(35)2.设计合理的数字滤波器,滤去音频信号中的蜂鸣音,给出详细设计流程,并提供频域仿真图和分析说明;(45)3.将数字滤波后的数字信号转换成wav格式音频文件,统一命名为audio1211proc.wav,作为附件上交。

(15)二.分析(1)通过播放所给音乐文件,很明显能听出wav文件中包含蜂鸣噪音,所以我们应该先分析频谱。

在matlab下可以用函数wavread/audioread读入语音信号进行采样,通过wavread得到声音数据变量x和采样频率fs、采样精度nbits,在读取声音信号之后,利用读出的采样频率作为参数,这段音频读出的采样精度为16,fs为44100hz,将此后采集时间、fft的参数设置为fs,也就是44100hz。

通过plot函数绘制出了音频信号与时间的关系图pic1,使用fft函数进行fft处理。

处理后的信号频谱pic2,如下所示图1.音频信号与时间的关系图从图1横坐标我们看到t在9-10s之间截止,与我们在音乐播放器中显示的时间一致。

图2.图2为运用fft后得到的处理结果,可以从中读取到,在293.7hz、4671hz 附近幅值突然增大,可以确定为噪声干扰。

所以我们应该针对频率附近进行滤波。

如果针对性进行滤波处理,应该使用低通滤波器进行处理,去除这部分的噪音。

之后需要选定滤波器并进行程序设计,在4671hz附近进行滤波,去除蜂鸣杂音。

(2)需要对蜂鸣音进行除去,自然需要用到滤波器。

所以第二步需要设计滤波器并给出详细流程。

在第一问的频谱分析中,通过FFT已经知道噪音所在,所以需要针对这个问题设计参数。

在这里选用巴特沃斯低通滤波器进行处理,需要设定好的参数有通带边界频率、阻带边界频率、通带最大衰减和通过阻带的最小分贝数(由buttord在matlab 定义得)。

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制 Final approval draft on November 22, 2020蜂鸣器和弦音发声控制前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作的时候会有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。

1.控制方式说明此处以型号为SH2225T2PA的蜂鸣器(谐振频率)为例。

蜂鸣器模块有两个驱动引脚与MCU相连,一个是振荡信号输入引脚,由MCU提供相应频率的方波信号驱动蜂鸣器发声,一个是供电控制端,供电切断后蜂鸣器靠电解电容放电维持其发声,会有音量渐渐变小的效果。

原理图如下所示, MC9为供电控制端,MC8为振荡信号输入端。

MC9为高电平时,三极管Q4导通,然后Q2导通,蜂鸣器开始供电,同时电容CD2充电。

若MC8有一定频率的方波信号发出,则蜂鸣器可发出鸣叫。

若此时先关掉供电,即MC9置低电平,MC8依然发出方波信号,则蜂鸣器可依靠CD2放电发出声音,但随着电容电量减少,音量会逐渐减小,形成蜂鸣声渐隐的和弦音效果。

要实现变调的效果,则可通过短时间内切换发出几种不同频率的蜂鸣声来实现。

以下是3种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(ms) Tv:电压给定持续时间(ms) F:输出频率(KHz))单声和弦音:短暂鸣响后音量渐隐F=,Tv=200,Tf=1000开机和弦音:三升调,按音调分3个阶段1.F=,Tv=200,Tf=2002.F=,Tv=200,Tf=2003.F=,Tv=100,Tf=2100关机和弦音:三降调,按音调分3个阶段1.F=,Tv=200,Tf=2002.F=,Tv=200,Tf=2003.F=,Tv=100,Tf=21001 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18#ifndef __BUZZER_H#define __BUZZER_H#include ""#include ""typedef enum{MONO =0,//单音POLY_ON =1,//开机和弦POLY_OFF =2//关机和弦}Tone_Type;//蜂鸣器声音类型typedef struct{FREQ_Type Freq;//频率u8 OSCTime;//振荡持续时间,最小单位为10ms u8 PWRTime;//供电持续时间,最小单位为10ms } TONE_Def;//音调结构体void BuzzerStart(Tone_Type ToneType);void BuzzerCtrl(void);1920212223#endif /* __BUZZER_H */1 2 3 4 5 6 7 8 9 10 11 12 13#include ""const TONE_Def Tone1[]={{FREQ_2K6,100,20},{FREQ_NO,0,0}};//单音const TONE_Def Tone2[]={{FREQ_2K3,20,20},{FREQ_2K6,20,20},{FREQ_2K9,210, 10},{FREQ_NO,0,0}};//开机和弦音const TONE_Def Tone3[]={{FREQ_2K9,20,20},{FREQ_2K6,20,20},{FREQ_2K3,210, 10},{FREQ_NO,0,0}};//关机和弦音TONE_Def * pTone;static u8 BuzzerStatus =0;//蜂鸣器启动,需要发声时调用void BuzzerStart(Tone_Type ToneType){switch(ToneType){case MONO:14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 pTone = Tone1;break;case POLY_ON:pTone = Tone2;break;case POLY_OFF:pTone = Tone3;break;default:pTone = Tone1;break;}BuzzerStatus =0;}//蜂鸣器控制,每10ms执行一次void BuzzerCtrl(void){static TONE_Def Tone;switch(BuzzerStatus){case0:35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 Tone =*pTone;if!= FREQ_NO)//非结束符{//先判断供电持续时间if!=0){--;BeepPwrOn();}else{BuzzerStatus =2;break;}//再判断振荡持续时间if!=0){--;BEEP_SetFreq;BEEP_On();}56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76else{BeepPwrOff();BuzzerStatus =2;break;}//判断完成,开始递减计时BuzzerStatus =1;}else/* == FREQ_NO *///是结束符{BuzzerStatus =2;}break;case1:if!=0){--;}else{77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 BeepPwrOff();}if!=0){--;}else{BEEP_Off();pTone ++;//取下一个音调 BuzzerStatus =0;}break;default:break;}}以上代码中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在头文件中声明,由底层代码实现。

通过按键控制蜂鸣器

通过按键控制蜂鸣器

嵌入式系统设计与开发实验一:通过按键控制蜂鸣器所在系(院):学生姓名:指导教师:起止日期:实验目的:了解ARM2131开发板;搭建JLINK开发环境;运行第一个嵌入式程序参考书本:P44,P1541、实验电路图2、实验流程图开始P0.7选择接GPIO设置P0.7为输出状态置位P0.7口,关闭蜂鸣器延时清零P0.7,蜂鸣器鸣叫延时3、程序清单#ifndef __CONFIG_H_#include "config.h"#endifvoid WaitKey(void){uint32 i;while(1){ // 等待KEY1按下(即等待KEY1对应的口线为低电平,若为高电平则一直循环等待) // 通过IO0PIN读取P0.0~P0.31口的电平值,屏蔽其它位后判断P0.7是否为低电平。

while( (IO0PIN&KEY1)!=0 );for(i=0; i<50000; i++); // 软件延时,去抖动(根据系统时钟调整)// 判断KEY1是否仍为低电平,若是表明按键有效,否则表明是假按键if((IO0PIN&KEY1) == 0) break;}// 等待KEY1放开(即等待KEY1对应的口线为高电平,若为低电平则一直循环等待)while((IO0PIN&KEY1) == 0);}****************************************************************************************** ** 函数名称: DelayNS()** 函数功能:长软件延时。

** 入口参数: dly 延时控制值,值越大延时越长** 出口参数:无****************************************************************************************** */void DelayNS(uint32 dly){ uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}/******************************************************************************************* ** 名称: main()** 功能:初始化GPIO,然后等待KEY1按键,若有按键则控制蜂鸣器响两声。

单片机使用4个独立按键控制蜂鸣器代码

单片机使用4个独立按键控制蜂鸣器代码

单片机使用4个独立按键控制蜂鸣器代码下面是使用单片机控制蜂鸣器,使用4个独立按键的示例代码:```c#include <reg52.h> // 8052 单片机头文件sbit beep=P1^5; // 将蜂鸣器引脚定义为 P1.5sbit key1=P3^1; // 定义四个按键引脚为 P3.1 到 P3.4sbit key2=P3^2;sbit key3=P3^3;sbit key4=P3^4;void delay(unsigned int t) // 延时函数{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<125;j++);}void main(){beep = 0; // 蜂鸣器关闭while(1){if(key1 == 0) // 首先检测按键1是否按下{beep = ~beep; // 取反控制蜂鸣器开/关delay(500); // 延时以避免误触}else if(key2 == 0) // 随后检测按键2是否按下{beep = 0; // 关闭蜂鸣器delay(500);}else if(key3 == 0) // 然后检测按键3是否按下{beep = 1; // 打开蜂鸣器delay(500);}else if(key4 == 0) // 最后检测按键4是否按下{beep = 0; // 关闭蜂鸣器delay(500);}}}```在上述代码中,我们首先定义了蜂鸣器引脚 `beep`,以及四个按键引脚 `key1` 到 `key4`。

然后,我们通过 `delay` 函数来延时防止误碰。

在无限循环中,我们检测四个按键的状态,如果有按键被按下,我们会对蜂鸣器进行相应的操作。

按键1控制开/关蜂鸣器,按键2关闭蜂鸣器,按键3打开蜂鸣器,按键4同样关闭蜂鸣器。

DSP中文说明书

DSP中文说明书

一、产品概述DSP系列电磁卸荷油脂泵是用直流或交流电源驱动的油脂泵,它通过交(直)流电机和机械传动使柱塞往复运动,将润滑脂不断输出。

该泵最大特点是带有电磁卸荷阀,可与DPQ、DPQX型等干油定量注油器配合使用。

通过程控器,可将润滑脂定时、定量地输送至各润滑点。

该泵内置溢流阀,可有效地保护润滑系统。

该系列润滑泵输出流量大,广泛应用于塑料、行走机械、锻压、工程等机械设备的间隙集中润滑系统。

二、工作原理电动机(直流或交流)带动齿轮减速,通过偏心轮及连杆机构,使柱塞作往复运动。

润滑脂通过吸、排油过程,经过单向阀,一路润滑脂经出油口进入PDI润滑系统,另一路通过卸荷阀(通电时卸荷阀关闭,断电时卸荷阀打开卸荷)回到油罐中。

在PDI润滑系统中,当定量注油器充满润滑脂后,经过一段时间的延时,系统末端的压力开关发出信号给程控器,程控器发出信号给电动机,电动机停止运行,同时,电磁卸荷阀断电卸荷,润滑系统管路中的油脂卸压,定量注油器完成一次注油过程。

三、技术参数出油口螺纹:内NPT1/8使用温度范围:-20℃~60℃加油口形式:快换充脂接头充脂范围:NLGI000#~1#(如在低温下使用,要用低温润滑脂)溢流阀设定压力为10MPa,使用时需确认所接系统定量分配器的最大工作压力,调节溢流阀,使泵的出油口压力与所接系统压力相匹配。

四、外形尺寸DSP-1(带卸荷阀)原理图DSP-1(0.7升)DSP-1(1升)DSP-2(不带卸荷阀)原理图DSP-2(0.7升)DSP-2(2升)五、安装与调试a.电磁卸荷泵的安装与调试1.按照上面外形图的安装尺寸将泵固定好;2.通过充脂口给油泵加油,务必使用指定粘度范围内的清洁润滑脂;3.将电机、电磁卸荷阀、液位开关及电源线按要求接入程序控制器内相应的端子(注意电源电压应与电机、卸荷阀电压相符);4.检查被试泵及系统各接头连接处是否有渗漏,确认程控器、电源以及电磁卸荷阀之间是否按接线要求正确接线;5.开启泵,用扳手旋松“排气阀”排气(注意:人员应避免正对排气口),运行一段时间,将泵体内的空气排尽,直至排气阀口有连续油脂冒出,旋紧排气阀螺钉,接上管路使用;6.切勿将泵体过度倾斜或倒立;7.所有机型电机单次运行时间不大于1分钟,停机时间不小于10分钟。

蜂鸣器简介及使用方法

蜂鸣器简介及使用方法

蜂鸣器的介绍1..蜂鸣器的分类蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

2..蜂鸣器的电路图形符号蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。

蜂鸣器的结构原理1.压电式蜂鸣器压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。

有的压电式蜂鸣器外壳上还装有发光二极管。

多谐振荡器由晶体管或集成电路构成。

当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。

在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。

2.电磁式蜂鸣器电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。

接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。

振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

蜂鸣器的制作(1)制蜂鸣器备电磁铁M:在长约6厘米的铁螺栓上绕100圈导线,线端留下5厘米作引线,用透明胶布把线圈粘好,以免线圈松开,再用胶布把它粘在一个盒子上,电磁铁就做好了.(2)制备弹片P:从铁罐头盒上剪下一条宽约2厘米的长铁片,弯成直角,把电磁铁的一条引线接在弹片上,再用胶布把弹片紧贴在木板上.(3)用曲别针做触头Q,用书把曲别针垫高,用胶布粘牢,引出一条导线,如图连接好电路.(4)调节M与P之间的距离(通过移动盒子),使电磁铁能吸引弹片,调节触点与弹片之间的距离,使它们能恰好接触,通电后就可以听到蜂鸣声.有源蜂鸣器和无源蜂鸣器教你区分有源蜂鸣器和无源蜂鸣器现在市场上出售的一种小型蜂鸣器因其体积小(直径只有llmm)、重量轻、价格低、结构牢靠,而广泛地应用在各种需要发声的电器设备、电子制作和单片机等电路中。

有源蜂鸣器和无源蜂鸣器的外观如图a、b所示。

图:有源和无源蜂鸣器的外观a)有源b)无源从图a、b外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm。

蜂鸣器报警实验

蜂鸣器报警实验

§3.2 蜂鸣器报警实验一、实验目的1.掌握2812 IO控制方法;二、实验设备1.一台装有CCS3.3软件的计算机;2.DSP实验箱;3.DSP硬件仿真器;三、实验原理复用控制寄存器--- GPxMUX (0---数字IO,1---专用外设功能)方向控制寄存器--- GPxDIR (0---输入,1---输出)量化控制寄存器--- GPxQUAL (0---无量化,1---量化范围0x00--0xff)I/O数据寄存器--- GPxDAT (0---输出--引脚置低,1---输出--引脚置高)I/O置位寄存器--- GPxSET (0---无变化,1---引脚置为高)I/O清零寄存器--- GPxCLEAR (0---无变化,1---引脚置为低)单独触发寄存器--- GPxTOGGLE (0---无变化,1---引脚置电平跳变一次)2812中可以通过设置上述特定寄存器来改变相应IO输出管脚电平高/低,从而驱动蜂鸣器发出一定频率的声音,通过改变程序中高低电平切换周期可以实现蜂鸣器声音“尖锐”到“低沉”的变化。

相关原理图:四、实验步骤1.把2812主控板插到实验箱底板相应接口上;2.连接好DSP开发系统;3.本实验工程Example_Buzzer,编译,下载程序到DSP;4.运行程序,观察2812主控板上相应位置蜂鸣器的发声情况。

五、实验报告1. 实验原理、设计过程、程序设计思想和实验结果、硬件测试结果记录下来。

2. 自行修改程序内相关延时参数并说明参数变大变小时蜂鸣器的声音高低变化情况。

六、补充1、实验过程中检查硬件仿真器链接是否正确,检查dsp芯片是否安插正确(以各个芯片的指示灯是否亮为参考)。

2、在软件设置与硬件的connect。

3、加载本实验工程,烧到芯片上。

Build工程,run程序,观察实验现象;修改相关代码,再次编译运行,看实验现象。

七、实验相关截图T2.0 蜂鸣器实验原理图T2.1链接硬件T2.3修改延迟时间。

51单片机控制喇叭(蜂鸣器)简单发声,频率可调

51单片机控制喇叭(蜂鸣器)简单发声,频率可调

/*-----------------------------------------------------------------------------------------------------------------------------------*//*--*************************功能:【喇叭发出声音,频率可调】*********************--*//*--*************************芯片:【STC12C5A60S2】******************************--*//*--*************************说明:【频率500Hz,单次发声时长1s】******************--*//*--*************************控制:【每按下P1.0一次,喇叭发声1s,长按一直发声】**--*//*------------------------------------------------------------------------------------------------------------------------------------*//*头文件*/#include <reg52.h>#include <intrins.h>sbitControl_Key = P1^0; //定义控制独立按键P1.0,按下发声。

sbitSpeaker_port = P2^7; //定义喇叭控制端口unsigned intnum = 8; //num = (4 * 1000) / Frequency(500Hz) : 决定喇叭的响应周期,从而决定不同的频率unsigned int counter0 = 0; //T0控制频率unsigned int counter1 = 0; //T1控制时长unsigned char Juge_Start; //判断发声1s是否开始。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于DSP控制蜂鸣器演奏音乐
设计课题:基于DSP控制蜂鸣器演奏音乐
学院名称:电气工程学院
专业班级:
学生姓名:
学号:
前言:
数字信号处理器DSP (Digital Signal Processor) 是基于超大规模集成技术和计算机技术、适用于高速数字信号处理的单片计算机,现已经广泛应用于科研、军事以及消费类电子产品中。

本论文介绍了基于瑞泰ICETEK-VC5416-USB/PP-EDU DSP 实验箱的系列研究,描述了一个功能简单的蜂鸣器播放过程。

一、实验目的:
通过实验学习使用5416DSP 的扩展I/O 端口接收外围设备信息的方法,了解
二、实验原理:
图1.1
一、蜂鸣器的应用:
(1)蜂鸣器是接在多缓冲串行口McBSP0 的DX0端。

DX0工作在通用I/O的输出状态。

(2)蜂鸣器控制相关寄存器:
映射到I/O空间的0x8000地址,所以在定义寄存器的访问方式为:ioport unsigned char port8000;
port8000=0;
port8000=0x80;
port8000=8;
(3)McBSP0子块地址寄存器SPSA0 其映射到数据存储器空间0x38地址,其功能是CPU 访问McBSP 中不能直接访问的寄存器时装载这些寄存器的子块地址,定义访问方式为:#define SPSA0 *(unsigned int *)0x38。

其功能是传送CPU 访问McBSP 中不能直接访问的寄存器时装载这些寄存器的子块地址,定义访问方式为:#define SPSD0 *(unsigned int *)0x39。

(5)引脚控制寄存器PCR。

CPU不能直接访问的该寄存器,必须通过子块数据寄存器SPSD来访问PCR,其子地址为0x0e。

其定义为:
SPSD0=uWork1;
SPSA0=0x0e; // set McBSP0's PCR
uWork1=SPSD0;
uWork1|=0x2020; // set XIOEN=1, Enable IO,DX for output
(6)串行口控制寄存器SPCR2。

CPU不能直接访问的该寄存器,必须通过子块数据寄存器SPSD来访问SPCR2,其子地址为0x1。

其定义为:SPSA0=1; // set McBSP0's SPCR2
uWork1=SPSD0;
uWork1&=0xfffe; // set XRST=0
二、音频发声实现:
由于蜂鸣器接到DX0端,通过使用SDP定时器定时,使BDX0以一定音频频率输出信号,就可以形成音频发生器。

1.发`声控制。

将定时器定时时间定为输出信号的半周期,并设置定时器为定时中断方式,在定时器中断函数中队BDX0端进行取反操作,就可以在BDX0端产生一定频率的信号,如图
BDX0:
图2.1
2.按一定节奏变化的音频信号的控制。

如果要产生有节奏的音乐:产生的音频信号一定节奏变化,如图
频率f1,音长t1频率f2,音长t2频率f3,音长t3
图2.2
3.音乐参数由不断变化的音频参数和音乐常数组组成,可用二维数组music 【freq ,length】来表示。

变化的音频信号可按照下列步骤编写程序。

a. 定义寄存器CLKMD数据存储器映射地址:0x58
b. 根据工作频率与晶振频率的关系设置寄存器CLKMD的值。

以晶振
c. 根据音频半周期的大小设置DSP定时器时间常数PDR的值,从而确定音频参数。

在进行编程时我们使用的中音C调频率其定义为表2.2
以“1”为例:时钟频率为8MHz,时钟周期Tout=0.125us,TDDR=2,PRD=151,产生“1”音的半周期t=0.125us*(2+1)*(151+1)=57us,则“1”的音频为1/(2*57)=877Hz。

音乐的长度:节拍每拍以480为基准,音长越短,数值越小。

音乐的长度与音符节拍、延迟程序内循环次数及指令的运行时间有关。

音频参数计算公式:T/2=T(work)*(PRD+1)(TDDR+1)
三、键盘控制:
1.键盘的中断工作方式。

TMS320C5416实验系统分系统模块和显示/控制模块,显示/控制模块通过PS/2接口连接键盘,当按下键盘时,接受该键的扫描码。

读完扫描码后,通过外中断2(int2)向CPU请求中断,如果允许外中断2(int2)中断,将产生两次中断(键盘每次按下一键产生2次中断)。

键盘的信息可以通过编写外中断2函数来读取。

这种开外中断2的键盘工作方式称为中断工作方式。

2.键盘的查询工作方式。

当按下键盘上键时,接受该键的扫描码,但不产生外中断2中断,键盘的信息可以通过死循环程序来读取。

这种键盘工作方式称为键盘的查询工作方式。

3.键盘控制相关的寄存器及扫描码。

键盘控制相关的寄存器通过映射到I/O
4.键盘的初始设置
ioport unsigned char port8000;
ioport unsigned int port8001;
ioport unsigned int port8002;
ioport unsigned char port8007;
ioport unsigned char port3004;
nScanCode=port8001; //读扫描码
nScanCode&=0x0ff; //扫描码只有8bit
uPort8000=port8002; //清键盘缓冲区
错误!未指定书签。

三、部分代码以及注释:
乐谱数组定义
unsigned int music[nMusicNumber][2]=
{
{151,480},{135,480},{121,480},{114,480},{100,480},{90,480},{86,480},{75,4 80}
};
扫描码转换数字函数
char ConvertScanToChar(unsigned char cScanCode)
{
unsigned int cReturn;
cReturn=0;
switch(cScanCode)
{
case SCANCODE_1:cReturn=1;break;
case SCANCODE_2:cReturn=2;break;
case SCANCODE_3:cReturn=3;break;
case SCANCODE_4:cReturn=4;break;
case SCANCODE_5:cReturn=5;break;
case SCANCODE_6:cReturn=6;break;
case SCANCODE_7:cReturn=7;break;
case SCANCODE_8:cReturn=8;break;
case SCANCODE_9:cReturn=9;break;
case SCANCODE_Enter:cReturn=10;break;
}
return cReturn;
}
{
TCR = 0x422;
PRD = music[nCOUNT][0]; // 切换音符
Delay(music[0][1]*12); // 音长
nState = 9;//控制单个音符只演奏一遍并停止
}
void interrupt time(void) //定时器中断控制BEEP
{
SPSA0=1; // set McBSP0's SPCR2
uWork=SPSD0;
uWork&=0xfffe; // set XRST=0
SPSD0=uWork;
SPSA0=0x0e; // set McBSP0's PCR
uWork=SPSD0;
uWork|=0x2000; // set XIOEN=1, Enable IO,DX for output
uWork^=0x20; // DX=^DX
SPSD0=uWork;
}
void interrupt xint2(void) //xint2中断服务程序间键盘扫描用{
nCount++;
nCount%=256; //中断计数
if(nCount%2==1) //两次中断只处理一次{
Delay(100);
nScanCode=port8001; //读扫描码
nScanCode&=0x0ff; //扫描码只有8bit
uPort8000=port8002; //清键盘缓冲区
cKey=ConvertScanToChar(nScanCode); //将扫描码转换为数字
if(cKey==n) //返回KEY的值
{
Delay(100);
nState = n;
}
}
}
四、实验现象:
程序中
键值查找表可实现按键的重新布局或修改,并实现对蜂鸣器的控制使蜂鸣器演奏Do~Ti的音调,长按任意按键都可实现连续发声。

五、遇到难题及创新:
在编程过程中在移植key工程中,一些库文件没有添加使得scancode.h 头文件没有,在键盘扫描中发生错误,其次是在键盘控制时第一方案是直接运用分支语句直接对键盘I/O 口进行扫描,但是在实现中发现直接扫描速度慢而且经常跑错程序,因此我们使用外部中断后再嵌入扫描键盘状态,解决了之前的问题。

六、参考文献:
《基于DSP技术的音乐播放系统设计》
---- 陈芬周亚训严迪群清华大学出版社。

相关文档
最新文档