⑴ 求單片機程序代碼(匯編語言編寫)
你剛開始先讓P1口輸出高電平,然後調用延時子程序(也就是1s)延時,如果就只有這個功能的話建議才用delay延時,然後對P1口取反後再延時這樣一直循環就行了
⑵ 單片機歌曲代碼
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
uchar * TABLE ;
code uint TABLE1 [15]={64260,64400,64524,64580,
64684,64777,64820,64898,
64968,65030,65058,65110,
65157,65178,65217};
code uchar SONG [ ]={
//1. 遲來的愛
};
code uchar SONG1 [ ]={
//2.兩只蝴蝶
};
code uchar SONG3 [ ]={
//4.一個師傅三個徒弟
};
uchar hjsz;
uchar ljsz;
uchar jpm;
uchar yfm;
uchar t0 =0;
uint i=0;
sbit Speaker =P1^0;
uint k;
void Delay1()
{
for ( k=0;k<20000;k++);
}
void Lignt( )
{ uchar t;
for(t=0;t<10;t++)
{
P2=0xff;
Delay1();
P2=0x00;
Delay1();
}
}
void Lignt1( )
{
P2=0xaa;
Delay1();
P2=0x55;
Delay1();
}
void Delay(uchar t0)//延時
{
while(t0--) //決定節拍
Lignt1();
}
void Delay2(uchar w0)//延時
{
while(w0--) //決定節拍
Lignt();
}
void T0Int() interrupt 1//TIMER0
{
TL0 = ljsz;
TH0 = hjsz;
Speaker=!Speaker;
}
void ExtInt0() interrupt 0//INT0
{
if(t0>10)
t0=0;
i=0; // 全局變數,指向歌譜的第1個
switch(t0++)
{
case 0 : TABLE=SONG;break; //選擇第1首
case 1 : TABLE=SONG1;break;//選擇第2首
case 2 : TABLE=SONG2;break;//選擇第3首
case 3 : TABLE=SONG3;break;//選擇第4首
case 4 : TABLE=SONG4;break;//選擇第5首
case 5 : TABLE=SONG5;break;//選擇第6首
case 6 : TABLE=SONG6;break;//選擇第7首
case 7 : TABLE=SONG7;break;//選擇第8首
case 8 : TABLE=SONG8;break;//選擇第9首
case 9 : TABLE=SONG9;break;//選擇第10首
}
}
void songsing()//發音程序
{
i=0;
while(TABLE[i])
{
jpm=TABLE[i]&0x0f; //節拍值
yfm=(TABLE[i]>>0x04)&0x0f;//簡譜值
if(yfm) //簡譜為1,取計數值
{
yfm=yfm-1;
hjsz=(uchar)(TABLE1[yfm]>>0x08);//取計數值高位元組
TH0 = hjsz;
ljsz=(uchar)(TABLE1[yfm]); //取計數值低位元組
TL0 = ljsz;
TR0 = 1; //啟動TIMER0
}
else TR0 = 0; //簡譜為0,不發音
Delay(jpm); //節拍延時
i++;
}
}
void main(void)
{
TMOD =0X01;//設TIMER0在MODE1
TCON =0X01;//外部中斷INT0,下降沿觸發
IE =0x83;//開中斷(INT0,TIMER0)
IP =0x00;//設置中斷優先順序
TABLE=SONG0;
while(1)
{
Lignt( );
songsing();//調用發音程序
TR0 = 0;//停止TIMER0
Delay2(1);
TABLE=SONG0;// 更改歌曲0
songsing();
}
}
⑶ 能提供幾首單片機的歌曲代碼用蜂鳴器唱的
#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
}
}
⑷ 單片機代碼
char i,j 這句中的char和變數 i 之間要有空格。主程序中變數 j 的兩個for循環的前後的一對圓括弧( ) 去掉,要加必須用一對大括弧 { } ,其實是不需要的,雙層循環可以直接寫兩行,而第二個for 循環結尾帶分號 ; 就可以。如下圖所示
⑸ 怎麼用32單片機接蜂鳴器後播放歌曲
能提供幾首單片機的歌曲代碼?用蜂鳴器唱的
星月神話》
TABLE:
DB 34H,22H,12H,24H,12H,0A2H,14H,0A2H,92H,88H,94H,12H,0A2H,0A4H,82H,0D2H,0DCH
DB 12H,22H,34H,22H,12H,24H,12H,0A2H,14H,0A2H,92H,88H
DB 94H,32H,0A2H,0A4H,12H,22H,1DH,96H,12H,0A4H,12H,22H,36H,52H,38H
DB 96H,12H,0A4H,12H,22H,1AH,12H,22H,34H,22H,12H,24H,12H,0A2H,14H,0A2H,92H,86H
DB 94H,12H,0A2H,0A4H,12H,22H,36H,22H,24H,12H,22H,34H,22H,12H,24H,12H,0A2H,14H,0A2H,92H,86H
DB 12H,82H,94H,32H,12H,0A4H,12H,22H,1CH,32H,52H,66H,62H,54H,22H,52H,34H,14H,94H
DB 92H,0A2H,14H,32H,22H,24H,52H,32H,3CH,32H,52H,66H,62H,52H,22H,22H,25H,32H,12H,12H,92H,94H
DB 32H,22H,14H,32H,22H,24H,32H,0A2H,9CH
DB 00
廢湃暥攄泑梀愢濓匯凍溈旈椯庪抹
⑹ 單片機代碼
void delay(unsigned int x) //延時 x ms
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
延時1ms 即為使x=1;
這程序延時約1ms(x=1時用keil測出來約 0.96831272ms,近似1ms),用C語言很難做到准確的1ms。注意晶振為11.0592MHZ的時候用~
滿意請採納,不懂繼續問
⑺ 單片機音樂代碼
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
uchar * TABLE ;
code uint TABLE1 [15]={64260,64400,64524,64580,
64684,64777,64820,64898,
64968,65030,65058,65110,
65157,65178,65217};
code uchar SONG [ ]={
//1. 遲來的愛
};
code uchar SONG1 [ ]={
//2.兩只蝴蝶
};
code uchar SONG3 [ ]={
//4.一個師傅三個徒弟
};
uchar hjsz;
uchar ljsz;
uchar jpm;
uchar yfm;
uchar t0 =0;
uint i=0;
sbit Speaker =P1^0;
uint k;
void Delay1()
{
for ( k=0;k<20000;k++);
}
void Lignt( )
{ uchar t;
for(t=0;t<10;t++)
{
P2=0xff;
Delay1();
P2=0x00;
Delay1();
}
}
void Lignt1( )
{
P2=0xaa;
Delay1();
P2=0x55;
Delay1();
}
void Delay(uchar t0)//延時
{
while(t0--) //決定節拍
Lignt1();
}
void Delay2(uchar w0)//延時
{
while(w0--) //決定節拍
Lignt();
}
void T0Int() interrupt 1//TIMER0
{
TL0 = ljsz;
TH0 = hjsz;
Speaker=!Speaker;
}
void ExtInt0() interrupt 0//INT0
{
if(t0>10)
t0=0;
i=0; // 全局變數,指向歌譜的第1個
switch(t0++)
{
case 0 : TABLE=SONG;break; //選擇第1首
case 1 : TABLE=SONG1;break;//選擇第2首
case 2 : TABLE=SONG2;break;//選擇第3首
case 3 : TABLE=SONG3;break;//選擇第4首
case 4 : TABLE=SONG4;break;//選擇第5首
case 5 : TABLE=SONG5;break;//選擇第6首
case 6 : TABLE=SONG6;break;//選擇第7首
case 7 : TABLE=SONG7;break;//選擇第8首
case 8 : TABLE=SONG8;break;//選擇第9首
case 9 : TABLE=SONG9;break;//選擇第10首
}
}
void songsing()//發音程序
{
i=0;
while(TABLE[i])
{
jpm=TABLE[i]&0x0f; //節拍值
yfm=(TABLE[i]>>0x04)&0x0f;//簡譜值
if(yfm) //簡譜為1,取計數值
{
yfm=yfm-1;
hjsz=(uchar)(TABLE1[yfm]>>0x08);//取計數值高位元組
TH0 = hjsz;
ljsz=(uchar)(TABLE1[yfm]); //取計數值低位元組
TL0 = ljsz;
TR0 = 1; //啟動TIMER0
}
else TR0 = 0; //簡譜為0,不發音
Delay(jpm); //節拍延時
i++;
}
}
void main(void)
{
TMOD =0X01;//設TIMER0在MODE1
TCON =0X01;//外部中斷INT0,下降沿觸發
IE =0x83;//開中斷(INT0,TIMER0)
IP =0x00;//設置中斷優先順序
TABLE=SONG0;
while(1)
{
Lignt( );
songsing();//調用發音程序
TR0 = 0;//停止TIMER0
Delay2(1);
TABLE=SONG0;// 更改歌曲0
songsing();
}
}
⑻ 這些單片機代碼根據曲譜怎麼寫出來的,求大神詳細教啊!
哈哈,LZ有求知慾很好嘛!其實原理是這樣的:
首先,音樂有哪幾個最基本的要素?
1,音高(頻率) 2,節拍(音符長度)3,強度。
其次,單片機演奏音樂的原理?
1,硬體方面:以I/o口輸出方波,驅動無源蜂鳴器震動,方波頻率與樂譜中音符的頻率對應(實現了音樂的第1要素)
2,軟體方面,有兩點
(1)如何產生某一頻率的方波?通過定時器產生周期性中斷,在中斷里將IO口的電平翻轉即可,中斷周期(即定時器應賦的初值)可以由需要的頻率計算得到。
(2)如何控制音符的長度(即音樂的第2要素)?從程序結構上來講,有幾種實現途徑,我能想到的:再使用一個定時器,它的中斷周期固定,以它作為長度的基準。比如,定為10ms中斷一次,中斷100次就是1秒,那麼演奏節拍為2/4拍一分鍾60拍的二分音符小字一組A(440Hz),就是200次中斷。定時器0控制I/O口輸出頻率440Hz的方波,並等定時器1中斷 200次之後,就切換到下一音符。這樣就實現了樂音輸出。
3.當然,這樣的音樂是控制不了強弱的,無法實現音樂的要素3。非常簡陋,只能將就。
程序最下面的數組就是單片機的「樂譜」,每一對元素,前面是音高(對應的宏給其對應的在音階里的位置進行了編號,後面是音符長度)。m_note數組存儲的就是演奏某一頻率的樂音對應的定時器中斷周期。
⑼ stc 32位單片機怎麼編程
stm32和51單片機相比,代碼效率高(32位包含信息量大,多數指令一個位元組搞定)、執行速度快(72MHz系統時鍾不是蓋的)、功能強大(外設豐富、管腳多、管腳功能可重映射),優點多多。編程的區別,stm32基本別比劃匯編了,能把腦袋搞大大滴,寄存器太多了,位數也多,我一直搞51匯編也放棄了。C語言編程區別就不大了,況且stm32在國內技術支持很到位,資料豐富(關鍵是不但有E文,中文資料翻譯的也多),還有完整的庫函數支持,從51轉過去沒太大困難。有51相似電路的程序,移植的話好多都不用改的,只是針對寄存器、IO口、中斷等的修改,軟體流程、控制邏輯基本不用改。
說了一大堆,不是說stm32有多好學,還是有點難度,但比起它的優越來,付出是值得的。希望對你有所幫助。
⑽ 求單片機 音樂播放的c代碼
代碼的格式,是由編程者設計的,並沒有統一的規范。
下面的鏈接可供參考。
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/88bfff323ec42ef21b4cff09.html