?? 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 + -