📄 main1.c
字号:
/************************************************************************************
* Copyright (c) 2008,重庆优易特电子
* All rights reserved.
* 摘 要: 播放音乐:两只老虎
* 文件名称: main.c
* CPU芯片: STC89C51RC
* 学习板型: Easy51-B
*
* 当前版本: 2.0
* 作 者: cache
* 完成日期: 2008年1月23日
*
*************************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define FREQ 11059200
unsigned char code music_tab[]={ //两只老虎,高4位为音乐节拍,低4位为音符
0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,
0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x14,0x33,0x31,
0x31,0x35,0x41,0x31,0x35,0x41,
0
};
unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//节拍延时单位
unsigned char code music_freq_tab[16]={
0xff,0xea, //0 休止符
255-FREQ/24/1049/256, //1 do 高字节 //255-FREQ/24/x/256
255-FREQ/24/1049%256, //1 do 低字节 //256-FREQ/24/x%256
255-FREQ/24/1178/256,256-FREQ/24/1178%256, //2 re
255-FREQ/24/1322/256,256-FREQ/24/1322%256, //3 mi
255-FREQ/24/1400/256,256-FREQ/24/1400%256, //4 fa
255-FREQ/24/1572/256,256-FREQ/24/1572%256, //5 suo
255-FREQ/24/1665/256,256-FREQ/24/1665%256, //6 la
255-FREQ/24/1869/256,256-FREQ/24/1869%256, //7 xi
};
unsigned char temp_TH1;
unsigned char temp_TL1;
sbit PIN_MSC=P1^4; // 音乐输出端口 //
void music_delay(unsigned char x); //音乐节拍延时
void music_play(unsigned char *msc); //播放音乐子程序
//---------------------------------------------------------------------------//
void music_int_t1 (void) interrupt 3 using 1 //定时中断1//
{
PIN_MSC=~PIN_MSC;
TH1=temp_TH1;
TL1=temp_TL1;
}
//---------------------------------------------------------------------------//
void music_delay(unsigned char n) //延时 125*n 毫秒
{
unsigned char i=125,j;
do {
do {
for (j=0; j<230; j++) _nop_();
}while(--i);
}while(--n);
}
//---------------------------------------------------------------------------//
void music_play(unsigned char *msc) //音乐
{
unsigned char music_long; //节拍
unsigned char music_data=0; //音符数据
temp_TH1=0xff;
temp_TL1=0xea; //关输出(输出超声波)
TH1=temp_TH1;
TL1=temp_TL1;
TR1=1; //开T1定时器中断
//---------------------------------------------------------
while (*msc != 0x00)
{
music_data=*msc & 0x07;
music_long=*msc>>4;
//---------------------------------------------------------
if (music_long != 0) //是音符
{
temp_TH1=music_freq_tab[music_data*2];
temp_TL1=music_freq_tab[music_data*2+1];
music_delay(music_l_tab[music_long&0x07]);
}
msc++;
}
TR1=0; //播放结束
PIN_MSC=1; //关输出
}
//---------------------------------------------------------------------------//
void main(void) //示例
{
TMOD = 0x11; // TMOD: 定时器1:模式1:16位;定时器2:模式1:16位
TR1=0;
ET1=1;
EA=1;
while(1)
{
music_delay(10); //延时
music_play(music_tab);//播放音乐
}
}
//---------------------------------------------------------------------------//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -