标题:
51单片机8个按键的电子琴程序+电路
[打印本页]
作者:
云为衣兮风飘飘
时间:
2019-6-5 22:09
标题:
51单片机8个按键的电子琴程序+电路
一.结构
芯片是STC89C,晶振用的11.0592M的Hz的,8个按键开关可以使蜂鸣器发出8个声调:
dol re mi fa sol la xi dol(RST3~RST10),蜂鸣器为有源的,也可以换成0.5W的大喇叭,由于我是在单片机上做的实验,没有做出成品,所以没有实物图。
51单片机电子琴.png
(100.3 KB, 下载次数: 52)
下载附件
2019-6-5 21:57 上传
二.代码
代码比较简单,没有用的中断,也没有用延时,全由if,for,while语句外加两个数组所组成的。
三.或许其中还存在一些问题,希望大佬们能够指出,我也是第一次发帖,谢谢大家!
单片机源程序如下:
#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
unchar code SONG_TONE[]={212,190,169,159,142,126,119,106};//音调
unchar code SONG_LONG[]={12,12,12,12,21,12,12,12};//各个音调的时间
sbit BEEP = P1^4;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
sbit key6=P3^5;
sbit key7=P3^6;
sbit key8=P3^7;
void main(void)
{
unint a,b,c,n;
if(key1 == 0)//判断按键按下
{
a = 0;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;//蜂鸣器开始响
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;//使蜂鸣器停止响
}
if(key2 == 0)
{
a = 1;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key3 == 0)
{
a = 2;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key4 == 0)
{
a = 3;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key5 == 0)
{
a = 4;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key6 == 0)
{
a = 5;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key7 == 0)
{
a = 6;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
if(key8 == 0)
{
a = 7;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{
for(b=0;b<SONG_LONG[a]*20;b++)
{
for(n=0;n<10;n++)
{
BEEP=~BEEP;
for(c=0;c<SONG_TONE[a]/4;c++);
}
break;
}
break;
}
BEEP=1;
}
}
复制代码
全部资料51hei下载地址:
电子琴.zip
(722 Bytes, 下载次数: 41)
2019-6-5 22:11 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Jane_Xu
时间:
2019-6-12 23:29
我想请教楼主:while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
for(b=0;b<SONG_LONG[a]*20;b++)什么意思,没怎么看懂
作者:
Jane_Xu
时间:
2019-6-12 23:33
c基础整的不是很好,请楼主赐教!
作者:
abc111111
时间:
2019-6-13 01:57
学到了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1