51单片机蜂鸣器演奏《我和我的祖国》

发布者:点亮未来最新更新时间:2020-03-17 来源: eefocus关键字:51单片机  蜂鸣器演奏  我和我的祖国 手机看文章 扫描二维码
随时随地手机看文章

由于同学的需要,于是用51单片机的蜂鸣器功能谱了一首《我和我的祖国》,下面是全部的代码:


#include

sbit beep = P1^5;

unsigned char timer0H, timer0L, time;


//单片机晶振采用11.0592MHz

// 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据

code unsigned char FREQH[] = {

    0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567

    0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i

    0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567

    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567

// 频率-半周期数据表 低八位

code unsigned char FREQL[] = {

    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567

    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i

    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567

    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567

//数据表           

code unsigned char song[] = {

5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我和我的祖国

1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12, //一刻也不能分割

6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6, //无论我走到哪里

7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12, //都唱出一首赞歌

5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我歌唱每一座高山

1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12, //我歌唱每一条河

1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6, //袅袅炊烟

6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6, //小小村落

7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12, //路上一道辙 

8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//我最亲爱的祖国

8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永远紧依着你的心窝

5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6,4, 2, 6, 2, 2, 4, 1, 2, 2,1, 2, 10,//你用你那母亲的脉搏和我诉说

};

//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。

//6, 2, 3 分别代表:6, 中音, 3个半拍;

//5, 2, 1 分别代表:5, 中音, 1个半拍;


void t0int() interrupt 1         //T0中断程序,控制发音的音调

{

    TR0 = 0;                     //先关闭T0

    beep = !beep;          //输出方波, 发音

    TH0 = timer0H;               //下次的中断时间, 这个时间, 控制音调高低

    TL0 = timer0L;

    TR0 = 1;                     //启动T0

}


void delay(unsigned char t)     //延时程序,控制发音的时间长度

{

    unsigned char t1;

    unsigned long t2;

    for(t1 = 0; t1 < t; t1++)    //双重循环, 共延时t个半拍

      for(t2 = 0; t2 < 4000; t2++); //延时期间, 可进入T0中断去发音

    TR0 = 0;                        //关闭T0, 停止发音

}


void sing()                      //演奏一个音符

{

    TH0 = timer0H;               //控制音调

    TL0 = timer0L;

    TR0 = 1;                     //启动T0, 由T0输出方波去发音

    delay(time);                 //控制时间长度

}


void main(void)

{

    unsigned char k, i;

    TMOD = 1;                    //置T0定时工作方式1

    ET0 = 1;                     //开T0中断

    EA = 1;                      //开总中断

    while(1) 

{

      i = 0;

      time = 1; 

      while(time) 

  {

        k = song[i] + 7 * song[i + 1] - 1;//第i个是音符, 第i+1个是第几个八度

        timer0H = FREQH[k];      //从数据表中读出频率数值

        timer0L = FREQL[k];      //实际上, 是定时的时间长度

        time = song[i + 2];   //读出时间长度数值

        i += 3;

        sing();                  //发出一个音符

  }  

    }  

}


根据下面这张简谱制作的

在这里插入图片描述

关键字:51单片机  蜂鸣器演奏  我和我的祖国 引用地址:51单片机蜂鸣器演奏《我和我的祖国》

上一篇:51单片机蜂鸣器程序
下一篇:关于单片机--蜂鸣器输出音调设置

推荐阅读最新更新时间:2024-11-11 22:38

51单片机做信号发生器实例编程
//用51单片机做信号发生器,同时输出四种频率的方波。 //要求:晶振为12MHz,用T0做定时器,在P1的低四位输出四种频率的方波: // P1.3 = 1.25kHz、P1.2 = 2.5kHz、P1.1 = 5kHz、P1.0 = 10kHz //另外,上述四个频率要求用一个四选一数据选择器,再选出其中的一个输出出去。 //P1.6、P1.7的输出用来控制四选一数据选择器的选择位,它们由P3.0按键控制。 //=================================================== //现在增加了PROTEUS仿真图片发上博客。 //题目要求在相邻四条接口线输出的四种频率,恰有二倍的关系,这就
[单片机]
<font color='red'>51单片机</font>做信号发生器实例编程
基于51单片机的计算器 C语言程序
前些日子再博客上转载了一篇计算器的C程序,由于这些日子一直忙于考试,也抽不出时间来重写一下基于C51的计算器,昨晚考完信号处理,回来就着手写,一直弄到凌晨3点多,现面把代码帖出来和大家一起共免,由于时间仓促,代码部分可能还有不足,并且程序只是再我的实验板上调试,如有不足请多多执教,程序时C和汇编混合编程,汇编部分值用到延时的处理,其他代码都用C写的,希望哪为高人能够写出功能更为强大的计算器程序一起分享,对于我的程序,哪位博友增添了更多功能的话,希望发到回复里,以共同进步! 程序代码如下: #include reg51.h #define uchar unsigned char #define uint unsigne
[单片机]
关于51单片机几个精确延时程序
简介:51单片机几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序(晶振12MHz,一个机器周期1us.) 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 =
[单片机]
51单片机判A内容是否为0转移指令JZ JNZ简介及实例
条件转移 指令 是指在满足一定条件时进行相对转移。 (1)判A内容是否为0转移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,则转移,不然次序执行(执行本指令的下一条指令)。转移到什么地方去呢?如果按照传统的办法,就要算偏移量,很麻烦,好在现在我们能借助于机器汇编了。因此这第指令我们能这样理解:JZ 标号。即转移到标号处。下面举一例说明: (2)实例 MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前如果R0中的值是0的话,就转移到L1执行,因此最终的执行结果是R1中的值为0FFH
[单片机]
51单片机 独立键盘控制
键盘部分原理图: 历程里面设计到数码管,这个参考前面的文章《 51单片机 数码显示数字 》。 代码如下: 注释很详细。 //按键key1显示数字加1,按键key2显示数字减1,按键key3清零,按键key4数字每秒加1. #include //头文件 #define uint unsigned int //宏定义 #define uchar unsigned char //按键标示声明 sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; sbit duanxuan=P2^6; sbit weixuan=P2^7;
[单片机]
51单片机学习:DAC模数转换实验
实验名称:DAC模数转换实验 接线说明: 实验现象:下载程序后,DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,由暗变亮再由亮变暗 注意事项: ***************************************************************************************/ #include public.h #include pwm.h /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输
[单片机]
基于51单片机的串口控制led灯的亮灭源程序
/*注意设置波特率为4800,向串口不断输入0,便可实现led的亮灭*/ #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit led0=P2^0; sbit led1=P2^1; sbit led2=P2^2; /******************************************************************************* * 函数名 :UsartInit() * 函数功能 :设置串口 * 输入
[单片机]
MCS-51单片机内部程序存储器ROM结构详解
MCS-51单片机的程序存储器用于存放编好的程序和表格常数。8051片内有4 KB的ROM,8751片内有4 KB的EPROM,8031片内无程序存储器。 MCS-51的片外最多能扩展64 KB程序存储器,片内外的ROM是统一编址的。如端保持高电平,8051的程序计数器PC在0000H~0FFFH地址范围内 (即前4 KB地址) 是执行片内ROM中的程序,当PC在1000H~FFFFH地址范围时,自动执行片外程序存储器中的程序;当保持低电平时,只能寻址外部程序存储器,片外存储器可以从0000H开始编址。 MCS-51的程序存储器中有些单元具有特殊功能,使用时应予以注意。 其中一组特殊单元是0000H~0002H。系统复位后,(
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved