单片机设计 电子琴音乐盒(AT89C51)
想要更多项目私wo!!!
一、电路设计
此电路由AT89C51最小系统、按键模块、数码管显示和蜂鸣器组成。
实现功能:七个按键代表Do La Mi So Re La Si 最后一个按键代表切换音乐。
二、运行结果
三、部分代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//#include "main.h"
sbit BeepIO = P0^7; //定义音频输出管脚
sbit KEY1 = P1^0; //按键1 do
sbit KEY2 = P1^1; //按键2 re
sbit KEY3 = P1^2; //按键3 mi
sbit KEY4 = P1^3; //按键4 fa
sbit KEY5 = P1^4; //按键5 sol
sbit KEY6 = P1^5; //按键6 la
sbit KEY7 = P1^6; //按键7 si
sbit KEY8 = P1^7; //按键8 音乐切换
uchar music=0;
uchar n=0;
uchar n1=0;
uchar n2=0;
uchar n3=0;
uchar key=0;
char temp1,temp2; //存放初值的中间变量
void main()
{
BeepIO=0;
systimer0_init();
while(1)
{
BeepIO=1;
key_scan();
if(music > 0)
{
key = 0;
if(music == 1) //判断按键是否按下
{
while(1)
{
key_scan();
if(key != 0)
{
if(key != 8)
{
music = 0;
}
break;
}
TH0=table1[music_dat[n][0]]/256; //赋初值
TL0=table1[music_dat[n][0]]%256;
TR0=1; //音乐开始
delay100ms(music_dat[n][1]); //调用延时,用做节拍的发生
n++; //下个音调开始
if(music_dat[n][0]==0xff)
{
n=0; //判断是否到最后一个音调
TR0=0; //一个调放完,即将进行下一调
}
}
}
if(music == 4) //判断按键是否按下
{
while(1)
{
key_scan();
if(key != 0)
{
if(key != 8)
{
music = 0;
}
break;
}
TH0=table1[music_dat1[n1][0]]/256; //赋初值
TL0=table1[music_dat1[n1][0]]%256;
TR0=1; //音乐开始
delay100ms(music_dat1[n1][1]); //调用延时,用做节拍的发生
n1++; //下个音调
if(music_dat1[n1][0]==0xff)
{
n1=0; //判断是否到最后一个音调
TR0=0; //一个调放完,即将进行下一调
}
}
}
if(music == 3) //判断按键是否按下
{
while(1)
{
key_scan();
if(key != 0)
{
if(key != 8)
{
music = 0;
}
break;
}
TH0=table1[music_dat2[n2][0]]/256; //赋初值
TL0=table1[music_dat2[n2][0]]%256;
TR0=1; //音乐开始
delay100ms(music_dat2[n2][1]); //调用延时,用做节拍的发生
n2++; //下个音调开始
if(music_dat2[n2][0]==0xff)
{
n2=0; //判断是否到最后一个音调
TR0=0; //一个调放完,即将进行下一个调
}
}
}
if(music == 2) //判断按键是否按下
{
while(1)
{
key_scan();
if(key != 0)
{
if(key != 8)
{
music = 0;
}
break;
}
TH0=table1[music_dat3[n3][0]]/256; //赋初值
TL0=table1[music_dat3[n3][0]]%256;
TR0=1; //音乐开始
delay100ms(music_dat3[n3][1]); //调用延时,用做节拍的发生
n3++; //下个音调开始
if(music_dat3[n3][0]==0xff)
{
n3=0; //判断是否到最后一个音调
TR0=0; //一个调放完,即将进行下一个调
}
}
}
}
else
{
TR0=0;
TR1=0;
BeepIO = 1;
}
}
}