⑴ 單片機播放音樂里的音樂代碼是怎麼得到的有什麼軟體能將歌曲直接轉換成16進制代碼
把簡譜中每個唱名對應的頻率找出來,比如C調的1對應264Hz左右。
然後把這些頻率通過公式轉換成初值再換算成十六進制。
比如你用的是定時的工作方式1,則可以這位算:(假設晶振是12MHz)
X=2^16-10^6/(264*2)=63642因為要計算的是半周期對應的初值,所以頻率就是2倍。
十六進制就是:F89A
好像沒有什麼軟體吧,有的話告訴我一聲哦。
⑵ 51music 單片機音樂代碼生成器 1.0綠色版怎麼用
根據簡譜點擊音符和時長,也就是點一個間符,再點這個音符的時長,完成一個音符的輸入,輸完全部音符後點生成代碼,把代碼復制到程序中編譯就行
⑶ 單片機c語言音樂簡譜代碼
代碼的格式,是由編程者設計的,並沒有統一的規范。
下面的鏈接可供參考。
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/88bfff323ec42ef21b4cff09.html
⑷ 51單片機簡譜編碼
// 8鍵電子琴C程序 自己根據音節做個與簡譜對應的表就可以了。
#include <AT89X51.H>
sbit SPEAKER = P3^7;
#define KEY P1
unsigned char MUSIC;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={
64021,64103,64260,64400,//低音3開始
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178
};
void main(void){
TMOD=0x01;
ET0=1;
EA=1;
KEY = 0xff;
while(1){
if(KEY != 0xff){
switch (~KEY){//顯示的列位置
case 0x01://
MUSIC = 7;
break;//
case 0x02://
MUSIC = 6;
break;//
case 0x04://
MUSIC = 5;
break;//
case 0x08://
MUSIC = 4;
break;//
case 0x10://
MUSIC = 3;
break;//
case 0x20://
MUSIC = 2;
break;//
case 0x40://
MUSIC = 1;
break;//
case 0x80://
MUSIC = 0;
break;//
}
STH0=tab[MUSIC]/256;
STL0=tab[MUSIC]%256;
TR0=1;
}else{
SPEAKER = 1;
TR0=0;
}
}
}
void t0(void) interrupt 1 using 0{
TH0=STH0;
TL0=STL0;
SPEAKER=~SPEAKER;
}
⑸ 在51單片機上用C語言實現電子琴功能,但同時數碼管可以顯示簡譜,怎麼編程序
1,數據管顯示就沒什麼了,找幾個簡單的數碼管驅動程序改改就可以了,一般都是先選中數碼管,然後設置值,就可以顯示了,不過需要注意刷新,10ms刷新一個應該就可以了,刷新頻率比較低的話會閃閃的,這個你應該明白。
2,蜂鳴器發do音,這個硬體實現我就不知道了,也許有硬體可以 編碼控制自動生成對應頻率的值。我想如果通過軟體實現的話,不妨考慮一下定時器。假設do音是1000Hz的頻率(沒有查,不清楚,假設的),那麼你可以控制定時器的觸發頻率為1000hz,觸發一次,對應的輸出到蜂鳴器的口的電平跳變一下,如果定時器的頻率為1000hz的話,那麼應該有500hz的頻率,一個周期需要一高一低嘛!中斷讀取按鍵信號,分析按鍵,然後設定定時器的頻率,啟動定時器,設置一個響的時間,然後到時間關閉定時器,這樣你按下k1就會發出一聲do的聲音,然後停了。
3,按鍵讀取程序,中斷或者查詢方式,自己選擇吧,別忘了延遲5ms左右再次讀取按鍵,這個是消抖的。
4,建議模塊化編程,先搞定按鍵的,然後搞定數碼管的,然後搞定定時器的,然後再考慮如何把它們組合起來。好了不說了,說得有點多了,再說會我都回到大學時代了,哈哈。總之自己一點一點的做,應該不難,51熟練,c語言熟練,板子焊接的結構比較清晰的話,很快就可以搞定的。
5,還是建議你自己寫一份各個模塊的驅動的代碼,例如按鍵的,數碼管的,led的,溫度感測器的,光敏的,蜂鳴器的,遙控器的,定時器的,中斷的,等等等等模塊(可以借鑒別人寫的,自己一定要會),然後需要的時候,過來,改改就行,快而且bug少。建議keil c語言編程,用匯編編碼太耗時了。
⑹ 單片機音樂的簡譜怎麼寫的代碼數據
首先你要知道你定時器的工作方式,單片機的晶振,這樣你才能計算出具體的需要頻率,因為音樂代碼的話主要還是通過定時器改變蜂鳴器的頻率,使得發出音樂。
你這個18H,30H應該是通過那個定時器頻率計算方法計算出來的。
⑺ 怎樣把歌譜翻譯成51單片機C程序代碼
用定時器T0的中斷實現"渴望"主題曲的播放
```c
#include // 包含51單片機寄存器定義的頭文件
sbit sound = P3^7; // 將sound位定義為P3.7
unsigned int C; // 儲存定時器的定時常數
// 以下是C調低音的音頻宏定義
#define l_ 262 // 低音「1」的頻率262Hz
#define l_re 286 // 低音「2」的頻率286Hz
#define l_mi 311 // 低音「3」的頻率311Hz
#define l_fa 349 // 低音「4」的頻率349Hz
#define l_sao 392 // 低音「5」的頻率392Hz
#define l_la 440 // 低音「6」的頻率440Hz
#define l_xi 494 // 低音「7」的頻率494Hz
// 以下是C調中音的音頻宏定義
#define 523 // 中音「1」的頻率523Hz
#define re 587 // 中音「2」的頻率587Hz
#define mi 659 // 中音「3」的頻率659Hz
#define fa 698 // 中音「4」的頻率698Hz
#define sao 784 // 中音「5」的頻率784Hz
#define la 880 // 中音「6」的頻率880Hz
#define xi 987 // 中音「7」的頻率523Hz
// 以下是C調高音的音頻宏定義
#define h_ 1046 // 高音「1」的頻率1046Hz
#define h_re 1174 // 高音「2」的頻率1174Hz
#define h_mi 1318 // 高音「3」的頻率1318Hz
#define h_fa 1396 // 高音「4」的頻率1396Hz
#define h_sao 1567 // 高音「5」的頻率1567Hz
#define h_la 1760 // 高音「6」的頻率1760Hz
#define h_xi 1975 // 高音「7」的頻率1975Hz
/*******************************************
函數功能:1個延時單位,延時200ms
******************************************/
void delay() {
unsigned char i, j;
for (i = 0; i < 250; i++)
for (j = 0; j < 250; j++)
;
}
/*******************************************
函數功能:主函數敗散啟
******************************************/
void main(void) {
unsigned char i, j;
// 以下是《渴望》片頭曲的一段簡譜
unsigned int code f[] = {
re, mi, re, , l_la, , l_la,
l_sao, l_mi, l_sao, l_la, ,
l_la, , sao, la, mi, sao,
re,
mi, re, mi, sao, mi,
l_sao, l_mi, l_sao, l_la, ,
l_la, l_la, , l_la, l_sao, l_re, l_mi,
l_sao,
re, re, sao, la, sao,
fa, mi, sao, mi,
la, sao, mi, re, mi, l_la, ,
re,
mi, re, mi, sao, mi,
l_sao, l_mi, l_sao, l_la, ,
l_la, , re, l_la, , re, mi,
re,
l_la, , re, l_la, , re, mi,
re,
0xff}; // 以0xff作為音符的結束標志
// 以下是簡譜中每個音符的節拍
// "4"對應4個延時單位,"2"對應2個延時單位,"1"對應1個延時單位
unsigned char code JP[] = {
4, 1, 1, 4, 1, 1, 2,
2, 2, 2, 2, 8,
4, 2, 3, 1, 2, 2,
10,
4, 2, 2, 4, 4,
2, 2, 2, 2, 4,
2, 2, 2, 2, 2, 2, 2,
10,
4, 4, 4, 2, 2,
4, 2, 4, 4,
4, 2, 2, 2, 2, 2, 2,
10,
4, 2, 2, 4, 4,
2, 2, 2, 2, 6,
4, 2, 2, 4, 1, 1, 4,
10,
4, 2, 2, 4, 1, 1, 4,
10};
EA = 1; // 開總中斷
ET0 = 1; // 定時器T0中斷允許
TMOD = 0x00; // 使用定時器T0的模式1(13位計數器)
while (1) { // 無限循環
i = 0; // 從第1個音符f[0]開始播放
while (f[i] != 0xff) { // 只要沒有讀到結束標志就繼續播放
C = 460830 / f[i];
TH0 = (8192 - C) / 32; // 可證明這是13位計數器TH0高8位的賦初值方法
TL0 = (8192 - C) % 32; // 可證明這是13位計數器TL0低5位的賦初值方法
TR0 = 1; // 啟動定時器T0
for (j = 0; j < JP[i]; j++) { // 控制節拍數
delay(); // 延時1個節拍單位
}
TR0 = 0; // 關閉定時器T0
i++; // 播放下一個音符
}
}
}
/***********************************************************
函數功能:定時器T0的中斷服務子程序,使P3.7引腳輸出音頻的方波
************************************************************/
void Time0(void) interrupt 1 using 1 {
sound = !sound; // 將P3.7引腳輸出電平取反,形成方波
TH0 = (8192 - C) / 32; // 可證明這是13位計數器TH0高8位的賦初值方法
TL0 = (8192 - C) % 32; // 可證明這是13位計數器TL0低5位的賦初值方法
}
```
⑻ 簡譜的數據怎麼轉化為單片機代碼(節拍和頻率)最主要是節拍,頻率已明白
其實就是時間,也就是定時器定時的時間,需要根據節拍計算定時器定時的時間常數。
你需要知道節拍的時間長短,然後轉換為定時常數,然後做成一個表格就可以了。