单片机蜂鸣器的驱动电路图 蜂鸣器驱动( 二 )


};
位使能= 1;//蜂鸣器发声启用标志
位TMR flag = 0;//定时器中断完成标志
无符号字符T0RH = 0xFF//T0重载值的高字节
无符号字符T0RL = 0x00//T0重载值的低位字节
void playtwottiger();
Voi信息资源网d main(){
无符号int I;
EA = 1;//启用全局中断
TMOD = 0x 01;//将T0配置为在模式1下工作
TH0 = T0RH
TL0 = T0RL
ET0 = 1;//使能T0中断
TR0 = 1;//启动信息资源网络T0
while (1){
playtwottiger();//播放音乐-两只老虎
for(I = 0;我}
}
/*两个Tiger音乐播放功能*/
void playtwottiger(){
无符号字符节拍;//当前节拍索引
无符号字符注释;//对应于当前节拍的音符
无符号int time = 0;//当前节拍时序
无符号int beat time = 0;//当前节拍的总时间
无符号int sound time = 0;//需要当前节拍的发声时间 。
//二虎笔记表
无符号字符代码TwoTigerNote[] = {
1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,
5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1,
};
//两个虎拍表,4代表一拍,1是1/4拍,8是2拍 。
无符号字符代码TwoTigerBeat[] = {
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,
3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,
};
//使用节拍索引作为循环变量
for(beat = 0;打败
而(!tmrflag);//每次定时器中断后,检测并处理节拍 。
TMR flag = 0;
If (time == 0){ //当前节拍结束后开始新的节拍 。
note = two tiger note[beat]-1;
T0RH = note reload[note]> > 8;
T0RL = note reload[note];
//计算总节拍时间 。右移2位相当于除以4 。用移位代替除法可以加快执行速度 。
beat time =(two tiger beat[beat]* NoteFrequ[note])> > 2;
//计算发声时间,占总时间的0.75 。换挡原理同上 。
sound time = beat time-(beat time > > 2);
enable = 1;//表示蜂鸣器开始鸣响 。
time++;
}else{ //如果当前节拍未广播,则处理当前节拍 。
//当前时长达到总节拍时间时归零,
//并递增节拍索引以准备开始新的节拍 。
if(时间> =节拍时间){
时间= 0;
beat++;
}else{ //当前时长未达到总时长时,
time++;//累计时间计数
//当发声时间到时,指示关闭蜂鸣器,
//插入一个0.25*总时间的静默区间,
if (time == soundTime){
enable = 0;//用于区分两个连续的节拍
}
}
}
}
}
/* T0中断服务功能,用于控制蜂鸣器声音*/
void InterruptTimer0()中断1{
TH0 = T0RH//重新加载重载的值
TL0 = T0RL
TMR flag = 1;
If (enable){ //启用时反转蜂鸣器控制电平 。
嗡嗡= ~嗡嗡;
}else{ //未启用时关闭蜂鸣器 。
BUZZ = 1;
}
}
【单片机蜂鸣器的驱动电路图 蜂鸣器驱动】


推荐阅读