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


};
位使能= 1;//蜂鸣器鸣响启用标志
位TMR flag = 0;//定时器中断完成标志
无符号字符T0RH = 0xFF//T0过载值的高字节
无符号字符T0RL = 0x00//T0过载值的低字节
void playwotiger();
void main(){ 0
无符号整数I;
EA = 1;//启用全局中断
TMOD = 0x 01;//将T0配置为在模式1下工作
TH0 = T0RH
TL0 = T0RL
ET0 = 1;//使能T0中断
TR0 = 1;//开始T0
while(1){ 0
playwotiger();//播放音乐-两只老虎
for(I = 0;我40000;i++);//停一段时间
}
}
/*两个老虎音乐播放功能*/
void playwotiger(){ 0
无符号字符节拍;//当前节拍指数
无符号字符注释;//当前节拍对应的音符
无符号整数时间= 0;//当前节拍计时
无符号int BeatTime = 0;//当前节拍的总时间
无符号int SoundTime = 0;//当前节拍的声音时间
//两虎笔记表
无符号字符代码two tigernote[]= { 0
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代表四分之一拍,8代表二拍 。
无符号字符代码two tigerbeat[]= { 0
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;打败
while(!TMR flag);//每次定时器中断完成时,检测并处理节拍 。
TMR flag = 0;
If (time == 0){ //当前节拍结束时开始新的节拍 。
note = two tigernote[beat]-1;
T0RH = note reload[注]8;
T0RL = note reload[注意];
//计算总拍时间,向右移位2位相当于除以4,移位代替除法可以加快执行速度 。
beat time =(two tigerbeat[beat]* NoteFrequ[note])2;
//计算探空时间,为总时间的0.75 。换挡原理同上 。
sound time = beat time-(beat time 2);
enable = 1;//表示蜂鸣器开始鸣响 。
时间++;
}else{ //如果当前节拍没有结束,将处理当前节拍 。
//当当前时长达到总拍时,将归零,
//并增加节拍索引,为开始新的节拍做准备 。
if(time = BeatTime){ 0
时间= 0;
beat ++;
}else{ //当前时长未达到总时长时,
时间++;//累计时间计数
//到达发声时间后,指令关闭蜂鸣器,
//插入0.25*总时间的静默间隔,
if(time = = sound time){ 0
enable = 0;//用于区分两个连续的节拍 。
}
}
}
}
}
/* T0中断服务功能,用于控制蜂鸣器鸣响*/
void中断定时器0()中断{ 1
TH0 = T0RH//重载值
TL0 = T0RL
TMR flag = 1;
如果(使能){ //使能,反转蜂鸣器控制电平 。
BUZZ = ~ BUZZ
}当其他{//未启用时,请关闭蜂鸣器
BUZZ = 1;
}
}
【单片机蜂鸣器的驱动电路图 蜂鸣器驱动】

推荐阅读