基于C51单片机8键电子琴设计软件源码

#include <reg52.h>          //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义       变量范围0~255

#define uint  unsigned int     //无符号整型 宏定义  变量范围0~65535

sbit beep  = P2^5;    //蜂鸣器定义

sbit K1=P1^0;//给P1^0定义,控制DO的发音

sbit K2=P1^1;//给P1^1定义,控制XI的发音

sbit K3=P1^2;//给P1^2定义,控制LA的发音

sbit K4=P1^3;//给P1^3定义,控制SO的发音

sbit K5=P3^4;//给P3^4定义,控制FA的发音

sbit K6=P3^5;//给P3^5定义,控制MI的发音

sbit K7=P3^6;//给P3^6定义,控制RE的发音

sbit K8=P3^7;//给P3^7定义,控制DO的发音

sbit K9=P2^0;//音乐播放按键

uchar flag_en = 0;      //开始放歌

uchar flag_i = 0;

//数码管段选定义       0    1    2    3   4       5        6      7      8     9     

uchar code smg_du[]={0xde,0x90,0xcd,0xd9,0x93,0x5b,0x5f,0xd0,0xdf,0xdb

//                                         A        B      C      D    E   F        不显示

                                         };   //断码   

uchar m,n;

uchar code T[49][2]={{0,0},

{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},

{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},

{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},

{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}

};

uchar code music1[][2]={{0,4},        //青花瓷

{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},

{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,16},{0,4},

{17,4},{19,4},{17,4},{17,4},{19,4},{17,4},{19,4},{19,4},{21,8},{24,4},{21,4},{21,12},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},

{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},{12,4},{21,8},{19,4},{19,8},{17,16},

{0xFF,0xFF}};

uchar code music2[][2]={{0,4},       //生日快乐

{17,6},{17,2},{19,8},{17,8},{22,8},{21,16},

{17,6},{17,2},{19,8},{17,8},{24,8},{22,16},{17,6},{17,2},{29,8},{26,8},{22,8},{21,8},{19,8},{27,6},{27,2},{26,8},{22,8},{24,8},{22,16},

{0xFF,0xFF}};

uchar code music3[][2]={{0,4},     //爱情买卖

{22,4},{22,4},{17,4},{15,4},{15,4},{17,12},

{15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},{0,4},

{20,4},{20,4},{20,4},{17,4},{20,4},{20,4},{20,4},{17,4},

{22,4},{17,4},{17,4},{15,4},{15,4},{17,12},

{22,4},{22,4},{17,4},{15,4},{15,4},{17,12},

{15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},

{20,4},{20,4},{20,2},{17,2},{17,4},{20,4},{20,4},{20,2},{17,2},{17,2},{17,2},

{24,4},{20,4},{20,2},{17,2},{17,4},{20,4},{22,12},

{17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8},

{24,4},{22,2},{24,2},{22,4},{20,4},{15,4},{17,12},

{15,4},{15,4},{15,4},{10,4},{15,4},{17,4},{20,8},

{17,4},{24,4},{24,4},{20,4},{15,4},{17,12},

{17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8},

{29,4},{27,2},{29,2},{27,4},{25,4},{25,4},{27,12},

{29,4},{29,2},{27,4},{25,4},{27,6},{27,2},{25,4},{24,4},

{20,4},{20,2},{17,2},{20,4},{20,2},{22,2},{22,16},

{0xFF,0xFF}};

void delay(uchar p)

{

    uchar i,j;

    for(;p>0;p--)

    for(i=181;i>0;i--)

    for(j=181;j>0;j--);

}

void pause()

{

    uchar i,j;

    for(i=150;i>0;i--)

    for(j=150;j>0;j--);

}

/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i<q;i++)

                for(j=0;j<120;j++);

}

/******************按键程序*************************/

void key()          //按键程序

{

        if(K1==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K1==0)

                {

                        P0=smg_du[0];//使数码管显示该音调的字符

                        while(!K1)

                        {

                                m = 8;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K2==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K2==0)

                {

                        P0=smg_du[1];//使数码管显示该音调的字符

                        while(!K2)

                        {

                                m = 9;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K3==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K3==0)

                {

                        P0=smg_du[2];//使数码管显示该音调的字符

                        while(!K3)

                        {

                                m = 10;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K4==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K4==0)

                {

                        P0=smg_du[3];//使数码管显示该音调的字符            

                        while(!K4)

                        {

                                m = 11;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K5==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K5==0)

                {

                        P0=smg_du[4];//使数码管显示该音调的字符

                        while(!K5)             

                        {

                                m = 12;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K6==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K6==0)

                {

                        P0=smg_du[5];//使数码管显示该音调的字符

                        while(!K6)     

                        {

                                m = 13;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K7==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K7==0)

                {

                        P0=smg_du[6];//使数码管显示该音调的字符

                        while(!K7)

                        {

                                m = 14;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        if(K8==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K8==0)

                {

                        P0=smg_du[7];//使数码管显示该音调的字符

                        while(!K8)

                        {

                                m = 15;

                                TR0 = 1;         //打开定时器

                        }//使蜂鸣器发出相应频率的声音;

                        TR0 = 0;            //关闭定时器

                }

        }

        P0 = 0x20;

        K9 = 1;      

        if(K9==0)

        {

                delay_1ms(10);       //按键去抖动

                if(K9==0)

                {

                        flag_en ++;

                        flag_i = 0;

                        if(flag_en > 3)

                        {

                                flag_en = 0;    

                                TR0 = 0;

                        }     

                        while(!K9)

                        {

                        }//使蜂鸣器发出相应频率的声音;

                }

        }

}

/******************主程序**********************/   

void main()

{

        P0 = P1 = P2 = P3 = 0xff;

        TMOD=0x01;  EA=1; ET0=1;    //定时器0初始化

        while(1)

        {

                key();         //按键程序

                if(flag_en == 1)       //青花瓷

                {

                        m=music1[flag_i][0];n=music1[flag_i][1];      //放歌

                        P0 = smg_du[m % 8];       //显示

                        if(m==0x00)

                        {

                                TR0=0;

                                beep = 1;

                                delay(n);

                                flag_i++;

                        }

                        else if(m==0xFF)                           //放歌结束

                        {

                                TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}

                        else if(m==music1[flag_i+1][0])

                                {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }

                        else

                                {TR0=1;delay(n);flag_i++;}

                }

                else

                        beep = 1 ;

                if(flag_en == 2)       //生日歌

                {

                        m=music2[flag_i][0];n=music2[flag_i][1];      //放歌

                        P0 = smg_du[m % 8];       //显示

                        if(m==0x00)

                        {

                                TR0=0;

                                beep = 1;

                                delay(n);

                                flag_i++;

                        }

                        else if(m==0xFF)                           //放歌结束

                        {

                                TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}

                        else if(m==music2[flag_i+1][0])

                                {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }

                        else

                                {TR0=1;delay(n);flag_i++;}

                }

                else

                        beep = 1 ;

                if(flag_en == 3)       //爱情买卖

                {

                        m=music3[flag_i][0];n=music3[flag_i][1];      //放歌

                        P0 = smg_du[m % 8];       //显示

                        if(m==0x00)

                        {

                                TR0=0;

                                beep = 1;

                                delay(n);

                                flag_i++;

                        }

                        else if(m==0xFF)                           //放歌结束

                        {

                                TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}

                        else if(m==music3[flag_i+1][0])

                                {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }

                        else

                                {TR0=1;delay(n);flag_i++;}

                }

                else

                        beep = 1 ;

        }

}

/*****************定时器0中断*********************/   

void T0_int() interrupt 1

{

        beep=!beep;

        TH0=T[m][0];

        TL0=T[m][1];

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值