生成单片机c51语言代码:1、音乐盒上电或按键复位后能自动显示P.,从而进入准备工作状态。该音乐盒可以通过键盘选择曲目、切换曲目。该音乐盒可以通过数码管显示器显示曲目编号,能够准确的播放音乐。 2、音乐盒可切换到电子琴功能,按键能发出do,re,mi...
时间: 2024-02-19 15:57:30 浏览: 115
(完整word)STC89C51单片机的数字音乐盒设计(含代码).doc
以下是基于C51的音乐盒代码:
```c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^0; //选择曲目键
sbit K2 = P1^1; //下一曲键
sbit K3 = P1^2; //上一曲键
sbit K4 = P1^3; //电子琴功能键
uchar code music1[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //曲目1
uchar code music2[8] = {0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; //曲目2
uchar code music3[8] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18}; //曲目3
uchar code keyboard[7] = {0xF7,0xFB,0xFD,0xFE,0xEF,0xDF,0xBF}; //键盘扫描码
uchar code music_note[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //音符
uchar current_music = 0; //当前曲目编号
uchar current_note = 0; //当前音符编号
uchar mode = 0; //音乐盒模式:0表示选择曲目模式,1表示电子琴模式
void delay(uint n) //延时函数
{
uint i;
while(n--)
{
for(i=0;i<125;i++);
}
}
void init() //初始化函数
{
P0 = 0x00; //P0口输出低电平
P2 = 0xFF; //P2口输出高电平
current_music = 0; //初始化当前曲目编号
current_note = 0; //初始化当前音符编号
mode = 0; //初始化音乐盒模式
}
void display(uchar num) //数码管显示函数
{
uchar i;
P0 = 0x00; //数码管显示部分,先将P0口输出低电平
P2 = 0xFF; //控制位部分,将P2口输出高电平
switch(num)
{
case 0: P0 = 0xC0;break; //0
case 1: P0 = 0xF9;break; //1
case 2: P0 = 0xA4;break; //2
case 3: P0 = 0xB0;break; //3
case 4: P0 = 0x99;break; //4
case 5: P0 = 0x92;break; //5
case 6: P0 = 0x82;break; //6
case 7: P0 = 0xF8;break; //7
case 8: P0 = 0x80;break; //8
case 9: P0 = 0x90;break; //9
}
for(i=0;i<10;i++); //延时一段时间
}
void main() //主函数
{
init(); //调用初始化函数
while(1) //循环执行
{
if(K1 == 0) //选择曲目键按下
{
delay(5); //延时一段时间
if(K1 == 0) //再次检测按键是否按下
{
current_music++; //当前曲目编号加1
if(current_music > 2) //如果已经是最后一首曲目,回到第一首曲目
{
current_music = 0;
}
current_note = 0; //将当前音符编号清零
}
while(!K1); //等待选择曲目键松开
}
else if(K2 == 0) //下一曲键按下
{
delay(5); //延时一段时间
if(K2 == 0) //再次检测按键是否按下
{
current_music++; //当前曲目编号加1
if(current_music > 2) //如果已经是最后一首曲目,回到第一首曲目
{
current_music = 0;
}
current_note = 0; //将当前音符编号清零
}
while(!K2); //等待下一曲键松开
}
else if(K3 == 0) //上一曲键按下
{
delay(5); //延时一段时间
if(K3 == 0) //再次检测按键是否按下
{
current_music--; //当前曲目编号减1
if(current_music < 0) //如果已经是第一首曲目,回到最后一首曲目
{
current_music = 2;
}
current_note = 0; //将当前音符编号清零
}
while(!K3); //等待上一曲键松开
}
else if(K4 == 0) //电子琴功能键按下
{
delay(5); //延时一段时间
if(K4 == 0) //再次检测按键是否按下
{
mode = !mode; //切换音乐盒模式
current_note = 0; //将当前音符编号清零
}
while(!K4); //等待电子琴功能键松开
}
else //正常播放曲目
{
if(mode == 0) //选择曲目模式
{
display(current_music); //数码管显示当前曲目编号
P0 = music_note[music1[current_note]]; //按照曲目1的音符播放
current_note++; //当前音符编号加1
if(current_note > 7) //如果已经播放完所有音符,回到第一个音符
{
current_note = 0;
}
}
else //电子琴模式
{
display(current_note); //数码管显示当前音符编号
P0 = music_note[current_note]; //按照音符表播放音符
current_note++; //当前音符编号加1
if(current_note > 7) //如果已经播放完所有音符,回到第一个音符
{
current_note = 0;
}
}
}
delay(10); //延时一段时间
}
}
```
该代码实现了音乐盒功能的基本要求,包括选择曲目、切换曲目和电子琴功能。对于音乐的播放,采用了一个音符表和三个曲目表来实现。通过按照表中的音符顺序依次输出到P0口,来实现音乐的播放。同时,在选择曲目和电子琴功能时,需要通过数码管显示器来显示当前的状态。
阅读全文