導航:首頁 > 操作系統 > 單片機音樂程序

單片機音樂程序

發布時間:2022-05-02 18:46:04

Ⅰ 80c51單片機音樂播放器程序設計


正好做了一個音樂程序,貢獻出來給你吧,希望你能滿意。
電路連接很簡單,在P3.0埠接個蜂鳴器,不過效果一般。如果想效果好點,就加個放大電路,接個小功率喇叭就行。因為這里發電路不方便,所以如果需要放大電路,可加我QQ:7468485。

音樂程序的設計原理和程序如下:
設計原理
⑴ 總體原理:
樂曲中不同的音符,實質就是不同頻率的聲音。通過單片機產生不同的頻率的脈沖信號,經過放大電路,由蜂鳴器放出,就產生了美妙和諧的樂曲。
⑵ 單片機產生不同頻率脈沖信號的原理:
1)要產生音頻脈沖,只要算出某一音頻的脈沖(1/頻率),然後將此周期除以2,即為半周期的時間,利用定時器計時這個半周期的時間,每當計時到後就將輸出脈沖的I/O反相,然後重復計時此半周期的時間再對I/O反相,就可以在I/O腳上得到此頻率的脈沖。
2)利用8051的內部定時器使其工作在計數器模式MODE1下,改變計數值TH0及TL0以產生不同頻率的方法如下:
例如,頻率為523Hz,其周期天/523 S=1912uS,因此只要令計數器計時956uS/1us=956,在每計數956次時就將I/O反接,就可得到中音DO(532Hz)。
計數脈沖值與頻率的關系公式如下:
N=Fi/2/Fr
(N:計數值,Fi:內部計時一次為1uS,故其頻率為1MHz,Fr:要產生的頻率 )
⑶ 其計數值的求法如下:
T=65536-N=65536-Fi/2/Fr
計算舉例:
設K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計數值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
⑷ C調個音符頻率與計數值T的對照表如下表所示:

表9.1 C調各音符頻率與計數值T的對照表
音符 頻率(Hz) 簡譜碼T值 音符 頻率(Hz) 簡譜碼T值
低1DO 262 63628 #4FA# 740 64860
#1DO# 277 63731 中5SO 784 64898
低2RE 294 63835 #5SO# 831 64923
#2RE# 311 63928 中6LA 880 64968
低3M 330 64103 #6 932 64994
低4FA 349 64103 中7SI 988 65030
#4FA# 370 64260 高1DO 1046 65058
低5SO 392 64260 #1DO# 1109 65085
#5SO# 415 64331 高2RE 1175 65110
低6LA 440 64400 #2RE# 1245 65124
#6 466 64463 高3M 1318 65157
低7SI 494 64524 高4FA 1397 65178
中1DO 523 64580 #4FA# 1480 65198

⑸ 每個音符使用1個位元組,位元組的高4位代表音符的高低,低4位代表音符的節拍,下表為節拍碼的對照。但如果1拍為0.4秒,1/4拍是0.1秒,只要設定延遲時間就可求得節拍的時間。假設1/4節拍為1DELAY,則1拍應為4DELAY,以此類推。所以只要求得1/4拍的DELAY時間,其餘的節拍就是它的倍數,如下表為1/4和1/8節拍的時間設定。
表9.2 節拍碼對照表
1/4節拍 1/8節拍
節拍碼 節拍數 節拍碼 節拍數
1 1/4拍 1 1/8拍
2 2/4拍 2 1/4拍
3 3/4拍 3 3/8拍
4 1拍 4 1/2拍
5 1又1/4拍 5 5/8拍
6 1又1/2拍 6 3/4拍
7 1又3/4拍 7 7/8拍
8 2拍 8 1拍
9 2又1/4拍 9 1又1/8拍
A 2又1/2拍 A 1又1/4拍
B 2又3/4拍 B 1又3/8拍
C 3拍 C 1又1/2拍
D 3又1/4拍 D 1又5/8拍
E 3又1/2拍 E 1又3/4拍
F 3又3/4拍 F 1又7/8拍
表9.3 各調節拍的時間設定表
1/4節拍 1/8節拍
曲調值 DELAY 曲調值 DELAY
調4/4 125毫秒 調4/4 62毫秒
調3/4 187毫秒 調3/4 94毫秒
調2/4 250毫秒 調2/4 125毫秒
⑹ 建立音樂的步驟:
1)先把吧樂譜的音符找出,然後由上表建立T值表的順序。
2)把T值表建立在TABLE1,構成發音符的計數值放在「TABLE」。
3)簡譜碼(音符)為高位,節拍為(節拍數)為低4位,音符節拍碼放在程序的「TABLE」處。

表9.4 簡譜對應的簡譜碼、T值、節拍數
簡譜 發音 簡譜碼 T值 節拍碼 節拍數
5 低5SO 1 64260 1 1/4拍
6 低6LA 2 64400 2 2/4拍
7 低7SI 3 64524 3 3/4拍
1 中1DO 4 64580 4 1拍
2 中2RE 5 64684 5 1又1/4拍
3 中3M 6 64777 6 1又2/4拍
4 中4FA 7 64820 7 1又3/4拍
5 中5SO 8 64898 8 2拍
6 中6LA 9 64968 9 2又1/4拍
7 中7SI A 65030 A 2又2/4拍
1 高1DO B 65058 B 2又3/4拍
2 高2RE C 65110 C 3拍
3 高3M D 65157 D 3又1/4拍
4 高4FA E 65178 E 3又2/4拍
5 高5SO F 65217 F 3又3/4拍
不發音 0

1/4拍的延遲時間=187毫秒
DELAY: MOV R7,#2
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
4.程序範例
ORG 0000H ;主程序起始地址
SJMP START ;跳至主程序
ORG 000BH ;TIMER0中斷起 始地址
LJMP TIM0 ;跳至TIMER0中斷子程序
START: MOV TMOD,#01H ;設T0在M1
MOV IE,#82H ;中斷使能
START0:MOV 30H,#00 ;取簡譜碼指針
NEXT: MOV A,30H ;簡譜碼指針載入A
MOV DPTR,#TAB ;至TAB取簡譜碼
MOVC A,@A+DPTR ;
MOV R2,A ;渠道的簡譜碼暫存於R2
JZ END0 ;是否渠道00(結束碼)
ANL A,#0FH ;不是,則取低4位(節拍碼)
MOV R5,A ;將節拍碼存入R5
MOV A,R2 ;將取到的簡譜碼再載入A
SWAP A ;高低4位交換
ANL A,#0FH ;取低4位(音符碼)
JNZ SING ;取到的音符碼是否為0?
CLR TR0 ;開始,則不發音
SJMP D1 ;跳至D1
SING: DEC A ;取到的音符碼減1(不含0)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TAB1 ;至TABLE1取相對的高位位元組計數值
MOVC A,@A+DPTR ;
MOV TH0,A ;取到的高位位元組存入TH0
MOV 21H,A ;取到的高位位元組存入(21H)
MOV A,22H ;在載入取到的音符碼
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相對的低位位元組計數值
MOV TL0,A ;取到的低位位元組存入TL0
MOV 20H,A ;取到的低位位元組存入(20H)
SETB TR0 ;啟動TIMER0
D1: LCALL DELAY ;其本單位時間1/4拍187毫秒
INC 30H ;取簡譜碼指針加1
JMP NEXT ;取下一個簡譜碼
END0: CLR TR0 ;停止TIMER0
JMP START0 ;重復循環
TIM0: PUSH ACC ;將A的值暫存於堆棧
PUSH PSW ;將PSW的值暫存於堆棧
MOV TL0,20H ;重設計數值
MOV TH0,21H ;
CPL P3.0 ;將P3.0位反相,控制蜂鳴器發聲
POP PSW ;至堆棧取回PSW的值
POP ACC ;至堆棧取回A的值
RETI
DELAY:MOV R7,#02
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
TAB1: ;決定節拍
DW 64260,64400,64521,64580
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
TAB: ;樂曲名稱《梁祝》
DB 02H,82H,62H,52H,48H,02H,52H,32H,22H,18H
DB 83H,91H,72H,62H,51H,61H,71H,61H,83H,61H
DB 81H,51H,61H,71H,61H,51H,46H,82H,32H,52H
DB 22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43H
DB 51H,21H,41H,12H,83H,81H,61H,81H,58H,53H
DB 61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H
DB 11H,91H,41H,18H,63H,81H,32H,52H,21H,41H,
DB 16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H
DB 51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H
DB 44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H
DB 61H,81H,51H,61H,51H,41H,32H,21H,41H,18H
DB 08H,0H,04H ;曲子最後靜音5拍長的時間
DB 00H ;樂曲結束
END

Ⅱ 簡單的單片機音樂程序

#include <REG52.H>
#include "SoundPlay.h"

void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0x03, 0x15,0x00, 0x00,0x00 };
//***********************************************************************************
main()
{
InitialSound();
while(1)
{
Play(Music_Girl,0,3,360);
Delay1ms(500);
Play(Music_Same,0,3,360);
Delay1ms(500);
Play(Music_Two,0,3,360);
Delay1ms(500);
}
}

/**************************************************************************

SOUND PLAY FOR 51MCU

COPYRIGHT (c) 2005 BY JJJ.
-- ALL RIGHTS RESERVED --

File Name: SoundPlay.h
Author: Jiang Jian Jun
Created: 2005/5/16
Modified: NO
Revision: 1.0

*******************************************************************************/

/*說明**************************************************************************
曲譜存貯格式 unsigned char code MusicName{音高,音長,音高,音長...., 0,0}; 末尾:0,0 表示結束(Important)

音高由三位數字組成:
個位是表示 1~7 這七個音符
十位是表示音符所在的音區:1-低音,2-中音,3-高音;
百位表示這個音符是否要升半音: 0-不升,1-升半音。

音長最多由三位數字組成:
個位表示音符的時值,其對應關系是:
|數值(n): |0 |1 |2 |3 | 4 | 5 | 6
|幾分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-連音,2-頓音
百位是符點位: 0-無符點,1-有符點

調用演奏子程序的格式
Play(樂曲名,調號,升降八度,演奏速度);
|樂曲名 : 要播放的樂曲指針,結尾以(0,0)結束;
|調號(0-11) : 是指樂曲升多少個半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快;

***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__

//**************************************************************************

#define SYSTEM_OSC 12000000 //定義晶振頻率12000000HZ
#define SOUND_SPACE 4/5 //定義普通音符演奏的長度分率,//每4分音符間隔
sbit BeepIO = P3^7; //定義輸出管腳

unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始頻率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定時器初值暫存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音長定時器初值暫存
//**************************************************************************
void InitialSound(void)
{
BeepIO = 0;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 計算TL1應裝入的初值 (10ms的初裝值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 計算TH1應裝入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}

void BeepTimer0(void) interrupt 1 //音符發生中斷
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
unsigned int NewFreTab[12]; //新的頻率表
unsigned char i,j;
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
for(i=0;i<12;i++) // 根據調號及升降八度來生成新的頻率表
{
j = i + Signature;
if(j > 11)
{
j = j-12;
NewFreTab[i] = FreTab[j]*2;
}
else
NewFreTab[i] = FreTab[j];

if(Octachord == 1)
NewFreTab[i]>>=2;
else if(Octachord == 3)
NewFreTab[i]<<=2;
}

SoundLength = 0;
while(Sound[SoundLength] != 0x00) //計算歌曲長度
{
SoundLength+=2;
}

Point = 0;
Tone = Sound[Point];
Length = Sound[Point+1]; // 讀出第一個音符和它時時值

LDiv0 = 12000/Speed; // 算出1分音符的長度(幾個10ms)
LDiv4 = LDiv0/4; // 算出4分音符的長度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長間隔標准
TR0 = 0;
TR1 = 1;
while(Point < SoundLength)
{
SL=Tone%10; //計算出音符
SM=Tone/10%10; //計算出高低音
SH=Tone/100; //計算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應音符的頻率
if(SL!=0)
{
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計算計數器初值
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償
}
SLen=LengthTab[Length%10]; //算出是幾分音符
XG=Length/10%10; //算出音符類型(0普通1連音2頓音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏長度
if (SLen<=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出頓音的演奏長度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不發音的長度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i>0;i--) //發規定長度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=0;
for(i=LDiv2;i>0;i--) //音符間的間隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 0;
}
//**************************************************************************
#endif

Ⅲ 如何編寫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。

(3)單片機音樂程序擴展閱讀

功能特性

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集成電路,串列通訊穩定可靠,絕非一般三極體的簡易電路可比。

Ⅳ 怎麼用單片機編寫音樂程序

//此程序在硬體上調試通過
//本程序的單片機晶振採用11.0592m
#include
<reg51.h>
sbit
speaker=p1^2;
unsigned
char
timer0h,timer0l,time;
//世上只有媽媽好數據表
code
unsigned
char
sszymmh[]={
6,2,3,
5,2,1,
3,2,2,
5,2,2,
1,3,2,
6,2,1,
5,2,1,
6,2,4,
3,2,2,
5,2,1,
6,2,1,
5,2,2,
3,2,2,
1,2,1,
6,1,1,
5,2,1,
3,2,1,
2,2,4,
2,2,3,
3,2,1,
5,2,2,
5,2,1,
6,2,1,
3,2,2,
2,2,2,
1,2,4,
5,2,3,
3,2,1,
2,2,1,
1,2,1,
6,1,1,
1,2,1,
5,1,6,
0,0,0
};
//
音階頻率表
高八位
code
unsigned
char
freqh[]={
0xf2,0xf3,0xf5,0xf5,0xf6,0xf7,0xf8,
0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0xfc,
//1,2,3,4,5,6,7,8,i
0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,
}
;
//
音階頻率表
低八位
code
unsigned
char
freql[]={
0x42,0xc1,0x17,0xb6,0xd0,0xd1,0xb6,
0x21,0xe1,0x8c,0xd8,0x68,0xe9,0x5b,0x8f,
//1,2,3,4,5,6,7,8,i
0xee,0x44,
0x6b,0xb4,0xf4,0x2d,
0x47,0x77,0xa2,0xb6,0xda,0xfa,0x16,
};
void
delay(unsigned
char
t)
{
unsigned
char
t1;
unsigned
long
t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
tr0=0;
}
void
t0int()
interrupt
1
{
tr0=0;
speaker=!speaker;
th0=timer0h;
tl0=timer0l;
tr0=1;
}
void
song()
{
th0=timer0h;
tl0=timer0l;
tr0=1;
delay(time);
}
void
main(void)
{
unsigned
char
k,i;
tmod=1;
//置ct0定時工作方式1
ea=1;
et0=1;//ie=0x82
//cpu開中斷,ct0開中斷
while(1)
{
i=0;
while(i<100){
//音樂數組長度
,唱完從頭再來
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=freqh[k];
timer0l=freql[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}

Ⅳ 單片機音樂c程序

我這有個用蜂鳴器奏樂的 你可以試試
#include<reg52.h>
unsigned char Count;
sbit buzzer=P1^4 ; //訊響器控制腳
unsigned char code SONG[] ={ //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
//路邊的野華不要采
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 Time0_Init()
{
TMOD=0x01;
IE=0x82;
TH0=0xD8;
TL0=0xEF; //12MZ晶振,10ms
}
void Time0_Int() interrupt 1
{
TH0 = 0xD8;
TL0 = 0xEF;
Count++; //長度加1
}

/*-------------------------------------------------
功能:1MS延時子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for( i =0;i < x;i++ )
{
for( j =0;j<3;j++ );
}
}

/*-------------------------------------------------
功能:歌曲播放子程序i為播放哪一段曲目
-------------------------------------------------*/
void Play_Song(unsigned char i)
{
unsigned char Temp1,Temp2;
unsigned int Addr;
Count = 0; //中斷計數器清0
Addr = i * 217;
while(1)
{
Temp1 = SONG[Addr++];
if ( Temp1 == 0xFF ) //休止符
{
TR0 = 0;
Delay_xMs(100);
}
else if ( Temp1 == 0x00 ) //歌曲結束符
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR0 = 1;
while(1)
{
buzzer = ~buzzer;
Delay_xMs(Temp1);
if(Temp2==Count )
{
Count = 0;
break;
}
}
}
}
}
/*-------------------------------------------------
功能:主程序
-------------------------------------------------*/
void main()
{
Time0_Init(); //定時器0中斷初始化
while(1)
{
Play_Song(0); //播放
}
}

Ⅵ 單片機音樂編程

<單片機音樂程序的設計圖>

硬體連接說明:

隨便找一個模擬機或者什麼單片機實驗板,只要能工作的就行,將程序輸入,運行,然後找個音箱(你計算機旁邊應當就有一對吧)撥出插頭,插頭的前端接在P1.0上,後面部分找根線接單片機的地,就應當有聲了,然後怎麼改進硬體連接就是你的事了....

音樂程序匯編代碼代碼1 -------------Voice.asm--------------------------

ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中斷服務,中斷計數器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
MOV R7,A
SETB TR0 ;啟動計數
MUSIC2:
NOP
CPL P1.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
MOV 20H,#00H ;等於,則取下一代碼
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲結束,延時1秒後繼續
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END

音樂程序匯編代碼代碼2 -------------Voice1.asm--------------------------

;標題 '八月桂花香'發聲程序
;摘要 詳見'無線電'92年3期
;作者 周振安
ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中斷服務,中斷計數器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
MOV R7,A
SETB TR0 ;啟動計數
MUSIC2:
NOP
CPL P1.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
MOV 20H,#00H ;等於,則取下一代碼
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲結束,延時1秒後繼續
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP

Ⅶ 單片機 音樂程序編寫 歌曲《小星星》

只有音樂發聲匯編程序,沒有加入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
加入了LED燈,水平有限,效果有點不太好
;**********************************************
ORG
0000H
SJMP
MAIN
ORG
0BH
AJMP
TIME0
;*************主程序************************
MAIN:
MOV
SP,#60
MOV
TMOD,#01H
;TO定時工作方式
MOV
IE,#82H
;CPU
中斷允許,TO中斷允許
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
;取下一個簡譜碼
節拍

CPL
P1.0
LED燈
閃爍
CPL
P1.1

CPL
P1.2
CPL
P1.3
CPL
P1.4
CPL
P1.5
CPL
P1.6
CPL
P1.7
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
;*********簡譜碼
節拍碼(高位簡譜碼
,低位節拍碼)*************
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

Ⅷ 單片機:如何將音樂程序和流水燈程序合起來,能讓音樂的同時燈閃

我幫你看了下,你的音樂程序和流水燈程序都沒有用到定時器/計數器1,在音樂程序里只用了定時器/計數器0,所以,你可在音樂程序里設一個定時器/計數器1,讓流水燈在定時器/計數器1是產生(有中斷函數里),若你不會,不妨你可先在流水燈程序里不用延時函數,改用定時器來控制,並且,流水燈的發生發生在定時器中斷函數里,不發生在主函數里,
就只能幫你這么多了,若有什麼不懂,可以問問你的朋友

Ⅸ 編寫單片機音樂。

就用單片機和蜂鳴器應該就可以。你控制蜂鳴器的頻率改變,這樣蜂鳴器發聲的「音調」就會不一樣,然後再自己慢慢調那些頻率,就可以構成一個單片機控制的音樂了。
至於音樂裡面的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 個音符不斷循環輸出。

閱讀全文

與單片機音樂程序相關的資料

熱點內容
java仿qq聊天 瀏覽:398
解壓的ipa重新打包 瀏覽:140
程序員那麼可愛vip版 瀏覽:237
程序員怎麼升職 瀏覽:241
圖形化命令按鈕vb 瀏覽:985
vcu盤加密怎麼設置 瀏覽:412
如何加密備份微信聊天記錄 瀏覽:527
安卓手機如何模擬鍵盤 瀏覽:930
查看dns地址命令 瀏覽:767
android錄屏工具 瀏覽:840
成都互動直播系統源碼 瀏覽:955
usb藍牙android 瀏覽:409
伺服器顯示error1什麼意思 瀏覽:710
python代碼精簡 瀏覽:460
文件加密了怎麼找到了 瀏覽:196
jellyfin插件怎麼選擇主伺服器 瀏覽:839
asp用戶注冊源碼 瀏覽:48
什麼是照片壓縮文件 瀏覽:394
java調用js代碼 瀏覽:981
崑山市民app怎麼修改身份信息 瀏覽:779