生成单片机c51语言代码:1、音乐盒上电或按键复位后能自动显示P.,从而进入准备工作状态。该音乐盒可以通过键盘选择曲目、切换曲目。该音乐盒可以通过数码管显示器显示曲目编号,能够准确的播放音乐。 2、音乐盒可切换到电子琴功能,按键能发出do,re,mi...
时间: 2024-02-19 19:57:24 浏览: 23
以下是一个简单的C51代码,可以实现上述功能:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 数码管显示表
uchar code DisplayTable[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 曲目列表,每个曲目用一个数组保存
uchar code SongList[][10] = {
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05}, // 曲目1
{0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b}, // 曲目2
{0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11} // 曲目3
};
// 按键扫描函数
uchar KeyScan()
{
uchar key = 0xff;
P1 = 0x0f;
if (P1 != 0x0f)
{
delay(1000);
if (P1 != 0x0f)
{
P1 = 0x0f;
switch (P1)
{
case 0x07: key = 0; break;
case 0x0b: key = 1; break;
case 0x0d: key = 2; break;
case 0x0e: key = 3; break;
}
}
}
return key;
}
// 数码管显示函数
void Display(uint num)
{
uchar i, j, k;
for (i = 0; i < 4; i++)
{
j = num % 10;
k = DisplayTable[j];
P0 = k;
P2 = i;
delay(100);
num /= 10;
}
}
// 延时函数
void delay(uint n)
{
uint i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
// 主函数
void main()
{
uchar i, j, key;
while (1)
{
// 显示P.
P0 = 0x00;
P2 = 0;
delay(500);
P0 = 0x7f;
P2 = 1;
delay(500);
// 显示曲目编号
Display(i+1);
// 播放当前曲目
for (j = 0; j < 6; j++)
{
P3 = SongList[i][j];
delay(1000);
}
// 选择曲目
key = KeyScan();
if (key != 0xff)
{
i = key;
}
// 切换到电子琴功能
if (P1 == 0xfe)
{
while (1)
{
// 等待按键
key = KeyScan();
if (key != 0xff)
{
// 发出音乐声
switch (key)
{
case 0: P3 = 0x0c; break; // do
case 1: P3 = 0x0e; break; // re
case 2: P3 = 0x0f; break; // mi
case 3: P3 = 0x11; break; // fa
case 4: P3 = 0x12; break; // sol
case 5: P3 = 0x13; break; // la
case 6: P3 = 0x14; break; // xi
case 7: P3 = 0x15; break; // do
}
}
}
}
}
}
```
该代码实现了音乐盒的基本功能,包括显示P.、选择曲目、播放音乐、切换到电子琴功能等。其中,按键扫描函数使用了矩阵按键扫描的方法,可以同时检测多个按键。数码管显示函数使用了共阴数码管,并通过P0和P2口控制数码管的位选和段选。延时函数使用了简单的循环延时方式。