標(biāo)題:
52單片機(jī)想實(shí)現(xiàn)流水燈和蜂鳴器共存,流水燈跟隨蜂鳴器播放音樂,花樣閃爍
[打印本頁(yè)]
作者:
DJG
時(shí)間:
2017-12-16 22:24
標(biāo)題:
52單片機(jī)想實(shí)現(xiàn)流水燈和蜂鳴器共存,流水燈跟隨蜂鳴器播放音樂,花樣閃爍
想實(shí)現(xiàn)流水燈和蜂鳴器共存,流水燈跟隨蜂鳴器播放音樂,花樣閃爍
作者:
jinsheng7533967
時(shí)間:
2017-12-17 12:28
很簡(jiǎn)單。∧阒灰(jiǎn)譜中的節(jié)后取出來做流水路控制就OK
不知這個(gè)代碼你是否能看懂
51單片機(jī)音樂播放實(shí)驗(yàn)
-----------------------------------------------*/
#include<reg51.h> //51頭文件,
//---------常用的兩個(gè)宏定義--------------
#define uint8 unsigned char
#define uint16 unsigned int
sbit Music=P2^0;
uint16 code FreTab_Low[7]={262,294,330,349,392,440,494}; //低音頻率表
uint16 code FreTab_Mid[7]={523,578,659,698,784,880,988}; //中音頻率表
uint16 code FreTab_Hight[7]={1046,1175,1318,1397,1568,1760,1976}; //高音頻率表
/*-----------------------------------------------------
曲譜存貯格式 uchar code MusicName{音高,音長(zhǎng),...., 0,0};
末尾:0,0 表示結(jié)束。
音高由頻率決定,音長(zhǎng)也就是節(jié)拍可以自己規(guī)定,在本程序中,
定時(shí)器T1用作節(jié)拍定時(shí),定時(shí)時(shí)間為50ms,那么在該樂譜中1拍
表示50ms。
-------------------------------------------------------*/
uint8 code Happy_Birthday[]={0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,
0x14,0x0a,0x13,0x14,
0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,
0x15,0x0a,0x14,0x14,
0x11,0x05,0x11,0x05,0x21,0x0a,0x16,0x0a,
0x14,0x0a,0x13,0x0a,0x22,0x0a,
0x17,0x05,0x17,0x05,0x16,0x0a,0x14,0x0a,
0x15,0x0a,0x14,0x14,0x00,0x00
};
uint16 Fre; //存放獲取頻率值的變量
/*-----------------------------------------------
函數(shù)名:Timer_Init()
函數(shù)功能:對(duì)兩個(gè)定時(shí)器初始化
入口參數(shù):無
------------------------------------------------*/
void Timer_Init()
{
TMOD=0x11;
EA=1;
ET0=1;
ET1=0;
TR0=0;
TR1=0;
}
/*-----------------------------------------------
函數(shù)名:Timer0_Ser()
函數(shù)功能:定時(shí)器0的中斷服務(wù)程序,主要是產(chǎn)生需要的頻率
從而驅(qū)動(dòng)喇叭發(fā)出相應(yīng)的音符
入口參數(shù):無
------------------------------------------------*/
void Timer0_i() interrupt 1
{
TH0=Fre/256;
TL0=Fre%256;
if(Music==0)
Music=1;
else Music=0;
}
/*-----------------------------------------------
函數(shù)名:Music_Play(uchar *MusicTab)
函數(shù)功能:音樂播放函數(shù),
入口參數(shù):*MusicTab 所要播放音樂的首地址
------------------------------------------------*/
void Music_Play(uint8 *MusicTab)
{
uint8 *pMusic;
uint8 temp,i;
pMusic=MusicTab; //將歌曲首地址給指針變量
while(*pMusic!=0)
{
if((*pMusic&0xf0)==0x00)
Fre=65536-1000000/FreTab_Low[*pMusic&0x0f];
else if((*pMusic&0xf0)==0x10)
Fre=65536-1000000/FreTab_Mid[*pMusic&0x0f];
else if((*pMusic&0xf0)==0x20)
Fre=65536-1000000/FreTab_Hight[*pMusic&0x0f];
TH0=Fre/256; //計(jì)算頻率初值,賦高八位
TL0=Fre%256; //計(jì)算頻率初值,賦低八位
TH1=0x3c; //定時(shí)器1賦初值,定時(shí)50ms
TL1=0xb0;
pMusic++; //獲得節(jié)拍值
temp=*pMusic;
TR0=1; //開啟定時(shí)器T0
TR1=1; //開啟定時(shí)器T1
for(i=0;i<temp;i++)
{
while(TF1==0); //判斷定時(shí)器1是否溢出
TH1=0x3c;
TL1=0xb0;
TF1=0;
}
pMusic++;
}
}
/*-----------------------------------------------
函數(shù)名:main()
函數(shù)功能:主函數(shù)
入口參數(shù):無
------------------------------------------------*/
void main()
{
Timer_Init();
while(1)
{
Music_Play(Happy_Birthday);
}
} 如果能將取得的節(jié)拍取做一個(gè)變量,放到while中,再用個(gè)switch語(yǔ)句將節(jié)拍值變量對(duì)應(yīng)你要點(diǎn)亮LED的個(gè)數(shù)。比如一個(gè)節(jié)拍一個(gè)LED亮,兩個(gè)節(jié)拍是兩個(gè)LED燈亮,不要憐惜,單片機(jī)IO端口多的是,多益善!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1