c51小车在循迹过程中播放音乐的代码
时间: 2023-08-20 18:03:57 浏览: 100
51单片机智能小车红外循迹+测速程序源代码.rar
以下是利用C51小车循迹同时播放音乐的代码示例:
```c
#include <reg52.h>
sbit beep = P1^5; //连接蜂鸣器的IO口
unsigned char code music[] = { //音乐数据段
0x01, 0x01, 0x03, 0x01, 0x05, 0x05, 0x04, 0x03,
0x03, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x05,
0x05, 0x04, 0x04, 0x03, 0x01, 0x01, 0x03, 0x01,
0x05, 0x05, 0x04, 0x03, 0x03, 0x04, 0x05, 0x05,
0x05, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03
};
unsigned char code beat[] = { //节拍数据段
2, 2, 4, 2, 4, 4, 8, 2,
4, 4, 4, 4, 4, 8, 2, 4,
4, 4, 4, 8, 2, 2, 4, 2,
4, 4, 8, 2, 4, 4, 4, 4,
4, 8, 2, 4, 4, 4, 4, 4
};
void delay(unsigned int t) { //延时函数
while(t--);
}
void play(unsigned char note, unsigned char t) { //播放函数
unsigned int i;
unsigned int freq;
if(note == 0) { //停止播放
delay(t * 10);
return;
}
freq = 500000 / note; //计算频率
for(i = 0; i < (unsigned int)(t * freq / 1000); i++) { //按照时长播放
beep = 1; //输出高电平
delay(500 / freq); //根据频率调整延时
beep = 0; //输出低电平
delay(500 / freq);
}
delay(20); //两个音符之间的间隔
}
void main() {
unsigned char i;
while(1) {
if(P0 == 0x0f) { //循迹停止时播放音乐
for(i = 0; i < sizeof(music); i++) {
play(music[i], beat[i]); //按照音乐数据和节拍数据播放音乐
}
} else { //循迹时不播放音乐
play(0, 100); //停止播放,延时100ms
}
}
}
```
该代码中,音乐数据和节拍数据以两个常量数组的形式存储。在`main()`函数中,当循迹停止时,按照音乐数据和节拍数据播放音乐;当小车在循迹时,停止播放音乐。播放函数`play()`根据输入的音符和时长,计算出频率,然后按照一定的节拍播放音乐。
阅读全文