基于c51单片机编写一段代码,要求如下基于单片机数字音乐盒的设计要求如下: (1) 用单片机的I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲。 (2) 共有5首(及以上)音乐,乐曲播放可以通过按键控制,有开关键、暂停键、上一曲以及下一曲控制键。 (3) LCD液晶显示歌曲的序号、播放时间,开机时有英文欢迎提示字符。
时间: 2024-02-27 19:52:41 浏览: 124
以下是基于C51单片机的数字音乐盒代码示例:
```
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P1^5; //连接蜂鸣器的I/O口
sbit K1=P3^0; //开关键
sbit K2=P3^1; //暂停键
sbit K3=P3^2; //上一曲键
sbit K4=P3^3; //下一曲键
uchar code Music[5][8]={
{0x20,0x42,0x44,0x48,0x44,0x42,0x41,0x00}, //音乐1
{0x00,0x41,0x42,0x44,0x42,0x41,0x40,0x00}, //音乐2
{0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00}, //音乐3
{0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00}, //音乐4
{0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00} //音乐5
};
uchar code Time[5]={10,20,30,40,50}; //每首音乐的播放时间
uchar cur_music=0; //当前播放的音乐序号
uint cur_time=0; //当前播放的时间(单位:秒)
uchar play_flag=0; //播放标志位,1表示正在播放,0表示停止播放
uchar pause_flag=0; //暂停标志位,1表示暂停播放,0表示继续播放
void delay_ms(uint x) //延时函数,延时x毫秒
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void Init() //初始化函数,包括LCD液晶屏的初始化
{
//...LCD液晶屏初始化代码
//设置定时器T0为16位定时器,工作方式为1,时钟频率为12MHz/12=1MHz
TMOD|=0x01;
TH0=0x00;
TL0=0x00;
TR0=1;
ET0=1;
EA=1;
}
void Play() //播放函数,在定时器中断中调用
{
uchar i,note;
if(play_flag) //如果正在播放
{
if(!pause_flag) //如果没有暂停
{
note=Music[cur_music][cur_time%8]; //取出当前时间对应的音符
if(note) //如果音符不为0
{
for(i=0;i<50;i++) //发出50个方波,每个方波持续时间为0.5ms
{
beep=!beep;
delay_ms(1);
}
}
else //如果音符为0
{
beep=0; //停止发声
delay_ms(20); //静音20ms
}
cur_time++; //时间加1秒
if(cur_time>=Time[cur_music]) //如果当前时间超过了该曲的播放时间
{
cur_time=0; //时间清零
cur_music++; //播放下一首曲目
if(cur_music>=5) //如果已经播放完了所有曲目
{
cur_music=0; //从头开始播放
}
}
}
}
}
void main()
{
Init(); //初始化
while(1)
{
if(K1==0) //开关键按下
{
play_flag=!play_flag; //切换播放标志位
if(play_flag) //如果开始播放
{
cur_music=0; //从第一首曲目开始播放
cur_time=0; //时间清零
}
else //如果停止播放
{
beep=0; //停止发声
}
delay_ms(100); //延时100ms,去抖动
}
if(K2==0) //暂停键按下
{
pause_flag=!pause_flag; //切换暂停标志位
delay_ms(100); //延时100ms,去抖动
}
if(K3==0) //上一曲键按下
{
if(cur_music>0) //如果当前不是第一首曲目
{
cur_music--; //播放上一首曲目
cur_time=0; //时间清零
}
delay_ms(100); //延时100ms,去抖动
}
if(K4==0) //下一曲键按下
{
if(cur_music<4) //如果当前不是最后一首曲目
{
cur_music++; //播放下一首曲目
cur_time=0; //时间清零
}
delay_ms(100); //延时100ms,去抖动
}
}
}
void Timer0() interrupt 1 //定时器T0中断函数
{
TH0=0xFC; //重新设置定时器初值,使其定时1ms
TL0=0x66;
Play(); //调用播放函数
}
```
需要注意的是,以上代码仅为示例代码,仍需根据具体硬件设计进行调整和完善。
阅读全文