基于AT89C51单片机的电子琴音乐盒设计与实现

单片机设计 电子琴音乐盒(AT89C51)

一、电路设计

此电路由AT89C51最小系统、按键模块、数码管显示和蜂鸣器组成。

实现功能:七个按键代表Do La Mi So Re La Si 最后一个按键代表切换音乐。

二、运行结果

三、部分代码


#include
#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;
		}
	}
}

🔥 项目分享:

https://gitee.com/feifei1122/simulation-project

物联沃分享整理
物联沃-IOTWORD物联网 » 基于AT89C51单片机的电子琴音乐盒设计与实现

发表评论