楼主给出了单片机型号,但是没有给出晶振频率,那么,网友就无法提供调好的程序。
建议楼主在自己的程序上修改。
程序中的: sleep(80);,是控制发音频率的;
程序中的: for(i=0;i<200;i++),是控制发音时间的;
程序中的: sleep(20000);,是控制发音停顿时间的。
最直观的,是加大sleep(20000);中的数,最大可以用到65535。应该能达到1秒1次的发音效果。
如果还是达不到,可以把sleep(20000);,写上两行,延时两次,再多的次数也可以。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#01H ;定时器0工作在方式1
MOV TH0,#3CH ;定时50ms
MOV TL0,#0B0H
MOV R7,#20 ;1s计数值
SETB TR0
MLOOP: JNB TF0,$
CLR TF0 ;清除中断标志位
MOV TH0,#3CH ;定时初值重设
MOV TL0,#0B0H
DJNZ R7,MLOOP ;判断一秒到了没
MOV R7,#20
CPL SPK ;SPK取反
AJMP MLOOP
希望可以帮助你。
你这个程序用的不精准的延时所以不行啊,你最好用定时器去做延时,这样能精准·!
延时短了吧,用这个延时看看
void sleep(int z)
{int i,j;
for(i=0;i
} //sleep(1000)约等于一秒
是延时不准确造成的 如果要求时间准确 还是用定时器比较好!