打印
[应用方案]

51单片机做的简易电子琴

[复制链接]
990|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2020-2-27 09:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;

}


使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2020-2-27 09:03 | 只看该作者
后续完善,再来分享,主要是讲明白这个原理,昨天跑了一个别人的例子,难听死了,程序也很难懂,我这个应该非常容易理解的。
就是启动定时器,发出指定频率的方波。产生对应音节的音律。

使用特权

评论回复
板凳
wahahaheihei| | 2020-2-27 21:23 | 只看该作者
学习一下。

使用特权

评论回复
地板
heisexingqisi| | 2020-2-27 21:29 | 只看该作者
给力,学习学习

使用特权

评论回复
5
598330983| | 2020-2-27 21:31 | 只看该作者
音质是不是很烂。

使用特权

评论回复
6
antusheng| | 2020-3-12 10:39 | 只看该作者
叮叮叮。。。。

使用特权

评论回复
7
zhuotuzi| | 2020-3-12 19:14 | 只看该作者
应该统一。

使用特权

评论回复
8
643757107| | 2020-3-14 20:06 | 只看该作者
代码规范,处理的不错。

使用特权

评论回复
9
643757107| | 2020-3-14 20:06 | 只看该作者
这个方法非常棒。

使用特权

评论回复
10
天灵灵地灵灵| | 2020-3-15 17:07 | 只看该作者
学习的好参考资料。

使用特权

评论回复
11
zhuomuniao110| | 2020-3-16 15:12 | 只看该作者
用003怎么实现。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1971

主题

15978

帖子

210

粉丝