各位大神好,一直對蜂鳴器唱歌很感興趣,前幾天在我們這個論壇發現了一個關于蜂鳴器唱歌的程序,程序如下:
/************************************************ 跳線設置: 1.蜂鳴器和繼電器 共用p2.2 ,跳線J5設置到23端選中蜂鳴器 2.J7拔掉,雙排針除PSEN外全部插上
效果: 1,生日快樂歌曲 相關知識點: 1,利用單片機的定時器精準定時 ************************************************/
#include"AT89x52.h" #define uchar unsigned char #define uint unsigned int sbit P22=P2^2; uchar i,j,time1,time2; uint code array1[]={ 400,400,650,650,650,1200, 400,400,650,650,650,1200, 400,400,650,650,650,650,1200, 400,400,650,650,650,1200 }; uchar code array[]={ 0xfd,0x79,0xfd,0x79,0xfd,0xc7,0xfd,0x79,0xfe,0x21,0xfe,0x05, 0xfd,0x79,0xfd,0x79,0xfd,0xc7,0xfd,0x79,0xfe,0x51,0xfe,0x21, 0xfd,0x79,0xfd,0x79,0xfe,0xc0,0xfe,0x84,0xfe,0x21,0xfe,0x05,0xfd,0xc7, 0xfe,0x99,0xfe,0x99,0xfe,0x90,0xfe,0x21,0xfe,0x51,0xfe,0x21 };
void delay(uint m) { uint n; for(;m>0;m--) for(n=125;n>0;n--); }
void main() { TMOD=0x01; TH0=0; TL0=0; EA=1; ET0=1; TR0=1; while(1) { time1=array[i++]; time2=array[i++]; if(i==50) i=0; delay(array1[j++]); if(j==25) j=0; }
} void init() interrupt 1 { TR0=0; P22=~P22; TH0=time1; TL0=time2; TR0=1; }
但是,我不太理解這程序的思路,求各位前輩高人幫我解釋下,我對蜂鳴器唱歌的理解是在一段時間里面,輸出不同頻率的方波給蜂鳴器引腳,不知道這樣對不對,另外從程序上怎么體現出來,希望高手可以幫我把這程序講解下,最好是每行都注釋一下,我是新手,謝謝你的解惑和不吝賜教!謝謝! |