相信大家对音乐还是有点感兴趣吧!
奉上一个用8051 单片机做的简易电子琴,源码如下:
#include <reg51.h>
sbit K1=P1^4;
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
sbit K5=P3^2;
sbit K6=P3^3;
sbit K7=P3^4;
sbit Bee=P3^7; //蜂鸣器所在
//定义七个基本音节
unsigned int Music_7[]={262,294,330,349,392,440,494};
//定义高音的七个音节,因为按键不够暂时不用,可以在Proteus仿真中使用
//unsigned int Music_7_H[]={523,587,659,698,784,880,988};
unsigned char th,tl;
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0F8;
TL0 = 0x18;
EA = 1;
ET0 = 1;
Bee =1; //关闭蜂鸣器,因为这蜂鸣器跟喇叭不同,只要上电就他娘的响
TR0 = 0; //关闭定时器,防止一开机就嗷嗷的响
}
void set_music(unsigned char i)
{
th=(65536-(1000000/Music_7[i]))/256;
tl=(65536-(1000000/Music_7[i]))%256;
TH0=th;
TL0=tl;
}
void delay1s(void) //误差 0us
{
unsigned char b,c;
for(c=180;c>0;c--)
for(b=250;b>0;b--)
;
}
void main(void)
{
InitTimer0();
while(1)
{
if(K1==0)
{
set_music(0);
while(K1==0);
{
TR0=1; //启动定时器开始演奏音乐
delay1s(); //每次触发大概1秒,后续可修改为松手停止响。这里可以换成松手检测就可以了
TR0=0; //关闭定时器,停止音律响
Bee=1; //关闭蜂鸣器,防止一直嗷嗷响,如果用的是喇叭就可以忽略这个。
}
}
if(K2==0)
{
set_music(1);
while(K2==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
if(K3==0)
{
set_music(2);
while(K3==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
if(K4==0)
{
set_music(3);
while(K4==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
if(K5==0)
{
set_music(4);
while(K5==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
if(K6==0)
{
set_music(5);
while(K6==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
if(K7==0)
{
set_music(6);
while(K7==0);
{
TR0=1;
delay1s();
TR0=0;
Bee=1;
}
}
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = th;
TL0 = tl;
Bee = ~Bee;
}