📄 music.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 + -