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; } }
音符与频率对照表:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了