你的程序,我研究了,修改了一下,可以通过外部中断按键让蜂鸣器发声音了。
由于不明白你的a变量是干什么用的,就没有动这个部分。目前的现象是:
先按键,按下第二次,蜂鸣器就开始响了,关不了。不知道你是不是这样设置的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
sbit k0=P3^2;
sbit spk=P0^0;
uchar a=0;
void int0() interrupt 0
{
if(k0==0)
{
a++;
if(a>3)
{
a=0;
}
}
}
void timer0() interrupt 1
{
spk=!spk;
TH0=0xFC;
TL0=0x18;
}
void delay(uint z)
{
uint x,y;
for(x=z;z>0;x--)
for(y=245;y>0;y--);
}
void main()
{
TMOD=0X11;
//IE=0x83;
EA=1;
EX0=1;
IT0=1;
ET0=1;
PT0=1;
PX0=0;
TH0=0xFC;
TL0=0x18;
while(1)
{
if(a>2) //就是这里,keil里调试发现a>2的时候还是无法进入定时。
{
TR0=1;
delay(50000);
delay(50000);
delay(50000);
delay(50000);
TR0=0;
}
else TR0=0;
}
}
这是另外一个修改的程序,可以通过按键,按若干次,可以让蜂鸣器一会儿响,一会儿不响,不知道能你有没有用。也给你吧:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
sbit k0=P3^2;
sbit spk=P0^0;
uchar a=0;
void Delay10ms(unsigned char c)
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{
TMOD = 0x01; //设置定时器模式
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
ET0=1;
EA=1;
EX0=1;
IT0=1;
PT0=0;
PX0=1;
while(1)
{
if(a>2) //就是这里,keil里调试发现a>2的时候还是无法进入定时。
{
TR0=1;
Delay10ms(100);
TR0=0;
}
else TR0=0;
}
}
void int0() interrupt 0
{
Delay10ms(5);
a++;
if(a>3)
{
a=0;
}
IE0=0;
}
void timer0() interrupt 1
{
spk=!spk;
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
}
|