void Timer1() interrupt 3
{ TH1=xx TL1=xx //建议还是取定时值为1ms,或者是 0.5ms
cnt++
if (s<50)
{
if(cnt>500) { cnt=0beep=~beep}
}
else if (s>=50 &&s<100)
{
if(cnt>1000) { cnt=0beep=~beep}
}
.........
}
如果定时中断为20ms,对应的频率计数50Hz,这个频率已经很低了,那么再通过cnt计数500次,输出信号频率就远远超出音频范围,你根本就听不到声音;
另外,蜂鸣器的proteus仿真可能不太准确,可以通过仿真示波器看波形及频率就好了;
#include<reg51.h>#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}//0-9
uchar scanled
uchar flag=0
uchar disdat[6]
void delay(unsigned int x)
{
unsigned int i,j
for(i=0i<xi++)
for(j=0j<120j++)
}
void dischg()
{
uchar i
for(i=0i<6i++)
disdat[i]=10
}
void ext0() interrupt 0
{
flag=1
}
void ext1() interrupt 2
{
flag=2
}
void t1isr() interrupt 3 //显示
{
TH1=0xec
TL1=0x78
switch(scanled)
{
case 0:
P2=0x01
P0=~ledtab[disdat[5]]
break
case 1:
P2=0x02
P0=~ledtab[disdat[4]]
break
case 2:
P2=0x04
P0=~ledtab[disdat[3]]
break
case 3:
P2=0x08
P0=~ledtab[disdat[2]]
break
case 4:
P2=0x10
P0=~ledtab[disdat[1]]
break
case 5:
P2=0x20
P0=~ledtab[disdat[0]]
break
default:break
}
scanled++
scanled%=6
}
main()
{
uchar i,j
TMOD=0x10
TH1=0xec
TL1=0x78
TR1=1
ET1=1
IT0=1
IT1=1
EX0=1
EX1=1
EA=1
scanled=0
dischg()
while(1)
{
i=0
switch(flag)
{
case 1:
for(j=0j<3j++)
for(i=0i<10i++)
{
disdat[5]=disdat[4]
disdat[4]=disdat[3]
disdat[3]=disdat[2]
disdat[2]=disdat[1]
disdat[1]=disdat[0]
disdat[0]=i
delay(200)
}
dischg()
flag=0
break
case 2:
for(j=0j<3j++)
for(i=0i<10i++)
{
disdat[0]=disdat[1]
disdat[1]=disdat[2]
disdat[2]=disdat[3]
disdat[3]=disdat[4]
disdat[4]=disdat[5]
disdat[5]=i
delay(200)
}
dischg()
flag=0
break
default:break
}
}
}
程序大致这样:uchar a=0//计中断次数
EX0=1;EX1=1;EA=1;//开相应中断
IT0=1;IT1=1;//下降沿触发
P0=0;//全灭
//中断程序
void zhongduan1(void) interrupt 0
{
a++
if(a==9) a=0
P0=~(0XFF<<a)
}
void zhongduan2(void) interrupt 2
{
if(a!=0) a--
P0=~(0XFF<<a)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)