51单片机(普中板)蜂鸣器控制

蜂鸣器通过震荡脉冲控制

1,尝试发声

复制代码
#include <REGX52.H>
#include "Delay.h"


sbit buzzer = P2^5; // 蜂鸣器端口
unsigned
int i; //演奏时长 void main() { while(1) { for (i=0 ; i < 500; i++) { buzzer =! buzzer; Delay(100); //100*100us = 10000us = 10ms = 0.01s = 100hz } } }
复制代码

 2,演奏音乐(演奏完停止)

复制代码
#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"

// 蜂鸣器端口
sbit buzzer = P2^5;
# define step 250

//索引与频率对照表
unsigned int FreqTable[]={
    0,
    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
    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 char Music[] = {
    13,4,
    13,4,
    20,4,
    20,4,
    22,4,
    22,4,
    20,4+4,
    0,4,
    18,4,
    18,4,
    17,4,
    17,4,
    15,4,
    15,4,
    13,4+4,
    0xff  // 截至符
};
// 
unsigned int FreqSelect,MusicSelect;

void main()
{
    Timer0_Init(); // us
    while(1)
    {
        if (Music[MusicSelect] != 0xff)
        {
                FreqSelect = Music[MusicSelect];
                MusicSelect ++;
                
                Delay1ms(step/4*Music[MusicSelect]);
                MusicSelect ++;
                
                TR0 = 0;
                Delay1ms(5);
                TR0 = 1;
        }
        else
        {
            TR0 = 0;
            while(1);
        }
        
    }
}

// 定时其中断函数
void Timer0() interrupt 1
{    
    if (FreqTable[FreqSelect])
    {
        TH0 = FreqTable[FreqSelect] / 256;                //设置定时初始值
        TL0 = FreqTable[FreqSelect] % 256;                //设置定时初始值
        buzzer =! buzzer;
    }

}
复制代码

3,演奏音乐(循环播放)

复制代码
#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"

// 蜂鸣器端口
sbit buzzer = P2^5;
# define step 250

//索引与频率对照表
unsigned int FreqTable[]={
    0,
    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
    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 char Music[] = {
    13,4,
    13,4,
    20,4,
    20,4,
    22,4,
    22,4,
    20,4+4,
    0,4,
    18,4,
    18,4,
    17,4,
    17,4,
    15,4,
    15,4,
    13,4+4,
    0xff  // 截至符
};
// 
unsigned int FreqSelect,MusicSelect;

void main()
{
    Timer0_Init(); // us
    while(1)
    {
        if (Music[MusicSelect] != 0xff)
        {
                FreqSelect = Music[MusicSelect];
                MusicSelect ++;
                
                Delay1ms(step/4*Music[MusicSelect]);
                MusicSelect ++;
                
                TR0 = 0;
                Delay1ms(5);
                TR0 = 1;
        }
        else
        {
            MusicSelect  = 0;
        }
        
    }
}

// 定时其中断函数
void Timer0() interrupt 1
{    
    if (FreqTable[FreqSelect])
    {
        TH0 = FreqTable[FreqSelect] / 256;                //设置定时初始值
        TL0 = FreqTable[FreqSelect] % 256;                //设置定时初始值
        buzzer =! buzzer;
    }

}
复制代码

音符与频率对照表:

 

posted @   记录——去繁就简  阅读(1216)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示