【51单片机】10-蜂鸣器

1.蜂鸣器的原理
这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵,就是因为里面含有震荡电路。
1.无源蜂鸣器原理
(1)早期的蜂鸣器都是无源的
(2)内部结构和材料
(3)发生原理:是利用了压电效应的原理
(4)控制信号,是高低电平相间
(5)电路图
(6)音调如何控制:音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起来越刺耳。
(7)声音大小如何控制。由硬件决定的。无法写代码取控制声音大小。
2.有源蜂鸣器
1.无源蜂鸣器的缺陷
无源蜂鸣器只能在一定的范围内进行设置,太大或者太小都不行。【外部提供一个方波】
2.内置震荡电路后形成有源蜂鸣器
在内部添加震荡电路,不用使用外部的方波进行控制【但是内部的震荡电路是不可以改变的】
3.有源蜂鸣器也可以用频率信号驱动
可以直接加电也可以直接通过方波进行工作【有源蜂鸣器包含无源蜂鸣器】
4.三极管驱动


5.蜂鸣器发声音频率

2.让蜂鸣器响起来
1.接线确定

2.使用delay让蜂鸣器响起来
#include<reg51.h>sbit BUZZER=P0^0; //buzzer的驱动引脚void delay(void){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<10;j++);}}void main(){while(1){BUZZER=1;//将引脚变外高电平delay();BUZZER=0;delay();}
}
3.调节delay控制音乐的变化
控制delay中的i和j的大小,可以控制音调的振动频率,从而影响声音的尖锐。
如果i和j越大,则音调越小,声音越不尖锐
如果i和j越小,则音调越大,声音越尖锐


4.时钟周期的计算



3.用定时器控制蜂鸣器音调
1.上节驱动方法的问题
(1)不容易精确控制时间
(2)CPU控制蜂鸣器中不能做其他事
2.定时器控制蜂鸣器响
在一定时间后,通过定时器中的中断处理程序取减低蜂鸣器的电平,从控制蜂鸣器的响应
(1)10KHz=>1/10000s=>100us===>高电平+低电平的时间都为50us。所以要定的时间就是50us
(2)外部晶振12MHz+12T设置==>内部时钟频率1MHz===》1us===》TL0=255-50=205,TH0=255
3.注意点1:TL0和TH0的计算
我们在设置TH0和TL0应该将获得的时间取其补码
比如:我们是TL0=50; TH0=0;
则我们应该写入“TL0=205;TH0=255;"
TL0=205;TH0=0;
TL0=205 % 256;//低位取余TH0=255/ 256;//高位取商
4.注意点2:定时器的计算
(65536-50000)/256
计数器是16位的,由高8位TH0和低8位TL0组成,可以存储2^16=65536个数,例如当设定计算值为65536-50000=15536时,也就是计数器从15536开始计时,到65536溢出,产生中断,对于晶振频率为12MHz的单片机来说,执行一个机器周期时长为1us,所以这里计时50000us,15536(D)转换为16进制是3CB0(H),此时TH0=3C,TL0=B0分别装入定时器即可,为了免除这些计算步骤,很多编程者采用"TH0=(65536-50000)/256;TL0=(65536-50000)%256",那么为什么要介入256呢?我们可以做一下运算,256(D)=0100(H),512(D)=0200(H),512(D)有两个256,所以高8位就是02,那么15536有多少个256?就是15536/256个,就相当于高8位有多少数值,商存入高8位,剩下的不足一个256,存入低8位,15536%256。
直接使用宏定义
【注意点】我们51是加法计数器,所以是65535-US
//宏定义一个时钟频率
#define XKHZ 10 //10*10的三次方Hz 要定多少Khz,就定义在这里
//宏定义us
//这里我们除以2,是因为想要分给TH0和TL0
//1000---》1000ms
#define US (1000/XKHZ)/2
sbit BUZZER=P0^0; //buzzer的驱动引脚
//【注意点】因为51单片机是加法计数器,所以实际上我们要算的范围
//应该是65535-US,而不是0-US
#define N (65535 -US)void delay(void){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<10;j++);}}void timer0_isr(void) interrupt 1 using 1{//这里再一次赋值,是因为我们想要他循环,所以我们要在他每一次进来的时候重新赋值TL0=N % 256;//低位取余TH0=N / 256;//高位取商BUZZER=!BUZZER;}
4.蜂鸣器发出滴滴声音

通过count可以控制有声音和无声音的长短
#include<reg51.h>/**用定时器控制蜂鸣器音调
*/
//宏定义一个时钟频率
#define XKHZ 10 //10*10的三次方Hz 要定多少Khz,就定义在这里
#define US (1000/XKHZ)/2
sbit BUZZER=P0^0; //buzzer的驱动引脚
#define N (65535 -US)//计数器
unsigned int count;//判断此时是从”有声音“到"没声音”,还是从“没声音”到“有声音”
unsigned char flag=0; //flag=0表示有声音,flag=1表示没有声音void delay(void){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<10;j++);}}void timer0_isr(void) interrupt 1 using 1{//这里再一次赋值,是因为我们想要他循环,所以我们要在他每一次进来的时候重新赋值TL0=N % 256;//低位取余TH0=N / 256;//高位取商if(count--==0){//说明到了翻转的时候了//count=5000;//记得重新赋值,要不然就只能响一次if(flag==0){//说明之前处于有声音的,说明本次是从有声音到无声音的翻转flag=1;//此时“无声音”比“有声音”的时间还长了3倍count=600*3;}else{//说明之前没声音的,说明本次是没声音到有声音的翻转flag=0;//下面这句话,加上了,则表示在翻转的时候也会出现声音BUZZER=!BUZZER;count=600;}}else{//常规情况,也就是不翻转时候if(flag==0){BUZZER=!BUZZER; //4999次声音}else{//空的,因为不进行任何IO操作就是没有声音}}}void main(){//【第一步】初始化:我们使用的是定时器T0TMOD=0x01; //T0使用16位bit定时器//********************************************************TL0=N % 256;//低位取余TH0=N / 256;//高位取商//********************************************************//打开计数器;TCON中的TR0【定时器T0的运行控制位】TR0=1; //T0打开开始计数//T0的中断溢出位,表示允许中断ET0=1; //T0中断允许EA=1; //打开中断允许BUZZER=1;//设置响和不响的周期时间count=5000; //5000*100us=500ms//初始化,有声音flag=0;}
5.让蜂鸣器唱歌
1.为什么蜂鸣器可以唱歌
(1)发声音频可变---》延迟函数(delay)
(2)发声音长度可变---》定时器
unsigned char i;
for(i=0;i<200;i++){//控制声音响应时间长短Sound=~Sound;DelayXms(1);//控制声音的不同
}for(i=0;i<50;i++){Sound=~Sound;DelayXms(2);
}
2.分析写好的唱歌程序
(1)复制代码过去
(2)修改控制蜂鸣器的IO引脚定义
3.”code“关键字的使用
因为我们加入的歌曲的编码是固定不变的,但是51单片机的内存有限制,所以我们只能把歌曲的编码放在常量区中,才使得其不会占据内存。则加上“code”关键字。
unsigned char code music_tab[] =
{ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C,
}
4.音节的构成

0x18, 0x30, 0x1C , 0x10,【2个一组】
(1)音调【振动频率决定】:0x18【奇数次】
(2)音长:0x30【偶数次】

注意点:


5.音频 VS 音调
(1)音节:定时器T0控制的是音乐的节拍(某一个音节持续时间)而不管音调(频率)
(2)音调【音频】:是直接使用delay做出来的,控制发出什么样子的声音
/************************************************************************
[文件名] C51音乐程序(八月桂花)
[功能] 通过单片机演奏音乐 /**********************************************************************/ #include <REG51.H>
//提供移位函数,可以省略
//#include <INTRINS.H>
//本例采用89C52, 晶振为11.0592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧! sbit Beep = P0^0 ; // 要根据实际的接线来修改unsigned char n = 0; //n为节拍常数变量
unsigned char code music_tab[] =
{ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00
}; // T0定时控制的是音乐的节拍(某一个音节持续的时间)而不管音调(频率)// 音调是直接使用delay做出来的。
void int0() interrupt 1 //采用中断0 控制节拍
{ TH0 = 0xd8; TL0 = 0xef; n--;
} void delay (unsigned char m) //控制频率延时
{ unsigned i = 3 * m; while (--i);
} void delayms(unsigned char a) //豪秒延时子程序
{ while (--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
} void main()
{ unsigned char p, m; // m为频率常数变量 unsigned char i = 0; //此处表示将:低4位留下了,高4位去除TMOD &= 0x0f; TMOD |= 0x01; // timer0 工作在模式1,16位定时器下 TH0 = 0xd8;TL0 = 0xef; // 这个TH和TL的值合起来定了1个10ms左右的一个时间IE = 0x82;
play: while (1) {
a: p = music_tab[i]; //表示指向第一个if (p == 0x00) // 一遍播放完了,延时1s后自动开始下一遍 { i=0;delayms(1000); //表示播放完一次,延迟1s,接着下一次播放//如果想要播放一次,则下面goto注释goto play; //跳转接着播放} //如果碰到结束符,延时1秒,回到开始再来一遍 else if (p == 0xff) //0xff:休止符{ i = i + 1;//跳过这一组数据delayms(100);TR0 = 0; //TR0:关闭定时器goto a;} //若碰到休止符,延时100ms,继续取下一音符 else //常规情况p==正常情况 {m = music_tab[i++];n = music_tab[i++];} // m取频率常数【A,B,C】 和 n取节拍常数 【1/2,1/3,1/4】 //打开开定时器1 TR0 = 1; while (n != 0) //节拍不等于0{ Beep = ~Beep; //修改蜂鸣器电平 【~】与【!】一样delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!) }TR0 = 0; //关定时器1 }
}
6.切歌,暂停功能
单片机应用番外篇——蜂鸣器的应用之可实现切歌、暂停功能的简单音乐盒_哔哩哔哩_bilibili
/**使用中断处理程序控制音乐的暂停和播放,切换*///外部中断初始化void EX_init(){IT0=1;//下降沿触发方式 INT0IT1=1;//下降沿触发方式 INT1EX0=1; //外部中断0中断允许位EX1=1; //打开中断开关EA=1;//打开总的中断开关}//暂停功能
void EX0_isr() interrupt 0
{DelayXms(10);//消除抖动if(INT0==0)//这里是INT1已经定义了,对应P3.2这个IO口,可以直接使用{//暂停通过定时计数器,则将计数器进行取反TR0=~TR0;TR1=~TR1;}
}//切歌功能
void EX1_isr() interrupt 2
{DelayXms(10);//消除抖动if(INT1==0)//这里是INT1已经定义了,对应P3.2这个IO口,可以直接使用{state++;if(state==3){ //因为此时我们只有3曲歌state=0;}}
}unsigned char state=0;//控制切歌void main(){EX_init();InitialSound();while(1){switch(state){ //这个切歌,通过外部中断1,则进行转换case 0:Play(Music_Girl,0,2,345);break;case 1:Play(Music_haw,0,23,543);break;default:break;}}}相关文章:
【51单片机】10-蜂鸣器
1.蜂鸣器的原理 这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵ÿ…...
26377-2010 逆反射测量仪 知识梳理
声明 本文是学习GB-T 26377-2010 逆反射测量仪. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了逆反射测量仪的术语和定义、结构与分类、技术要求、计量学特性、试验方法、检验规 则以及标志、包装、运输与贮存。 本标准适用于…...
css实现渐变电量效果柱状图
我们通常的做法就是用echarts来实现 比如 echarts象形柱图实现电量效果柱状图 接着我们实现进阶版,增加渐变效果 echarts分割柱形图实现渐变电量效果柱状图 接着是又在渐变的基础上,增加了背景色块的填充 echarts实现渐变电量效果柱状图 其实思路是一…...
FileManager/本地文件增删改查, Cache/图像缓存处理 的操作
1. FileManager 本地文件管理器,增删改查文件 1.1 实现 // 本地文件管理器 class LocalFileManager{// 单例模式static let instance LocalFileManager()let folderName "MyApp_Images"init() {createFolderIfNeeded()}// 创建特定应用的文件夹func cr…...
vue中使用富文本编辑器
vue中使用富文本编辑器(wangEditor) wangEditor官网地址:https://www.wangeditor.com/ 使用示例 <template><div class"app-container"><div class"box"><div class"editor-tool">&l…...
13.(开发工具篇github)如何在GitHub上上传本地项目
一:创建GitHub账户并安装Git 二:创建一个新的仓库(repository) 三、拉取代码 git clone https://github.com/ainier-max/myboot.git git clone git@github.com:ainier-max/myboot.git四、拷贝代码到拉取后的工程 五、上传代码 (1)添加所有文件到暂存...
vue3中状态适配
写一个函数,在函数中定义一个对象 用于存放键值对,最后返回指定状态所对应的的值,即对象[指定状态] 的 对象的值。 在模板中把状态传入 // vue3 setup语法糖中 const formatXXXState (xxxState)>{const stateMap {键1: 值1,键2: 值2,.…...
uniapp h5 端 router.base设置history后仍有#号
manifest.json文件设置: "h5": { "router": { "base": "./", "mode": "history" }, }按相对路径发行时路由模式强制为hash模式,不支持history模式(两者相悖)…...
上网行为监管软件(上网行为管理软件通常具有哪些功能)
在我们的日常生活中,互联网已经成为了我们获取信息、交流思想、进行工作和娱乐的重要平台。然而,随着互联网的普及和使用,网络安全问题也日益突出,尤其是个人隐私保护和网络行为的规范。在这个背景下,上网行为审计软件…...
C#中的for和foreach的探究与学习
一:语句及表示方法 for语句: for(初始表达式;条件表达式;增量表达式) {循环体 }foreach语句: foreach(数据类型 变量 in 数组或集合) {循环体 }理解 1.从程序逻辑上理解,foreach是通过指针偏移实现的(最初在-1位置,每循环一次,指针就便宜一个单位),而for循环是通...
【ES6知识】Promise 对象
文章目录 1.1 概述1.2 静态方法1.3 实例方法1.4 Promise 拒绝事件 1.1 概述 Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。是异步编程的一种解决方案(可以解决回调地狱问题)。 一个 Promise 对象代表一个在这…...
【Git】配置SSH密钥实现Git操作免密
背景 在使用Git推送代码的时候,会默认需要输入密码。如果经常推送代码,那就需要经常输入密码,比较繁琐。所以Git也提供了免密登录的功能。 Git本身支持两种协议对远程Git仓库进行访问:HTTPS、SSH。两种方式有一定的区别…...
AI能给百融云带来什么?
一大堆有关ChatGPT的利好消息出现之后,市场的反应难得的跟投资者预期站在了一起,AIGC也终于有了跑赢CPO的苗头。二级市场的逻辑不用重复,毕竟AI已经炒了大半年,但有没有发现一个问题?就是在不知不觉中,AI应…...
AI创作系统ChatGPT商业运营版源码+AI绘画/支持GPT联网提问/支持Midjourney绘画+Prompt应用+支持国内AI提问模型
一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&am…...
vue.draggable拖拽,项目中三个表格互相拖拽的实例操作,前端分页等更多小技巧~
vue.draggable中文文档 - itxst.com官网在这里,感兴趣的小伙伴可以看看。 NPM或yarn安装方式 yarn add vuedraggable npm i -S vuedraggable UMD浏览器直接引用JS方式 <script src"https://www.itxst.com/package/vue/vue.min.js"></script&…...
400G DR4 QSFP-DD光模块:数据中心应用全攻略
在当今数字化时代,对于企业和供应商来说,高速数据传输至关重要。随着对更快数据传输的需求不断攀升,400G DR4 QSFP-DD光模块已经成为高速网络的最新解决方案。本文将全面介绍400G DR4 QSFP-DD光模块在数据中心应用中的优势和技术规范。 什么…...
自动驾驶:路径规划概述
自动驾驶:路径规划概述 全局路径规划Dijkstra算法A*算法RRT(随机快速探索树)算法PRM(概率路线图)算法 局部路径规划DWA(动态窗口法)算法TEB(时间弹性带)算法Lattice Plan…...
vlc将本地文件推流成ts实时流
推流 打开vlc ,打开 媒体----打开网络串流 选择文件选项卡,打开本地文件 点击添加,选择本地的mp3文件 选择串流 点击下拉框,选择udp,点击右边的【添加】按钮 输入媒体流输出地址,点击【下一个】 选择正确的…...
C# 自定义控件库之Lable组合控件
1、创建类库 2、在类库中添加用户控件(Window窗体) 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…...
解密防关联指纹浏览器:联盟营销领域的秘密武器
联盟营销在今天的数字化时代越来越受欢迎。然而,联盟营销也面临着一些挑战,其中之一就是账号关联问题。本文将介绍如何利用防关联指纹浏览器来提升联盟营销的效果和安全性。 一、什么是防关联指纹浏览器? 防关联指纹浏览器是一种工具&#…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...




