定时器产生音乐的基础:

声音的频谱范围约在几十到几千赫兹,利用单片机定时器的定时中断功能,可以从一个I/O口线上形成一定频率的脉冲,经过滤波和功率放大,接上喇叭就能发出一定频率的声音,若再利用延时程序控制输出脉冲的频率来改变音调,即可实现音乐发生器功能。

要让单片机产生音频脉冲,只要计算出某一音频的周期,在将此周期除以2得到半周期,利用定时器对此半周期进行定时,每当定时时间到,将某个I/O口线上的电平取反,从而在I/O口线上得到所需要的音频脉冲。

例如中音DO的频率为523Hz,若单片机工作频率为12MHz,定时器T0设置为工作方式1,按公式计算得定时器初值为64580;高音DO的频率为1047Hz,计算得定时器初值为65058。

例如一段延时程序DELAY为1/4拍,则1拍只要调用4次DELAY程序,依此类推。

编写音乐程序时,先把乐谱的音符找出,按表建立对应的简谱码及定时器初值表,按表建立节拍码表。每个音符使用1个字节,字节的高4位存放音符的高低,低4位存放音符的节拍。“生日快乐”乐谱如下:

|5.5 6 5|1 7 -||5.5 6 5|2 1 -|5.5 5 3|1 7 6|4.4 3 1|2 1 -|

设计乐谱对应的音符节拍码表和音符对应的定时器的初值表如下:

uchar TABLE[]={
//音符节拍码表0x82, 0x01,0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
0x82, 0x01,0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4, 0x94,
0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
0x82, 0x01, 0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4, 0x94,
0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
0x00} ;
uchar TABLE1[]={
//音符对应的定时器初值表
0xfb, 0x04, 0xfb, 0x90, 0xfc, 0x09, 0xfc, 0x44,
0xfc, 0xac, 0xfd, 0x09,0xfd, 0x34, 0xfd, 0x82,
0xfd, 0xc8, 0xfe, 0x06, 0xfe, 0x22, 0xfe, 0x56,
0xfe, 0x85, 0xfe, 0x9a, 0xfe, 0xc1};

“生日快乐”乐曲的C语言程序如下:

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned intsbit BEEP=P1^0;//定义喇叭输出端口uchar tick,tl, th;//定义节拍和TO初值变量uchar TABLE[]={//音符节拍码表
0x82, 0x01, 0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
0x82, 0x01, 0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4, 0x94,
0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0x94, 0x84, 0xB4, 0xA4, 0x04,
0x82, 0x01, 0x81, 0x94, 0x84, 0xC4, 0xB4, 0x04,
0x82, 0x01, 0x81, 0xF4, 0xD4, 0xB4, 0xA4, 0x94,
0xE2, 0x01, 0xE1, 0xD4, 0xB4, 0xC4, 0xB4, 0x04,
0x00} ;
uchar TABLE1[]={
//音符对应的定时器初值表
0xfb, 0x04, 0xfb, 0x90, 0xfc, 0x09, 0xfc, 0x44,
0xfc, 0xac, 0xfd, 0x09, 0xfd, 0x34, 0xfd, 0x82,
0xfd, 0xc8, 0xfe, 0x06, 0xfe, 0x22, 0xfe, 0x56,
0xfe, 0x85, 0xfe, 0x9a, 0xfe, 0xc1};//T0中断服务函数
timer0() interrupt 1 using 1{
TL0=tl;TH0=th;//重装定时初值
BEEP=~ BEEP;//喇叭输出端口电平取反
}//基本单位延时函数
void delay1 () {
uint i;
for (i=0; i<20000;i++) ;
}
//节拍延时函数
void delay(tt) {
uchar i;
for (i=0;i<=tt;i++)
delay1();
}void main() {
uchar t,t1,k=0;//定义临时变量
while(1) {
TMOD=0x01; IE=0x82;//定义TO工作方式,开中断
while (TABLE[k]!=0){ //判断取得的音符节拍码是否为结束码
tick= (TABLE[k])&0x0f;//不是,则取节拍码
t=(_crol_(TABLE[k],4))&0x0f; //取音符码
if(t!=0) {//判断取得的音符码是否为0t1=--t*2+1;//不是,则根据取得的音符码计算TO初值t=t*2;t1=TL0=TABLE1 [t1];th=TH0=TABLE1[t];TR0=1;//启动TO
}
else TR0=0;//取得的音符码为0,则停止T0
delay(tick) ;//根据则取得的节拍码延时
k++;
}TR0=0;//取得结束码,则停止TO}
}

使用Proteus仿真电路进行仿真,点击Play按钮执行程序,从计算机的音箱中听到“生日快乐”乐曲:

【51单片机】 利用定时器产生生日快乐歌相关推荐

  1. 单片机生日快乐c语言音乐代码,教你用单片机播放生日快乐歌

    单片机C语言程序设计:播放生日快乐歌 *名称:播放音乐 说明:程序运行时播放生日快乐歌,未使用定时器中断,所有频率完全用延时实现 */ #include #defineucharunsignedcha ...

  2. 好听的歌曲单片机c语言程序,单片机C语言程序设计:播放生日快乐歌

    /* 名称:播放音乐 说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现 */ #includereg51.h> #define uchar unsigned char ...

  3. 单片机c语言生日快乐歌,单片机C语言程序设计:播放生日快乐歌

    /*  名称:播放音乐 说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现 */ #include #define uchar unsigned char #define ui ...

  4. 关于用51单片机内部定时器实现时钟和闹钟功能的概述

    关于用51单片机内部定时器实现时钟和闹钟功能的概述 仅个人观点,欢迎大家相互学习和讨论 STC89C52单片机,内部配置了三个定时器,T0\T1\T2,其中T2定时器我们几乎不用,或者说很少用到.我们 ...

  5. 51单片机之定时器\计数器的工作原理

    51单片机之定时器\计数器的工作原理 定时器/计数器的结构: 何时处于计数器方式?何时处于定时器方式? TCON和TMOD特殊功能寄存器: 定时器/计数器工作方式: 方式0:13位的定时器/计数器 方 ...

  6. 51单片机利用8266获取网络时间

    51单片机利用8266获取网络时间 我现在是成都一所不出名的二本院校大三学生,第一次来到CSDN,趁有时间,把我之前做的项目,其中一个模块拿出来和大家分享,我也是小白,希望提出宝贵意见.OK,废话不多 ...

  7. 【51单片机】定时器/计数器的工作原理和结构(一)

    [51单片机]定时器/计数器的工作原理和结构 回看下单片机中断系统内部结构: 分析内部中断触发: 先看图 TCON:和外部中断相比少了IT位设置触发方式 :1跳沿触发 0电平触发:此处我的理解是:就好 ...

  8. c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能

    原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...

  9. 51单片机计算定时器初值

    51单片机计算定时器初值 前言 理论分析 工作方式寄存器 TMOD GATE 门控位 C/T' 计数器模式和定时器模式选择位 M1 M0 工作方式选择位 定时器/计数器控制寄存器 TCON TCON补 ...

  10. python生日快乐歌_用Micro:bit播放生日快乐歌

    Micro:bit自带一个有趣的功能就是可以生成音乐播放,今天做一个简单实用的案例,用Micro:bit播放生日快乐歌. 算法: 按下按键A,显示生日快乐 播放D 播放D 播放E 播放D 播放G 播放 ...

最新文章

  1. R语言dplyr包near函数查看向量对应元素是否相同或者相近实战
  2. 一文概览深度学习中的五大正则化方法和七大优化策略
  3. Office转PDF,Aspose太贵,怎么办?
  4. ASP.NET MVC 笔记
  5. PHPCMS的产品筛选功能
  6. 用VC写Assembly代码(6)--附录1[堆和栈的区别]
  7. Python3操作mysql操作类
  8. Gradle DSL method not found android
  9. 【转载】通往性能优化的天堂-地狱 JOIN方法说明
  10. 巧用计算机教授小学英语,巧用微课构建小学英语课堂教学
  11. linux查看服务命令是什么,linux系统查看所有服务的命令
  12. xftp无法链接Linux
  13. 阿里Q3财报:阿里云连续第7个季度翻番
  14. Hashtable--练习题44:把繁体字转换为简体字
  15. 内网穿透软件NPS--客户端NPC SDK交叉编译ARM64位库
  16. HTML期末学生大作业-婚庆网页作业html+css+javascript (企业网站源码)
  17. android 8.0图标适配
  18. 几个著名的心理学实验
  19. 文件不小心删除了怎么恢复?实用的两个小妙招
  20. CPU大小端模式对C语言底层开发的影响

热门文章

  1. RabbitMQ实现即时通讯
  2. java内存模型 infoq_深入理解 java 内存模型_程晓明_infoq.pdf
  3. 服务器快速搭建AList集成网盘网站【宝塔面板一键部署AList/Docker】
  4. html传参,css接受?What 弄啥嘞?
  5. 小程序自定义filter调用报错underfined
  6. dbt2 mysql_mysql dbt2 benchmark Centos6下安装配置
  7. 微信小程序连接WiFi
  8. python爬虫爬取豆瓣电影评分排行榜前n名的前n页影评
  9. py-01-LINUX
  10. android第三方浏览器存在泄露用户隐私漏洞