![]() |
play_song()里有死循環while(1),程序到這里打轉轉了。 |
給你一個蜂鳴器音樂與流水燈同時實現功能的編程思路,不代表此程序能夠直接正常運行。 #include "reg52.h" sbit buzzer=P2^3 ; //蜂鳴器控制腳 unsigned char code SONG1[]={//音樂頻率數組, 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}; unsigned char code SONG2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈數組 unsigned char Count; unsigned int i; unsigned char j; void Time0_Init() { TMOD = 0x21; TH0 = 0x3C;//50ms TL0 = 0xB0;//50ms TH1 = 0x00; TL1 = 0x00; TR0 = 1; TR1 = 1; EA = 1; ET0 = 1; ET1 = 1; } void Time0_Int() interrupt 1 { TH0 = 0x3C; TL0 = 0xB0; Count++; if(Count%5==0)//250ms節拍 { i++; if(i=='\0') i=0; TH1=SONG1[i];//T1重裝值,音樂頻率 } if(Count==10)//500ms流水燈變化速度 { Count=0; j++; if(j=='\0') j=0; P0=SONG2[j];//流水燈花樣 } } void Timer1Int() interrupt 3 { buzzer=~buzzer; } void main() { Time0_Init(); while(1); } |
函數play_song()包含while(1)語句。 將“ 1”更改為適當的條件。 |
不太明白你的描述,心形燈會亮嗎?你的程序寫的就是先播放曲子然后亮燈,所以是不可能同時動作的,想要曲子和燈一起,就不能順序寫下來 |
因為程序是一步一步執行,從主程序看,找執行播放音樂函數,播放完音樂再去執行流水燈的程序,這兩個程序是排著隊串行處理的,要想并行處理,可以試試將蜂鳴器發聲的相關程序放在定時器中斷函數中。中。 |