单片机设计 电子琴音乐盒(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;}}
}