【【51单片机的蜂鸣器之孤勇者】】

学会孤勇者,小学生里当大哥

先给好兄弟们讲一下这个常规的蜂鸣器模板
因为我学的时候是在设计数组上用了一维数组 其实用二维数组是非常好的
我上传了一个二维的音符编辑 这个东西挺好用 感谢
我这里写一下江科大所讲授的基本逻辑

main.c

就是如此

#include <REGX52.H>
#include "Delay.h"
#include"Timer0.h"

sbit Buzzer=P2^5;

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P    0
#define L1    1
#define L1_    2
#define L2    3
#define L2_    4
#define L3    5
#define L4    6
#define L4_    7
#define L5    8
#define L5_    9
#define L6    10
#define L6_    11
#define L7    12
#define M1    13
#define M1_    14
#define M2    15
#define M2_    16
#define M3    17
#define M4    18
#define M4_    19
#define M5    20
#define M5_    21
#define M6    22
#define M6_    23
#define M7    24
#define H1    25
#define H1_    26
#define H2    27
#define H2_    28
#define H3    29
#define H4    30
#define H4_    31
#define H5    32
#define H5_    33
#define H6    34
#define H6_    35
#define H7    36


#define SPEED 500  //我们以4分音符为基准
unsigned int FreqTable[]={
    0,
    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524,
    64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
    65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283
};

unsigned int code  Music[]={
//音符,时值,
    
    //添加想要的乐谱
    
    
    //
    0xFF
};

    unsigned int FreqSelect,MusicSelect;
    
void main()
{
    
    Timer0Init();
    while(1)
    {
        if(Music[MusicSelect]!=0xFF)
        {
        FreqSelect=Music[MusicSelect];
        MusicSelect++;
        Delay(SPEED/4*Music[MusicSelect]);
        MusicSelect++;
       TR0=0;
        Delay(5);
        TR0=1;    
            
        }
        else
        {
            TR0=0;
            while(1);
            
        }
        
    }    
    
}


void Timer0_Routine() interrupt 1
{
    if(FreqTable[FreqSelect])    //如果不是休止符
    {
        /*取对应频率值的重装载值到定时器*/
        TL0 = FreqTable[FreqSelect]%256;        //设置定时初值
        TH0 = FreqTable[FreqSelect]/256;        //设置定时初值
        Buzzer=!Buzzer;    //翻转蜂鸣器IO口
    }
}

另外的四个模块

照抄我前面发的 timer0.c timer0.h delay.c delay.h

给兄弟们写点 流行歌曲的曲谱
直接复制粘贴即可
孤勇者直接从高潮开始

   //添加想要的乐谱
    //爱你孤身走暗巷
    M6_,2, 
    M7,2, 
    H1_,2, 
    M6_,2, 
    M7,2, 
    M7,4,
    M7,2, 
    M6_,2, 
    M7,2, 
    H1_,2, 
    M6_,2,
    M7,2, 
    M7,4, 
    M7,2, 
    H1_,2, 
    H2_,2, 
    H1_,2, 
    H2_,2,
    H1_,2,
    H2_,4,
    H2_,2,
    H1_,2,
    H2_,4,
    H4_,4,
    H2_,4,
    M5_,2,
    M6_,2,
    M7,2,
    H1_,2,
    M6_,2,
    M7,2,
    M7,4,
    M7,2,
    M6_,2,
    M7,2,
    H1_,2,
    M6_,2,
    M7,2,
    M7,4,
    M7,2,
    H1_,2,
    H2_,2,
    H1_,2,
    H2_,2,
    H1_,2,
    H2_,4,
    H2_,2,
    H1_,2,
    H2_,4,
    H4_,4,
    H2_,4,
    H4_,4,
    H2_,4+2,
    H4_,2,
    H2_,4+2,
    H4_,2,
    H2_,2,
    H4_,2,
    H5_,2,
    H2_,2,
    H4_,4,
    H4_,4,
    H2_,4+2,
    H4_,2,
    H2_,4+2,
    H4_,2,
    H2_,2,
    H4_,2,
    H5_,2,
    H2_,2,
    H4_,4,
    H4_,2,
    H4_,2,
    H2_,2,
    H1_,2,
    H1_,4,
    H1_,4,
    M7,2,
    M7,2,
    M7,2,
    H1_,2,
    H1_,4,
    H1_,4,
    M7,2,
    M7,2,
    M5_,8+8,
    
    H4_,2,
    H4_,2,
    H2_,2,
    H1_,2,
    H1_,4,
    H1_,4,
    M7,2,
    H2_,2,
    H2_,2,
    H1_,2,
    H1_,4,
    H1_,4,
    M7,2,
    M7,2,
    M5_,8+8,
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以为您提供一个简单的c51单片机蜂鸣器歌曲示例程序,您可以根据需要进行修改。 ```c #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit beep=P1^5; //定义蜂鸣器控制引脚 //定义简单的音符和节拍 uchar code song[]={ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x01, //音符 0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x01, //音符 0x03,0x03,0x04,0x05,0x06,0x06,0x07,0x01, //音符 0x05,0x06,0x07,0x01,0x02,0x03,0x02,0x01, //音符 0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04, //音符 0x05,0x05,0x06,0x06,0x07,0x07,0x01,0x01, //音符 0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05, //音符 0x06,0x06,0x07,0x07,0x01,0x01,0x02,0x02, //音符 0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06, //音符 0x07,0x07,0x01,0x01,0x02,0x02,0x03,0x03, //音符 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07, //音符 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, //音符 }; uchar code time[]={ 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,2,1, //节拍 1,1,1,1,1,1,1,1, //节拍 1,1,1,1,1,1,1,1, //节拍 }; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { uchar i,j; while(1) { for(i=0;i<72;i++) //循环播放歌曲 { for(j=0;j<time[i];j++) //根据节拍播放音符 { beep=0; delay(song[i]*10); beep=1; delay(1); } delay(10); //每个音符之间的间隔 } } } ``` 这个示例程序使用了一个简单的歌曲,可以通过修改 `song[]` 和 `time[]` 数组来播放不同的歌曲。同时,根据需要还可以修改每个音符的持续时间和间隔时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值