㈠ 用AT89c51單片機如何編出歌
先將每個音調的頻率定下來!然後編寫延時程序實現每個音調!最後需要哪個音調就調用哪個音調,至於間隔,就是所謂的內部延時了!有了這些音調,你可以任意編寫歌曲咯!
可以參考:http://wenku..com/view/43653ed4b14e852458fb57b2.html
㈡ 如何編寫51單片機音樂程序
設計的相關音樂說明
要產生音頻脈沖,只要算出某一音頻的周期(1/頻率),然後將此周期除以2,即為半周期時間。利用半周期時間定時這個半周期時間,每當計時到後就將輸出的I/O反向,然後重復計時此半周期再對I/O反向,就可以在I/O腳上得到此頻率的脈沖。
記數脈沖值與頻率的關系公式如:N=Fi/2/Fr。N:記數值;Fi:內部計時依次為1us,故其頻率為1 MHZ;Fr:要產生的頻率。
其記數值的求法如:T=65536-N=65536-Fi/2/Fr。例:設K=65536,F=1000000=Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的記數值。
每個音符使用1個音節,位元組的高四位代表音符的高低,低四位代表音符的節拍。如果1拍為0.4秒,1/4拍為0.1秒,假設1/4拍為 DELAY,則1拍為4 DELAY。
(2)diy單片機歌曲擴展閱讀:
功能特性
1,可以模擬63K程序空間,接近64K 的16位地址空間;
2,可以模擬64Kxdata 空間,全部64K 的16位地址空間;
3,可以真實模擬全部32 條IO腳;
4,完全兼容keilC51 UV2 調試環境,可以通過UV2 環境進行單步,斷點, 全速等操作;
5,可以使用C51語言或者ASM匯編語言進行調試 ;
6,可以非常方便地進行所有變數觀察,包括滑鼠取值觀察,即滑鼠放在某 變數上就會立即顯示出它此的值;
7,可選 使用用戶晶振,支持0-40MHZ晶振頻率;
8,片上帶有768位元組的xdata,您可以在模擬時選 使用他們,進行xdata 的模擬;
9,可以模擬雙DPTR 指針;
10,可以模擬去除ALE 信號輸出. ;
11,自適應300-38400bps 的所有波特率通訊;
12,體積非常細小,非常方便插入到用戶板中.插入時緊貼用戶板,沒有連接電纜,這樣可以有效地減少運行中的干擾,避免模擬時出現莫名其妙的故障;
13,模擬插針採用優質鍍金插針,可以有效地防止日久生銹,選擇優質園腳IC插座,保護模擬插針,同時不會損壞目標板上的插座. ;
14,模擬時監控和用戶代碼分離,不可能產生不能模擬的軟故障;
15,RS-232介面不計成本採用MAX202集成電路,串列通訊穩定可靠,絕非一般三極體的簡易電路可比。
㈢ 用單片機設計一款可以存儲歌曲,每天定時播放歌曲的裝置,需要學習哪些知識
要定時,最好用一塊專用的時鍾晶元,又節能,又准時。
建議你做個USB介面,方便與計算機通信。
除了要用到存儲器晶元以外,要想USB插入計算機以後,能識別音樂文件,還要建立「文件系統」。做文件系統需要一定的軟體知識,可以讀讀嵌入式系統方面的書籍。
此外,播放音樂肯定要用到音頻晶元和揚聲器,如果你不想用DSP進行音頻解碼處理,最好用專用晶元進行音頻解碼處理,參考參考MP3用的晶元吧。
要做個音樂質量不錯的東東,工作量不小啊。
祝你好運,呵呵。
㈣ 單片機 音樂程序編寫 歌曲《小星星》
只有音樂發聲匯編程序,沒有加入LED燈,供參考。數據代碼已改為小星星發聲
;**********************************************
ORG 0000H
SJMP MAIN
ORG 0BH
AJMP TIME0
;*************主程序************************
MAIN: MOV SP,#60
MOV TMOD,#01H ;T0定時工作方式
MOV IE,#82H ;CPU 中斷允許,T0中斷允許
START0: MOV 30H,#00H ;TABLE 相對地址指針
NEXT: MOV A,30H
MOV DPTR,#TABLE ;到TABLE處取 簡譜碼 節拍 碼
MOVC A,@A+DPTR
MOV R2,A ;取到的簡譜碼 節拍碼 暫存於R2中
JZ ENDF ;取到 00 結束
ANL A,#0FH ;否,取低四位 節拍 碼
MOV R5,A ;將節拍碼存於R5中
MOV A,R2 ;簡譜碼 節拍 碼 給A
SWAP A ;高4位 與 低4位 交換
ANL A,#0FH ;取簡譜 碼
JNZ SING ;取到的簡譜 碼不是0,則去發聲
CLR TR0 ;取到0 則不發聲
SJMP DLY1 ;節拍延時子程序( 隨節拍碼變化,延時時間不同)
;---------------發聲-----------------------
SING: DEC A ;取到的簡譜碼減1
;(簡譜碼計數值16位數據存儲首地址從TABLE1 《相對地址》0處開始放起,所以要減1)
MOV 22H,A ;存入(22H)中
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
MOV DPTR,#TABLE1
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的高位元組計數值
MOV TH0,A ;高位元組計數值存入TH0和(21H)中
MOV 21H,A
MOV A,22H ;減1的簡譜碼給A
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
INC A ;A 增加 取下一個位元組計數值
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的低位元組計數值
MOV TL0,A ;低位元組計數值存入TL0和(20H)中
MOV 20H,A
SETB TR0 ;啟動T0定時器讓喇叭發出不同頻率聲音
;---------------節拍延時-------------------
DLY1: ACALL DELAY ;基本單位時間為1/4拍 187ms
INC 30H ;取下一個簡譜碼 節拍 碼
SJMP NEXT
;---------------歌放完結束---------------
ENDF: CLR TR0 ;關閉T0定時器
AJMP START0 ;反復循環
;****T0中斷子程序(用來驅動喇叭發出不同頻率聲音)**************
TIME0: PUSH ACC
PUSH PSW
MOV TL0,20H ;重裝計數值
MOV TH0,21H
CPL P3.7 ;驅動發聲
POP PSW
POP ACC
RETI
;******************節拍延時187ms****************************
DELAY: MOV R7,#187 ;187ms延時子程序
DLY2: MOV R4,#02
DLY3: MOV R3,#248
DJNZ R3,$
DJNZ R4,DLY3
DJNZ R7,DLY2
DJNZ R5,DELAY
RET
;*******音符T值表(用來讓定時器發出不同的頻率)**DW 表示一個 計數值 占兩個位元組存儲單元***************
TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI /中音DO 中音RE
DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI
DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO
;*********簡譜碼 節拍碼(高4位簡譜碼 ,低4位節拍碼)*************
TABLE: DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h ; 6 6 5 -
DB 74H,74H,63H,63H; 4 4 3 3
DB 52H,52H,48h ; 2 2 1-
DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h; 3 3 2-
DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h ; 3 3 2-
DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h; 6 6 5 -
DB 74H,74H,63H,63H; 4 4 3 3
DB 52H,52H,48h; 2 2 1-
END
㈤ 基於單片機的音樂播放器
播放一段音樂的:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7;
uchar code SONG_TONE[]=
{
212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0
};
uchar code SONG_LONG[]=
{
9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0
};
void DelayMS(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void PlayMusic()
{
uint i =0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP = ~BEEP;
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
while(1)
{
PlayMusic();
DelayMS(500);
}
}
按鍵發音的(可選擇,四個按鍵):
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7;
sbit K1 = P1^4;
sbit K2 = P1^5;
sbit K3 = P1^6;
sbit K4 = P1^7;
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}
void Play(uchar t)
{
uchar i;
for(i=0;i<100;i++)
{
BEEP = ~BEEP;
DelayMS(t);
}
BEEP = 0;
}
void main()
{
P1 = 0xff;
while(1)
{
if(K1==0) Play(1);
if(K2==0) Play(2);
if(K3==0) Play(3);
if(K4==0) Play(4);
}
}
自己綜合一下就好。當然再找幾首音樂。
㈥ 編寫單片機音樂。
就用單片機和蜂鳴器應該就可以。你控制蜂鳴器的頻率改變,這樣蜂鳴器發聲的「音調」就會不一樣,然後再自己慢慢調那些頻率,就可以構成一個單片機控制的音樂了。
至於音樂裡面的12345671怎麼發聲,請參考以下資料(採用51單片機):
為了輸出准確的音階頻率,我們需要用定時器輸出來控制蜂鳴器的驅動,這里用的 T0。
我們再每一次定時器中斷溢出時取反 P17 引腳,以形成頻率驅動蜂鳴器,定時器 0 工
作在 16 位方式,需要在中斷里重新置入初始值。這個值就決定了 P17輸出的頻率。我們在
程序里先做好了一張表,預先寫好了每個音階的頻率需要設置的初始值。到時調入對應的值
進去 T0,不斷溢出時就 P17 可以輸出對應的頻率。
在這個程序里,我們自動地輸出 8 個音符,每個音符保持 1 秒鍾左右。
―――――――――――――――――――――――
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一個 52 標准內核的頭文件
char code dx516[3] _at_ 0x003b;//這是為了模擬設置的
sbit BEEP=P1^7; //喇叭輸出腳
uchar th0_f; //在中斷中裝載的 T0 的值高 8 位
uchar tl0_f; //在中斷中裝載的 T0 的值低 8 位
//T0 的值,及輸出頻率對照表
uchar code freq[36*2]={
0xA9,0xEF,//00220HZ ,1 //0
0x93,0xF0,//00233HZ ,1#
0x73,0xF1,//00247HZ ,2
0x49,0xF2,//00262HZ ,2#
0x07,0xF3,//00277HZ ,3
0xC8,0xF3,//00294HZ ,4
0x73,0xF4,//00311HZ ,4#
0x1E,0xF5,//00330HZ ,5
0xB6,0xF5,//00349HZ ,5#
0x4C,0xF6,//00370HZ ,6
0xD7,0xF6,//00392HZ ,6#
0x5A,0xF7,//00415HZ ,7
0xD8,0xF7,//00440HZ 1 //12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2 //14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3 //16
0xE4,0xF9,//00587HZ 4 //17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5 //19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6 //21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7 //23
0xEF,0xFB,//00880HZ `1
0x2A,0xFC,//00932HZ `1#
0x62,0xFC,//00988HZ `2
0x95,0xFC,//01046HZ `2#
0xC7,0xFC,//01109HZ `3
0xF6,0xFC,//01175HZ `4
0x22,0xFD,//01244HZ `4#
0x4B,0xFD,//01318HZ `5
0x73,0xFD,//01397HZ `5#
0x98,0xFD,//01480HZ `6
0xBB,0xFD,//01568HZ `6#
0xDC,0xFD,//01661HZ `7 //35
};
//定時中斷 0,用於產生唱歌頻率
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //調入預定時值
BEEP=~BEEP; //取反音樂輸出 IO
P2=~P2;
}
//音階聲音自動輸出試驗
void main(void) // 主程序
{
ulong n;
uchar i;
uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567`1 八個音符在頻率表中的位置
TMOD = 0x01; //使用定時器 0 的 16 位工作模式
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
for(i=0;i<8;i++) //循環播放 8 個音符
{
tl0_f=freq[jie8[i]*2]; //置一個音符的值
th0_f=freq[jie8[i]*2+1];
for(n=0;n<50000;n++); //延時 1 秒左右
}
}
}
―――――――――――――――――――――――――――――――
請編譯,運行。可以聽到 8 個音符不斷循環輸出。
㈦ 如何實現單片機蜂鳴器響出一首歌
先將每個音調的頻率定下來!然後編寫延時程序實現每個音調!最後需要哪個音調就調用哪個音調,至於間隔,就是所謂的內部延時了!有了這些音調,你可以任意編寫歌曲咯!
㈧ 讓單片機唱歌的c語言程序是怎麼弄的
其實原理很簡單,就是控制單片機的某個引腳,輸出一定頻率的方波信號,而輸出方波信號的方法,是最基礎的,最簡單的編程了,用定時器定時,根據信號頻率算出信號周期,然後計算出定時的時間。那單片機演奏歌曲的程序,也是同樣的原理,只是事先根據歌曲的簡譜查出每個音階的信號頻率,再根據各音階頻率計算出定時器的初值。演奏時,按簡譜的各音階順序輸出不同的頻率的信號就行了。
下表是音階與頻率對應關系表,給出常用音階對應的定時常數。
㈨ 能提供幾首單片機的歌曲代碼用蜂鳴器唱的
#include <reg52.h>
#include <intrins.h>
//本例採用89C52, 晶振為11.0592MHZ
//關於如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
//頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;
//所以拿出譜子, 試探編吧!
sbit out=P2^3;
unsigned char n=0; //n為節拍常數變數
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
};
void int0() interrupt 1 //採用中斷0 控制節拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制頻率延時
{
unsigned i=3*m;
while(--i);
}
void delayms(unsigned char a) //豪秒延時子程序
{
while(--a); //採用while(--a) 不要採用while(a--); 各位可編譯一下看看匯編結果就知道了!
}
void main()
{ unsigned char p,m; //m為頻率常數變數
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結束符,延時1秒,回到開始再來一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數 和 節拍常數
TR0=1; //開定時器1
while(n!=0) out=~out,delay(m); //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)
TR0=0; //關定時器1
}
}
㈩ 利用單片機實現簡單的兩首歌曲的音樂播放器
void exten0() interrupt 0
{
count++;
if(count==3)
count = 1;
TR0 = 1;
}