求蜂鸣器指教
定时器定时200us,中断里翻转接到蜂鸣器的IO 就行;
采用定时器进行频率设置,1khz说明周期是1ms,那么设置高电平为500us,低电平为500us。
程序如下:
#include <reg51.h>
sbit beep = P1 ^ 0;
char num;
void main()
{
TMOD = 0x01; // 设置定时器0为工作方式(M1M0为01)
TH0 = (65536 - 500) / 256; //自动赋初值 最高位 定时0.5ms
TL0 = (65536 - 500) % 256; // 最低位
EA = 1; //开总中断,CPU中断开
ET0 = 1; //定时器0中断
TR0 = 1; //启动定时器0
beep = 0x01 ;
while(1) ;
} //程序停止在这里等待中断发生
void T0_time(void) interrupt 1 // 定时/计数器0溢出中断
{
TH0 = (65535 - 500) / 256; //重装初值
TL0 = (65535 - 500) % 256;
num++;
if(num == 1) //如果到了1次,说明0.5ms已到,num可以用来方便修改周期,间接修改频率
{
num = 0;
beep = ~beep; //让蜂鸣器状态取反
}
}
非常感谢啊~~看来还是要多用中断函数……总之很谢谢你
呵呵,客气啦!
嗯,定时中断。
这个用中断函数的定时是十分准确的,但如果只是粗略的定时的话,毕竟蜂鸣器不需要那么准确的精度(毕竟你分辨不出来1khz和990hz的音频吧?)直接用一个延时函数,然后调用就好了。
贴出代码::
void delay500us()
{
unsigned char j;
for(j=0;j<57;j++) //500us基准延时程序
{
;
}
}
void beep() //产生1KHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
