生成c51语言代码:可以通过P2口接数码管显示器显示曲目编号,能够准确的播放音乐。
时间: 2024-03-07 13:49:57 浏览: 215
下面是基于 C51 语言的实现代码:
```c
#include <reg52.h> // 引入 8051 单片机头文件
// 音乐曲目的频率,可以根据需要自行更改
unsigned int freqs[] = {440, 494, 523, 587, 659, 698, 784, 880};
// 数码管显示表,对应 0~9 和空白字符
unsigned char display[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x00};
void main() {
unsigned char cur = 0; // 当前曲目编号
unsigned char key; // 键盘输入值
unsigned char i; // 循环计数器
while(1) {
key = P1 & 0x0F; // 读取 P1 端口低 4 位,获取键盘输入值
if (key != 0) { // 如果有键盘输入
if (key == 0x0F) { // 如果输入为 0x0F,表示切换曲目
cur = (cur + 1) % 8; // 曲目编号循环加 1
} else if (key <= 8) { // 如果输入为 1~8,表示选中曲目
cur = key - 1; // 获取曲目编号
}
}
// 数码管显示当前曲目编号
P2 = display[cur];
for (i = 0; i < 100; i++); // 延时一段时间,以保证数码管能够显示出来
// 产生当前曲目的频率方波
for (i = 0; i < 200; i++) {
P1 = 0x10; // P1.4 置 1
TH0 = TL0 = 256 - freqs[cur]; // 设置定时器初值,产生方波
TR0 = 1; // 启动定时器 0
while (!TF0); // 等待定时器 0 溢出
TF0 = 0; // 清除定时器 0 溢出标志
P1 = 0x00; // P1.4 置 0
TH0 = TL0 = 256 - freqs[cur]; // 设置定时器初值,产生方波
TR0 = 1; // 启动定时器 0
while (!TF0); // 等待定时器 0 溢出
TF0 = 0; // 清除定时器 0 溢出标志
}
}
}
```
执行该程序后,通过 P1 端口接键盘进行曲目选择。按下 1~8 中任意一个数字键,将会选中对应编号的曲目;按下 0x0F 键,将切换到下一个曲目。同时,程序会在 P1.4 引脚上产生当前曲目的频率方波,并通过 P2 端口接数码管显示当前曲目编号。
阅读全文