×
单片机 > 单片机程序设计 > 详情

基于51单片机8音键电子琴DIY制作

发布时间:2020-08-21 发布时间:
|


单片机源程序如下:

/**************************************************************

程序名称:模拟电子琴

**************************************************************/ 

#include                                     //定义头文件

#define uchar unsigned char                        //宏定义

#define led P0                                        //定义LED等位P0口

#define sw_port P1                                //中间变量。。。使按键和led对应

sbit buzzer=P2^7;                                //扬声器管脚

sbit key1=P3^2;                                        //播放音乐与弹奏歌曲转换

sbit key3=P3^4;                                        //掉电存储按键

sbit key4=P3^5;                 //播放掉电存储的歌曲                                         

sbit keybofang=P3^3;                        //播放刚才弹奏的歌曲

sbit key7=P3^0;                                        //音调键。。。 和  歌曲键

sbit key8=P3^1;                                        //音调键。。。 和  歌曲键

sbit key6=P1^7;

sbit key5=P1^6;                                   

sbit sda=P1^1;                                              //24c02数据线  

sbit scl=P1^0;                                        //24c02时钟线

uchar keyd,i,keys,b;                                  //定义变量

uchar tone_H;                                        //定义变量

uchar tone_L;                                        //定义变量

void beat_125(unsigned char);                        //声明函数

uchar code beat1[]={16,8,8,8,8,4,4,16,8,4,4,8,4,4,4,        //歌曲1节拍 

4,4,4,16,16,8,8,4,4,12,8,16,16,8,4,4,4,4,16};

uchar code song1[]={6,5,3,5,7,6,5,6,3,5,6,5,3,                //歌曲1简谱

2,1,6,5,3,2,2,3,5,5,6,3,2,1,5,3,2,1,6,1,1,15};


uchar code beat2[]={7,7,7, 7,8,9, 1,2,3, 6,2,4, 4,4,4, 12,         //歌曲二节拍

8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};

uchar code song2[]={1,2,8, 8,5,1, 3,3,3, 5,4,3,                //歌曲二简谱

5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1,15};


uchar code beat4[]={4,4,4, 6,2,4, 4,4,4, 6,2,4, 4,4,4, 12, 

8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};

uchar code song4[]={1,1,1, 3,2,1, 3,3,3, 5,4,3,

5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1, 15};


uchar code tone[]={115,102,91,86,77,68,61,57};                //歌曲音调

unsigned int code tone1[]={1012,956,852,759,716,638,568,506,478,426,379,531,10}; //歌曲音调

uchar song3[43];                                              //定义空数组

void play(uchar*,uchar*);                                  //演奏歌曲函数

void delay8um(uchar);                                          //第一8um延时函数

void sound(uchar);                                        //弹奏发声函数

/*******************************************

函数功能:节拍的延时的基本单位,用于24c08简单延时

******************************************/                                         

void delay()                                                //简单延时函数

{;;}

/*******************************************

函数功能:节拍的延时的基本单位,延时1ms

******************************************/

void delay1ms(uchar x)                                          //1um延时函数

{

        uchar j;

        while(x--)

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

}

/**************************************************************

函数功能:24c02驱动程序      用IIC总线进行传输

**************************************************************/ 

void init_c02()                                                //24c02初始化

{

        sda=1;

        delay();

        scl=1;

        delay();

}

void start_c02()                                             //24c02的启动信号

{

        scl=1;

        delay();          

        sda=1;         

        delay();

        sda=0;

        delay();


}

void stop_c02()                                                   //24c02停止信号

{

        sda=0;

        delay();

        scl=1;

        delay();

        sda=1;

        delay();

}

void response_c02()                                        //24c02的应答信号

{

        uchar i;

        scl=1;

        delay();

        while((sda==1)&&(i<250))i++;

        scl=0;

        delay();

}

void write_c02byte(uchar date)                                    //对24c02写一个字节

{

        uchar i,temp;

        temp=date;

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

        {        

                temp=temp<<1;

                scl=0;

                delay();

                sda=CY;

                delay();

                scl=1;

                delay();

        }

        scl=0;

        delay();

        sda=1;

        delay();

}

uchar read_c02byte()                                        //对24c02读一个字节

{

         uchar i,k;

         scl=0;

         delay();

         sda=1;

         delay();

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

         {

                 scl=1;

                delay();

                k=(k<<1)|sda;

                scl=0;

                delay();

        }

        return k;

}

void write_addc02(uchar address,uchar date)                //对24c02写一个数据        

{

        start_c02();



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机数字温度计的课程设计