当前位置: 首页> 游戏> 网游 > 51单片机:使用蜂鸣器演奏《盗将行》(附代码详解)

51单片机:使用蜂鸣器演奏《盗将行》(附代码详解)

时间:2025/7/10 17:58:41来源:https://blog.csdn.net/weixin_67341796/article/details/140298586 浏览次数:0次

一、功能实现:

 

 

二、代码内容:

主函数.c

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"sbit Buzzer=P2^5;#define SPEED 500
//原先默认一个四分音符延迟500ms#define P 0      //休止
#define L1 1     //低音1
#define L1_ 2    //低音1升半音
#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 36unsigned int FreqTable[]={0,//第零位是休止符63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,//12低音64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,//12中音65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283 //12高音};//Music[]数组中每行第一个为音调,第二个为延续时间	
//以16分音符为1,8分音符为2,4分音符为4,2分音符为8,全音符为16//RAM只有512字节,不够存储
//ROM有8K(FLASH),使用ROM,Music前要加code,但是此时性质变为只可读取,不可修改unsigned char code Music[]=
{	//音符,时值,//line1M1,2+1,M1,1,L6,2,M1,2,M3,2,M2,2+2,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M1,2,M2,2,M3,2,L5,2+2+1,M5,1,//Line2L5,2,L5,2,L3,2,M5,2,M3,4,M3,2,M2,2,L6,4,M1,2,M3,2,M2,2+4,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M3,2,M3,2,M1,2,M2,2,P,2,M1,2,//Line3M3,2,M3,2,M2,2,M3,2,L6,4+4,P,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M3,2,M2,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M3,2,M2,4,P,2,M3,2,//Line4M5,2,M5,2,M5,2,M1,2,M2,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M5,2,M6,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M2,2,M3,2,L5,2,L5,2,L3,2,//Line5L5,4,L5,2,L7,2,L6,4+4,0xFF	//终止标志
};unsigned char FreqSelect,MusicSelect=0;void main()
{Timer0_Init();while(1){		if(Music[MusicSelect]!=0xFF){FreqSelect=Music[MusicSelect];MusicSelect++;//原先默认一个四分音符延迟500ms,此程序由于四分音符延长时间为4部分,则一部分的延长时间为125msDelay(SPEED/4*Music[MusicSelect]);MusicSelect++;		TR0=0;//停止计时Delay(5);TR0=1;//开始计时			}else{TR0=0;while(1);}}}void Timer0_Routine() interrupt 1
{   if(FreqTable[FreqSelect]!=0){TL0 = FreqTable[FreqSelect]%256;TH0 = FreqTable[FreqSelect]/256; Buzzer=!Buzzer;		}}

定时器.c

#include <REGX52.H>
/*** @brief  定时器0初始化,1毫秒@11.0592MHz* @param  无* @param  无* @retval 无*///由软件生成的定时器计算,注意每次要重新配置参数
void Timer0_Init(void)		
{//AUXR &= 0x7F;			//(89C52因为版本老没有这个寄存器)定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x66;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时//(补上)ET0=1;//允许中断EA=1;//允许总中断PT0=0;//中断优先级为0
}/*
void Timer0_Init()//定时器+中断系统的初始化函数
{//原理图在开发手册P190//TMOD=0x01;  //0000 0001  from 开发手册P189-定时器工作模式//TMOD是不可位寻址只能整体赋值	TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不变/*假设TMOD为1010 00111010 0011 & 1111 0000 = 1010 0000TMOD=TMOD&0xF低四位清零,高四位保持不变TMOD=TMOD|0x01;//把TMOD的最低位改为1,高四位保持不变1010 0000 | 0000 0001 =1010 0001最低位改为1,高四位保持不变TF0=0;   //from 开发手册P188-定时器控制-中断//TCOM是可位寻址可以对其中的每一位单独赋值,TF0就是其中一位TR0=1;  //from 开发手册P188-定时器控制-开始计数0~65535每隔一微秒计数加一总共定时时间位65535微秒如果赋初始值为64535,距离计数器计数器溢出差值1000所以计时时间为1毫秒P190原理图TH0=64535/256;TL0=64535%256;16进制存储在两个寄存器,分高低位如果以10进制为例子
123存储在两个寄存器内
123/100=1(高位)
123%100=23(低位)//下面是中断系统的初始化,是老一代51单片机,现在单片机可以向下兼容的。ET0=1;EA=1;PT0=0;}
*//*初始化后如何在主代码中使用定时器T0的功能,定时器T0的中断号为1举个例子void Timer0_Routine() interrupt 1
{   static unsigned int T0Count;//退出此程序后不刷新数据,保留数据,称为局内的静态数据TL0 = 0x66;TH0 = 0xFC; //计时器溢出默认为0,下一次中断会变成65倍的时间//将其设定为T0Count++;if(T0Count>=500){T0Count=0;}}
*/

定时器.h

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);#endif

Delay.c

void Delay(unsigned int xms)	
{unsigned char data i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

 

                                      (创作不易,主函数在主页下载资源内)

                         【免费】51单片机:蜂鸣器播放音乐(盗将行).zip资源-CSDN文库

                                                                谢谢大家!

                                                        小白一枚,请多指教!                                                               

                                                         FROM 明月清风mls

 

 

 

关键字:51单片机:使用蜂鸣器演奏《盗将行》(附代码详解)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: