當前位置:首頁 » 編程語言 » 單片機c語言播放器音符計算
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

單片機c語言播放器音符計算

發布時間: 2022-05-11 12:44:15

① 如何確定單片機音樂播放的音律和節拍計算

網上有高人用單一之IO口,實現對蜂鳴器的音樂產生,借用定時器產生不同的輸出頻率,以得到不同的音調效果:
音符頻率對應表
音符 頻率/HZ 半周期/us 音符 頻率/HZ 半周期/us
------------------------------------------
低1DO 262 1908 #4FA# 740 0676
#1DO# 277 1805 中5SO 784 0638
低2RE 294 1700 #5SO# 831 0602
#2RE# 311 1608 中6LA 880 0568
低3M 330 1516 #6LA# 932 0536
低4FA 349 1433 中7SI 988 0506
#4FA# 370 1350 高1DO 1046 0478
低5SO 392 1276 #DO# 1109 0451
#5SO# 415 1205 高2RE 1175 0426
低6LA 440 1136 #2RE# 1245 0402
#6LA# 466 1072 高3M 1318 0372
低7SI 494 1012 高4FA 1397 0358
中1DO 523 0956 #4FA# 1480 0338
#1DO# 554 0903 高5SO 1568 0319
中2RE 578 0842 #5S0# 1661 0292
#2RE# 622 0804 高6LA 1760 0284
中3M 659 0759 #6LA# 1865 0268
中4FA 698 0716 高7SI 1976 0253
------------------------------------------
("#"表示半音,用於上升或下降半個音)
不知是本人的實現方法不對,還是蜂鳴器本身的結構原因,我按照上列方法來控制產生的音樂效果總不如人意,感覺不夠悅耳;
後我又按高人指點,改動電路如附圖所示

用兩個IO配合起來使用,PORTA為電源控制端,用於產生餘音;PORTB為音調控制端,產生某一頻率的信號。工作的頻率(共8度音)如下:

1 2 3 4 5 6 7 i
1300Hz 1462.5Hz 1625Hz 1733Hz 1950Hz 2166.7Hz 2437.5Hz 2600Hz

採用附圖所示的處理方法,得到了較動聽的音調,感覺和普通的手機產生的合弦音不相上下,由於本人不通音脈,故而只做了少數的短音發音,如有高人可發揚光大,不過這些簡單的合弦音用在普通的家用電器,消費性電子產品上已綽綽有餘了,自我陶醉中。。。。。。

② 用c語言編寫音樂播放器的代碼

vc6.0下編譯可以的

#include <windows.h>
#include <mmsystem.h>

#pragma comment (lib, "winmm.lib")

#define ID_PLAY 1000
#define ID_STOP 1001
#define ID_EXIT 1002

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
TCHAR clsName[] = TEXT ("clsMusicPlayer");
TCHAR title[] = TEXT ("Music Player");
WNDCLASS wc;
HWND hWnd;
MSG msg;
int cxScreen;
int cyScreen;
int winX;
int winY;
int winWidth;
int winHeight;

wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
wc.hCursor = LoadCursor (hInstance, IDC_ARROW);
wc.hIcon = LoadIcon (hInstance, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = clsName;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;

if ( !RegisterClass (&wc) )
{
MessageBox (NULL, TEXT ("RegisterClass Error"), TEXT ("ERROR"), MB_OK | MB_ICONINFORMATION);
return -1;
}

cxScreen = GetSystemMetrics (SM_CXSCREEN);
cyScreen = GetSystemMetrics (SM_CYSCREEN);

winWidth = cxScreen / 4;
winHeight = cyScreen / 3;
winX = (cxScreen - winWidth) / 2;
winY = (cyScreen - winHeight) / 2;

hWnd = CreateWindow (
clsName, title,
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
winX, winY, winWidth, 100,
NULL, NULL, hInstance, NULL);

if ( !hWnd )
{
MessageBox (NULL, TEXT ("CreateWindow Error"), TEXT ("ERROR"), MB_OK | MB_ICONINFORMATION);
return -2;
}

ShowWindow (hWnd, SW_SHOW);
UpdateWindow (hWnd);

while ( GetMessage (&msg, NULL, 0, 0) > 0 )
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

return msg.wParam;
}

int PlayMusic ()
{
HANDLE hFind;
WIN32_FIND_DATA findFileData;

static TCHAR szPath[1024] = TEXT (".\\*.wav");

hFind = FindFirstFile (szPath, &findFileData);
if ( hFind != INVALID_HANDLE_VALUE )
{
//MessageBox (NULL, findFileData.cFileName, "", 0);
PlaySound (findFileData.cFileName, NULL, SND_FILENAME | SND_ASYNC);
while ( FindNextFile (hFind, &findFileData) )
{
//MessageBox (NULL, findFileData.cFileName, "", 0);
PlaySound (findFileData.cFileName, NULL, SND_FILENAME | SND_ASYNC);
}
}
else
{
MessageBox (NULL, "沒找到文件", "", 0);
}
return 1;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDc;
PAINTSTRUCT ps;
HINSTANCE hInst;
RECT rect;

switch ( message )
{
case WM_CREATE:
{
GetClientRect (hWnd, &rect);
hInst = ((LPCREATESTRUCT)lParam)->hInstance;
CreateWindow (
"button",
TEXT ("播放"),
BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
rect.right / 10, rect.bottom / 10, 40, 25, hWnd, (HMENU)ID_PLAY, hInst, NULL);
CreateWindow (
"button",
TEXT ("停止"),
BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
rect.right / 10 + 50, rect.bottom / 10, 40, 25, hWnd, (HMENU)ID_STOP, hInst, NULL);
CreateWindow (
"button",
TEXT ("退出"),
BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
rect.right / 10 + 100, rect.bottom / 10, 40, 25, hWnd, (HMENU)ID_EXIT, hInst, NULL);
}
break;
case WM_COMMAND:
{
switch ( HIWORD (wParam) )
{
case BN_CLICKED:
{
switch ( LOWORD (wParam) )
{
case ID_PLAY:
{
PlayMusic ();
//PlaySound (TEXT ("D:\\音頻文件\\1.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
break;
case ID_STOP:
{
PlaySound (NULL, NULL, SND_FILENAME);
}
break;
case ID_EXIT:
{
SendMessage (hWnd, WM_CLOSE, 0, 0);
}
break;
}
}
break;
}
}
break;
case WM_PAINT:
{
hDc = BeginPaint (hWnd, &ps);

EndPaint (hWnd, &ps);
}
break;
case WM_CLOSE:
{
PostQuitMessage (0);
}
break;
case WM_DESTROY:
{
DestroyWindow (hWnd);
}
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}

return 0;
}

③ 想用單片機控制蜂鳴器唱歌,但不知道音符對應的C語言,大家可以告訴我嗎謝謝!

給你張音符頻率表,有了這個,你就可以產生相對應頻率的方波,聲音就有了啊.

④ 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

⑤ 用單片機C語言實現音樂播放器功能

先鍵盤掃描,找到鍵
然後根據按鍵在代碼里找到對應的頻率
然後把頻率輸出,就可以發聲了。

⑥ 求51單片機蜂鳴器播放音樂的教程 C語言

這是我學校電子設計時做的,可以彈琴,也有幾首歌在裡面。。你應該看得懂#include <reg52.h> #define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit BEEP=P2^0; //喇叭輸出腳uchar th0_f; //在中斷中裝載的T0的值高8位
uchar tl0_f; //在中斷中裝載的T0的值低8位
uchar key;/*------------------------------------------------
函數聲明
------------------------------------------------*/
uchar keyscan(void);//鍵盤掃描程序
void delay(uint i); //延時子程序/*-------- T0的值,及輸出頻率對照表 --------------*/
uchar code freq[36*2]={
0xA9,0xEF, //0x3F,0XEE,//00220HZ ,1 //0
0x93,0xF0, //0X3D,0XEF,//00233HZ ,1#
0x73,0xF1, //0X30,0XF0,//00247HZ ,2
0x49,0xF2, //0X18,0XF1,//00262HZ ,2#
0x07,0xF3, //0XE6,0XF1,//00277HZ ,3
0xC8,0xF3, //0XB7,0XF2,//00294HZ ,4
0x73,0xF4, //0X71,0XF3,//00311HZ ,4#
0x1E,0xF5, //0X2A,0XF4,//00330HZ ,5
0xB6,0xF5, //0XCF,0XF4,//00349HZ ,5#
0x4C,0xF6, //0X72,0XF5,//00370HZ ,6
0xD7,0xF6, //0X09,0XF6,//00392HZ ,6#
0x5A,0xF7, //0X97,0XF6,//00415HZ ,7
0xD8,0xF7, //0X20,0XF7,//00440HZ 1 //12
0x4D,0xF8, //0X9F,0XF7,//00466HZ 1# //13
0xBD,0xF8, //0X18,0XF8,//00494HZ 2 //14
0x24,0xF9, //0X88,0XF8,//00523HZ 2# //15
0x87,0xF9, //0XF3,0XF8,//00554HZ 3 //16
0xE4,0xF9, //0X59,0XF9,//00587HZ 4 //17
0x3D,0xFA, //0X05,0XFA,//00622HZ 4# //18
0x90,0xFA, //0X13,0XFA,//00659HZ 5 //19
0xDE,0xFA, //0X66,0XFA,//00698HZ 5# //20
0x29,0xFB, //0XB9,0XFA,//00740HZ 6 //21
0x6F,0xFB, //0X05,0XFB,//00784HZ 6# //22
0xB1,0xFB, //0X4D,0XFB,//00831HZ 7 //23
0xEF,0xFB, //0X90,0XFB,//00880HZ `1
0x2A,0xFC, //0XD0,0XFB,//00932HZ `1#
0x62,0xFC, //0X0C,0XFC,//00988HZ `2
0x95,0xFC, //0X44,0XFC,//01046HZ `2#
0xC7,0xFC, //0X7B,0XFC,//01109HZ `3
0xF6,0xFC, //0XAD,0XFC,//01175HZ `4
0x22,0xFD, //0XDD,0XFC,//01244HZ `4#
0x4B,0xFD, //0X0A,0XFD,//01318HZ `5
0x73,0xFD, //0X35,0XFD,//01397HZ `5#
0x98,0xFD, //0X5D,0XFD,//01480HZ `6
0xBB,0xFD, //0X83,0XFD,//01568HZ `6#
0xDC,0xFD, //0XA6,0XFD,//01661HZ `7 //35
};//定時中斷0,用於產生唱歌頻率
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //調入預定時值
BEEP=~BEEP; //取反音樂輸出IO
}//音樂符號串解釋函數
//入口:要解釋的音樂符號串,輸出的音調串,輸出的時長串
changedata(uchar *song,uchar *diao,uchar *jie)
{
uchar i,i1,j;
char gaodi; //高低+/-12音階
uchar banyin;//有沒有半個升音階
uchar yinchang;//音長
uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C調的7個值
*diao=*song;
for(i=0,i1=0;;)
{
gaodi=0; //高低=0
banyin=0;//半音=0
yinchang=4;//音長1拍
if((*(song+i)=='|') || (*(song+i)==' ')) i++;
//拍子間隔和一個空格過濾
switch(*(song+i))
{
case ',': gaodi=-12;i++;//低音
break;
case '`': gaodi=12;i++; //高音
break;
}
if(*(song+i)==0) //遇到0結束
{
*(diao+i1)=0; //加入結束標志0
*(jie+i1)=0;
return;
}
j=*(song+i)-0x30; i++; //取出基準音
j=jie7[j]+gaodi; //加上高低音
yinc: switch(*(song+i))
{
case '#': //有半音j加一個音階
i++;j++;
goto yinc;
case '-': //有一個音節加長
yinchang+=4;
i++;
goto yinc;
case '_': //有一個音節縮短
yinchang/=2;
i++;
goto yinc;
case '.': //有一個加半拍
yinchang=yinchang+yinchang/2;
i++;
goto yinc;
}
*(diao+i1)=j; //記錄音符
*(jie+i1)=yinchang; //記錄音長
i1++;
}
}//奏樂函數
//入口:要演奏的音樂符號串
void play(uchar *songdata)
{
uchar i,c,j=0;
uint n;
uchar diaodata[48]; //音調緩沖
uchar jiedata[48]; //音長緩沖
changedata(songdata,diaodata,jiedata); //解釋音樂符號串
TR0=1;
for(i=0;diaodata[i]!=0;i++) //逐個符號演奏
{
tl0_f=freq[diaodata[i]*2]; //取出對應的定時值送給T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c<jiedata[i];c++) //按照音長延時
{ key = keyscan();
for(n=0;n<29500;n++); // 29500
if(key != 0xff)//((!K1)||(!K2)||(!K3)||(!K4))//發現按鍵,立即退出播放
{
TR0=0;
return;
}
}
TR0=0;
for(n=0;n<460;n++); //460音符間延時
TR0=1;
}
TR0=0;
}//一分錢
uchar code yifenqian[]={
"5`1|6_`1_5|3_5_2_3_|5-|"
"3_5_6_`1_|5_6_5_3_|1.3__|2-|"
"3_2_1_2_|3-|6_5_3_5_|6-|"
"5_`1_6_5_|3_5_2|5_2_3_2_|1-|"
}; //世上只有媽媽好
uchar code mamahao[]={
"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
"2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"
};
//找朋友
uchar code zhaopengyou[]={ "5_6_5_6_|5_6_5|5_`1_7_6_|5 3|"
"5_5_3_4_|5_5_3|1_4_3_2_|1_2_1|"
};
//茉莉花
uchar code molihua[]={"33_5_6_`1_`1_6_|55_6_5-|33_5_6_`1_`1_6_|55_6_5-|"
"5553_5_|665-|32_3_53_2_|11_2_1|"
//"3_2_1_3_2.3_|56_`1_5-|23_5_2_3_1_,6_|,5-,61|"
//"2.3_1_2-1_,6_|,5--"
};
//新年好
uchar code xinnianhao[]={
"1_1_1 ,5|3_3_3 1|1_3_5 5|4_3_2-|"
"2_3_4-|3_2_3 1|1_3_2 ,5|,7_2_1-|"
};
//小星星
uchar code xingxing[]={
"1155|665-|4433|221-|"
"5544|332-|5544|332-|"
"1155|665-|4433|221-|"
};
//外婆的澎湖灣
uchar code waipodephw[]={
"3_5_5_5_6_`1_6_5_|`1_`1_`1_6_5-|"
"`3_`3_`3_`3_`4_`3_`2_`1_|`2_`2_`2_`3_`2-|"
"`3_`3_`3_`3_`4_`3_`2_`1_|6_`1_`1_6_5-|"
};
}

⑦ 急急急 , 我有個單片機c語言的放音 代碼, 誰來給我解釋

P04腳控制蜂鳴器 即可 //生日快樂
void delay50us(uchar time)
{
uchar a,b;
for(a=0;a<time;a++)
for(b=0;b<6;b++);}
uchar code SOUNDLONG[]= //控制音調
{
18,6,24,24,24,48,
18,6,24,24,24,48,
18,6,24,24,24,24,24,
18,6,24,24,24,48,0
};
uchar code SOUNDTONE[]= //控制音色
{
212,212,190,212,159,169,
212,212,190,212,142,159,
212,212,106,126,159,169,190,
119,119,126,159,142,159,0 //生日快樂end
};
void Play_Music()
{
uint k,n;
uint SoundLong,SoundTone;
uint i,j,m;
do
{
if(i>=25) i=0;
SoundLong=SOUNDLONG[i];
SoundTone=SOUNDTONE[i];
i++;
for(n=0;n<SoundLong;n++)
{
for(k=0;k<12;k++)
{
p04=0;
for(m=0;m<SoundTone;m++);
p04=1;
for(m=0;m<SoundTone;m++);

}
}
delay50us(6);

}while((SOUNDLONG[i]!=0)||(SOUNDTONE[j]!=0));
}

⑧ 51單片機C語言

  1. 這兩組數據不是算的,而是根據音符實際頻率實驗得到的。

  2. 硬要說算的也要根據你定時器的頻率具體得到。

  3. 如果想要自己利用蜂鳴器編歌,可用下面程序(極樂凈土蜂鳴器版)

    貼上極樂凈土的簡譜,對照下就能自己用蜂鳴器編歌了

  4. #include<reg52.h>
    #defineucharunsignedchar
    #defineuintunsignedint
    sbitbeep=P1^5;//蜂鳴器埠定義
    uinti,j;
    unsignedintC;
    #definel1262
    #definel2284
    #definel3311
    #definel4349
    #definel5392
    #definel6440
    #definel7494
    #definez1523
    #definez2587
    #definez3659
    #definez4698
    #definez5784
    #definez6880
    #definez7987
    #defineh11046
    #defineh21174
    #defineh31318
    #defineh41396
    #defineh51567
    #defineh61760
    #defineh71975
    #definezi0
    voiddelay();

    unsignedcodeGP[]={zi,zi,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h3,h1,h2,z6,zi,z3,z5,/**/
    z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,z5,z1,z2,/**/z3,h1,z6,h3,/**/h2,h3,h2,h1,h2,z6,zi,/**/z6,z6,z6,z6,h1,h2,h3,/**/
    z6,z6,z6,z5,z5,z6,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,h4,h4,h3,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,z5,z5,z6,/**/
    z6,z6,z6,z6,h1,h2,h3,/**/h6,z5,z5,z6,z6,/**/0xff};
    //該數組保存樂譜
    //高7音h開頭中7音z開頭低7音l開頭休止符zi


    unsignedcodeJP[]={8,8,8,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/
    8,8,8,8,/**/4,2,2,4,4,8,8,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/
    8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/12,4,4,4,8,/**/
    };
    //該數組保存相對應的延長,至於延長時長可參照樂譜

    voidmain()
    {uchari,j;
    TMOD=0x00;
    EA=1;//開總中斷
    ET0=1;//開t0中斷
    while(1)
    {i=0;
    while(GP[i]!=0xff)
    {if(GP[i]!=0)
    {C=460830/GP[i];
    TH0=(8192-C)/32;
    TL0=(8192-C)%32;
    TR0=1;}//開定時器0
    for(j=0;j<JP[i];j++)
    {delay();}
    TR0=0;
    i++;

    }
    beep=0;
    }

    }
    voiddelay()
    {

    for(i=70;i>0;i--)
    {for(j=85;j>0;j--);}
    }
    voidT0_time()interrupt1
    {TR0=0;
    beep=!beep;
    TH0=(8192-C)/32;
    TL0=(8192-C)%32;
    TR0=1;
    }

    ⑨ 求: 用51單片機c語言操作使蜂鳴器奏出「祝你生日快樂」音樂的全部程序!

    #include <reg51.h>
    sbit speaker=P1^2;
    unsigned char timer0h,timer0l,time;
    //生日歌
    code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
    5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
    5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
    4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
    // 音階頻率表 高八位
    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<75){ //音樂數組長度 ,唱完從頭再來
    k=sszymmh[i]+7*sszymmh[i+1]-1;
    timer0h=FREQH[k];
    timer0l=FREQL[k];
    time=sszymmh[i+2];
    i=i+3;
    song();
    }
    }
    }