单片机学习笔记 —— 可变调的蜂鸣器
一、乐理基础
相关名词:
音名: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 !?
单片机学习笔记 —— 可变调的蜂鸣器相关推荐
- 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】
C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...
- 51单片机学习笔记【七】——蜂鸣器和继电器
一.蜂鸣器 1.蜂鸣器基础 蜂鸣器按驱动方式分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内部带振荡器,接入一个低电平便会响:无源蜂鸣器不带振荡器,让它响要接500HZ~4.5KHZ之间的脉冲信号来驱动才会响 ...
- [51单片机学习笔记TWO]----蜂鸣器
蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...
- 51单片机学习笔记5 流水灯实现及蜂鸣器控制
51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...
- AutoLeaders控制组—51单片机学习笔记
文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...
- 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示
一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...
- 单片机学习笔记-数码管的显示
单片机学习笔记-数码管的显示 数码管的显示 1.首先我们来看一下开发板的原理图 由管脚分配可知,数码管的末端(也就是LED端),是由74138译码器来控制的. 2.下面是数码管显示的函数 这里我们使用 ...
- [单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计
串级PID算法应用剖析 这是经过给队友讲解串级PID的程序的之后的进一步的理解总结. 内环的实际值,取决于你能测出什么值给内环.而内环的输入就是内环误差 内环的输出值,是内环误差(内环目标值-内环实际 ...
- 51单片机学习笔记-1简介及点灯
51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...
最新文章
- R语言使用lm构建线性回归模型、并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary)、模型训练(测试)集自由度计算、模型训练(测试)集残差标准误计算
- pycharm中导出依赖包 在pycharm下边的Terminal打开命令行终端执行命令
- 难道这是残差结构的本质(addnorm)
- Java与Unicode
- matlab中怎么给符号变量赋值
- JSP页面中的pageEncoding和contentType两种属性
- JS引用类型 -- Array类型
- JAVA与SAP数据交互的方式总结
- python中文叫什么-python中文叫什么
- 分享一个开源的项目,数据结构和算法必知必会的50个代码实现
- 利用BayesianOptimization库对模型进行贝叶斯调参(XGBOOST)
- 算法第四版_第二章_练习题_2.1.1~2.1.12
- PHP实现pop3,用PHP实现POP3邮件的收取(二)
- Shopify速度优化
- 本地文件无法复制到VMware虚拟机
- 电脑显示your pc android,新版DeX模式不再强调手机变PC,而是让Android融合PC
- 量子力学考研书籍介绍
- An invalid domain [.xx.com] was specified for this cookie 异常记录
- 新东方---博客分类目录
- MMORPG游戏优化报告