一、乐理基础

相关名词
音名:do re mi fa so la xi
唱名:C D E F G A B,此外还有#C #D #E…表示升一个调
半音:C和#C的频率比值为1:2,它们之间相差12个半音,相差一个半音的两个音符的频率比值为 2^1/12^=1.059463094
全音:一个全音等于两个半音
频率:钢琴键盘的中央C的周期的1/2为 956us
音程差:可以用两个音之间包含的半音个数来表示
音程差是这样分布的:(全+全+半+全+全+全 + 半 = 12个半音)

通过这个图可以计算得到:

唱名 C D E F G A B
半周期/us 956 852 759 716 638 1568 506

二、初始化

变量定义

#define X 1.05946    //半音比值sbit beep=P3^4;      // 蜂鸣器端口
sbit P3_3=P3^3;        //key2
sbit P3_2=P3^2;        //key1
sbit key1=P3^2;
uint y=956;            //音调Do的半周期
uint i=1;
uint half_T[8] = {0};  //存储所有音调的半周期

初始化函数:设置推挽输出以及相关变量初始值

void init()
{P3M0=0x10;                //推挽输出P3M1=0x00;for (i=0; i<8; i++)      //设置每个音的半周期{if (i == 1) half_T[i] = 956;if (i == 2 || i == 3 || i==5 || i==6 || i==7)half_T[i] = half_T[i-1]/X/X;if (i == 4)half_T[i] = half_T[i-1]/X;}TMOD=0x01;             //设置定时器和中断TH0=(65536-y)/256;TL0=(65536-y)%256;EA=1;                  //开启总中断ET0=1;                  //开启T0中断TR0=1;                 //T0开始计时beep=0;key1=1;
}

三、中断函数

中断函数定义

void timer0() interrupt 1
{beep=~beep;TH0=(65536-y)/256;        //音调不同,周期不同,定时器初值不同TL0=(65536-y)%256;
}

注意对不同音调使用的是半周期,蜂鸣器引脚两次取反就是一个周期对的时间了


四、主函数

在主函数中,我们只需要建立起按键与半周期的关系就可以了,设置y的值来修改定时器初始值,实现蜂鸣器的不同频率发声:

main()
{init();i = 1;while(1){delay(200);         // 防止音调持续变化if( key1 == 0 )        // 延时消抖{delay( 10 );if( key1 == 0 )   //按下按键后升一个音调{if (i==7)i = 1;elsei = i+1;y = half_T[i];}}}
}

以上就是全部的内容了,持续通过中断函数来翻转蜂鸣器端口的电平,通过按键设置定时器的定时周期,这样就实现了可变调的蜂鸣器。


第七篇学习笔记完结 cheers !?

单片机学习笔记 —— 可变调的蜂鸣器相关推荐

  1. 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】

    C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...

  2. 51单片机学习笔记【七】——蜂鸣器和继电器

    一.蜂鸣器 1.蜂鸣器基础 蜂鸣器按驱动方式分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内部带振荡器,接入一个低电平便会响:无源蜂鸣器不带振荡器,让它响要接500HZ~4.5KHZ之间的脉冲信号来驱动才会响 ...

  3. [51单片机学习笔记TWO]----蜂鸣器

    蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...

  4. 51单片机学习笔记5 流水灯实现及蜂鸣器控制

    51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...

  5. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  6. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

    一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...

  7. 单片机学习笔记-数码管的显示

    单片机学习笔记-数码管的显示 数码管的显示 1.首先我们来看一下开发板的原理图 由管脚分配可知,数码管的末端(也就是LED端),是由74138译码器来控制的. 2.下面是数码管显示的函数 这里我们使用 ...

  8. [单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计

    串级PID算法应用剖析 这是经过给队友讲解串级PID的程序的之后的进一步的理解总结. 内环的实际值,取决于你能测出什么值给内环.而内环的输入就是内环误差 内环的输出值,是内环误差(内环目标值-内环实际 ...

  9. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

最新文章

  1. R语言使用lm构建线性回归模型、并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary)、模型训练(测试)集自由度计算、模型训练(测试)集残差标准误计算
  2. pycharm中导出依赖包 在pycharm下边的Terminal打开命令行终端执行命令
  3. 难道这是残差结构的本质(addnorm)
  4. Java与Unicode
  5. matlab中怎么给符号变量赋值
  6. JSP页面中的pageEncoding和contentType两种属性
  7. JS引用类型 -- Array类型
  8. JAVA与SAP数据交互的方式总结
  9. python中文叫什么-python中文叫什么
  10. 分享一个开源的项目,数据结构和算法必知必会的50个代码实现
  11. 利用BayesianOptimization库对模型进行贝叶斯调参(XGBOOST)
  12. 算法第四版_第二章_练习题_2.1.1~2.1.12
  13. PHP实现pop3,用PHP实现POP3邮件的收取(二)
  14. Shopify速度优化
  15. 本地文件无法复制到VMware虚拟机
  16. 电脑显示your pc android,新版DeX模式不再强调手机变PC,而是让Android融合PC
  17. 量子力学考研书籍介绍
  18. An invalid domain [.xx.com] was specified for this cookie 异常记录
  19. 新东方---博客分类目录
  20. MMORPG游戏优化报告

热门文章

  1. 代码整洁之道(读后感)
  2. Fiber Optic Enclosure: What to Benefit From It?
  3. MT5外汇软件好用吗
  4. 非root用户安装Anaconda3 + setuptools + phonopy模块
  5. 正荣地产再获增持评级,负债增长,经营效率有待提高
  6. 逃避日志记录攻击过程
  7. 谈谈老罗的锤子手机rom发布会
  8. 爆款文章阅读量快速提升的一个关键点!
  9. 直播视频app源码,高度不能充满全屏
  10. 宁要一个完成,不要千万个开始(转载自豆瓣)