改成这样
- #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; //用来控制音节
- sbit key=P3^3;
- sbit led=P3^4;
- //uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//对应每个单调的计数初值
- uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键值,对应
- //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; //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
- //TR1=0;//如果没有按键按下,就关闭定时器中断
- fmq=1;//同时也关闭蜂鸣器
- }
- 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;//先关所有LED灯
- while(1)
- {
- key =1;
- led =1;
- if(key==0)
- {
- z=tab[0]; //控制音节
- led=0;
- }
-
- zdkg();
-
- }
- }
- void Time2(void) interrupt 12 using 1//
- {
- fmq=~fmq; //每进入一次中断就取反一次,快速的进入退出中断,就会听到蜂鸣器发出的音调
- T2H=z/256;//定时器T2的高8位重新赋初值
- T2L=z%256;//定时器T2的低8位重新赋初值
- }
复制代码 |