改成這樣
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sfr P1M1 = 0x91;
- sfr P1M0 = 0x92;
- sfr IE2 = 0xaf; //中斷使能寄存器2
- sfr AUXR = 0x8e; //輔助寄存器
- sfr T2H = 0xD6; //定時器2高8位
- sfr T2L = 0xD7; //定時器2低8位
- sbit fmq=P3^5; //定義P0.0口為蜂鳴器信號輸出
- uint z; //用來控制音節(jié)
- sbit key=P3^3;
- sbit led=P3^4;
- //uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//對應(yīng)每個單調(diào)的計數(shù)初值
- uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按鍵值,對應(yīng)
- //io:0,1,2,3,4,5,6,7
- uint code tab[]= {
- 64021,64103,64260,64400,
- 64524,64580,64684,64777,
- 64820,64898,64698,65030,
- 65058,65110,65157,65178};
- void zdkg()
- {
- if(key==1)
- {
- P1=0xff;
- IE2 &= ~0x04; //若需要手動清除中斷標志,可先關(guān)閉中斷,此時系統(tǒng)會自動清除內(nèi)部的中斷標志
- //TR1=0;//如果沒有按鍵按下,就關(guān)閉定時器中斷
- fmq=1;//同時也關(guān)閉蜂鳴器
- }
- else //否則就進入中斷
- {
- //TR1=1;
- IE2 |= 0x04; //然后再開中斷即可
- }
- }
- void main()
- {
- P1M0 = 0x00;
- P1M1 = 0x00;
-
- EA=1;//開總中斷
- //ET1=1;//定時器T1中斷允許
- //AUXR |= 0x04; //定時器2為1T模式
- AUXR &= ~0x04; //定時器2為12T模式
- IE2 |= 0x04; //開定時器2中斷
- //TMOD=0x10;//使用定時器T1的模式1
- T2H=(65536-500)/256;//定時器T1的高8位重新賦初值
- T2L=(65536-500)%256;//定時器T1的低8位重新賦初值
- AUXR |= 0x10; //定時器2開始計時
- P1=0xff;//先關(guān)所有LED燈
- while(1)
- {
- key =1;
- led =1;
- if(key==0)
- {
- z=tab[0]; //控制音節(jié)
- led=0;
- }
-
- zdkg();
-
- }
- }
- void Time2(void) interrupt 12 using 1//
- {
- fmq=~fmq; //每進入一次中斷就取反一次,快速的進入退出中斷,就會聽到蜂鳴器發(fā)出的音調(diào)
- T2H=z/256;//定時器T2的高8位重新賦初值
- T2L=z%256;//定時器T2的低8位重新賦初值
- }
復制代碼 |