⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.c

📁 利用MCU51控制蜂鸣器播放乐曲
💻 C
字号:
/**************Copyright********************************
**			单位:南京工业大学信息学院电子系
**			网址:http://cise.njut.edu.cn
**			日期:2008.5.21
**			实验内容:通过蜂鸣器播放音乐
**************Copyright*********************************/

/*****以下是单片机与8155控制线的接线说明******
		 			8155		MCU(1) 		
数据口:  			D0~D7 		P10~P17	
IO口与RAM选择口:	8155IO/M	P20     	
片选端:			CE			P27	
*****以上是单片机与8155控制线的接线说明******/

/*****以下是单片机与蜂鸣器的接线说明******
		 			蜂鸣器		MCU(1) 		
	:  			 1			P10						
*****以上是单片机与蜂鸣器的接线说明******/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
#include<math.h>

#define uint  unsigned int
#define uchar unsigned char

//定义8155端口地址
#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]

/************************段码说明***********************
段码  D7  D6  D5  D4  D3  D2  D1  D0
段名  a   b   c   d   e   f   g   dp
*************************段码说明**********************/
unsigned char code  Table1[16]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};  //0~F的段码
unsigned char Dis_BUF[4]={1,0,0,0};//显存

//定义蜂鸣器的管脚
sbit bell=P1^0;
//乐曲数据://格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10,0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00
};


/****************************************************
函数名称:
功能: 延时函数
参数: unsigned int i(四位数组显存)
返回值:无
****************************************************/
void delay(unsigned int itime)                                                  //延时函数
{   
	while(itime--);  
} 

unsigned char TenMS_Num;   //延时10MS的次数
//定义定时器初值//for(10ms)
#define STH0 0xD8   
#define STL0 0xF0 
/****************************************************
函数名称:
功能: 定时器0中断函数,产生10MS精确定时
参数: 
返回值:无
****************************************************/
void Int_Time0(void)  interrupt 1 using 1  
{  
	TH0=STH0;
   	TL0=STL0;
   	TenMS_Num--;
}

/****************************************************
函数名称:
功能: 播放音乐
参数: unsigned char *Pt_Music(音乐数据组)
返回值:无
****************************************************/
void Play_Music(unsigned char *Pt_Music)
{
	unsigned char Overflag=1;
	unsigned char Music_Freq;//Music_Freq为频率常数
	unsigned char Music_Time;//Music_Time为节拍常数 
	while(Overflag)
	{
		switch(*Pt_Music)
		{
			case 0x00:// 曲终停顿一定时间,并设置结束标志位
					Overflag=0;
					delay(60000); 
					delay(60000);  
					break;
		  	case 0xff://遇到休止符停顿一定时间100微秒,再取下一个频率
					Pt_Music++;
					delay(50);	
					break;
		  	default:
					Music_Freq=*Pt_Music++;
					Music_Time=*Pt_Music++;//取频率到m,取节拍到n  
					TenMS_Num=Music_Time;
          			TR0=1;
            		while(TenMS_Num!=0)
              		{
              			P1=bell;
                  		delay(2*Music_Freq);//调整产生的频率,可以通过在m前的值来修正音调的高低
       			   		bell=!bell;
              		}
    				TR0=0;
					break;
		}
	}
}


/****************************************************
函数名称:
功能: 显示函数,将温度显示在数码管上
参数: *Bufptr(四位数组显存)
返回值:无
****************************************************/
void Disp_lED(unsigned char *Bufptr)                           
{
	unsigned char disi;
	unsigned char BitCT=0X10;
   	for(disi=0;disi<4;disi++)
   	{
  		PA8155=BitCT;                                    	//选中个位数码管
   		PB8155=Table1[*Bufptr++];                         	//取段码
   		BitCT=_crol_(BitCT,1);								//左移一位
		delay(500);
  	} 
}

//主函数
void main()
{
	
	COM8155=0x03;                         //初始化8155控制口
	Disp_lED(Dis_BUF);
	
	//初始化定时器
	TMOD=(TMOD&0xf0)|0x01;
	TH0=STH0;
	TL0=STL0;
	EA=1;
	ET0=1;
	TR0=0;        
	while(1)                         	
  	{   
		Play_Music(music_tab);
  	}   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -