導航:首頁 > 操作系統 > diy單片機歌曲

diy單片機歌曲

發布時間:2022-05-13 20:58:10

㈠ 用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;
}

閱讀全文

與diy單片機歌曲相關的資料

熱點內容
口才訓練手冊編譯口才精品書系 瀏覽:995
linuxfunc 瀏覽:266
高德地圖解壓後的文件 瀏覽:638
php加水印類 瀏覽:227
編譯原理定義表格和編寫查找函數 瀏覽:349
指數函數和對數函數的高精度快速演算法 瀏覽:208
c預編譯干什麼 瀏覽:24
hp網路共享文件夾 瀏覽:365
程序員如何不被廢 瀏覽:806
二進制流轉pdf 瀏覽:916
php判斷爬蟲 瀏覽:571
960除24除4簡便演算法 瀏覽:786
關於解壓英語翻譯 瀏覽:566
python控制鍵盤右鍵 瀏覽:921
php沒有libmysqldll 瀏覽:829
時政新聞app哪個好 瀏覽:906
手機已加密怎麼辦 瀏覽:201
安卓手機截屏怎麼傳到蘋果 瀏覽:529
京管家app哪裡下載 瀏覽:33
文件夾橫向排列的豎向排列 瀏覽:454