找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2139|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机电子琴程序

[复制链接]
跳转到指定楼层
楼主
ID:252574 发表于 2017-11-23 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
sbit BUZZ=P1^6;//蜂鸣器连续的IO口
unsigned char T1TH=0,T1TL=0;
unsigned char code song1[]={                  //两只老虎
    0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,
        0x34,0x44,0x58,0x34,0x44,0x58,
        0x53,0x61,0x53,0x41,0x34,0x14,
        0x53,0x61,0x53,0x41,0x34,0x14,
        0x14,0x54,0x18,
        0x14,0x54,0x18,
        0xFF          //歌曲结束标志
};
unsigned char code song2[]={                  //送别
    0x54,0x54,0x32,0x52,0x88,0x64,0x84,0x58,
        0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x04,0x04,
        0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
        0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
        0x64,0x84,0x88,0x74,0x62,0x72,0x88,
        0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x04,0x04,
        0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
        0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
        0xFF
};
unsigned char code cuzhi[]={
    0xFF,0xFF,                //                          low                mid             high
        0xFC,0x44,                //1      ##  5 6 7  1 2 3 4 5 6 7  1 2 3
        0xFC,0xAC,                //2                 ##         D C B  1 2 3 4 5 6 7  8 9 A
        0xFD,0x09,                //3
        0xFD,0x34,                //4
        0xFD,0x82,                //5
        0xFD,0xC8,                //6
        0xFE,0x06,                //7
        0xFE,0x2A,                //8 --high 1         N = 470;
        0xFE,0x48,                //9 --hign 2         N = 440;
        0xFE,0x66,      //A --hign 3         N = 410;
        0xFC,0x0C                //B---low  7         N = 1012
};        
void delay1ms(unsigned char z);        //延时1MS
void delay125ms(unsigned char z);        //延时165MS,即十六分音符
void sing();
main()
{
        EA=1;//开总中断
    TMOD=0x10;//定时器1工作在方式1
        TH1=0;
        TL1=0;
        ET1=1;
        while(1)
        {
                sing();
            delay1ms(1000);
        }
}

void sing()
{
    unsigned char temp;
        unsigned char jianpu;   
        unsigned int i = 0;
        static unsigned char thesong = 0;
        while(1)
        {        
                switch(thesong)
                {
                   case 0:temp = song1[i];break;
                   case 1:temp = song2[i];break;
                   default:break;
                }
                if(temp == 0xFF)
                  break;
                jianpu = (temp>>4); //取数的高4位
                if(jianpu != 0)                //不是休止符
                {
                  T1TH = cuzhi[jianpu*2];
                  T1TL = cuzhi[jianpu*2+1];
                }               //查表找初值
                else                        //jp = 0,休止符
                  { TR1 = 0;BUZZ = 1; }        //关蜂鸣器
                delay125ms( temp & 0x0F ); //取数的低4位
                TR1 = 0;         //唱完一个音停10MS
                BUZZ = 1;
                delay1ms(10);
                TR1 = 1;
                i++;
        }
        TR1 = 0;
        BUZZ = 1;
        thesong++;
        if(thesong >=2)
           thesong = 0;
}
void delay125ms(unsigned char z)        //延时165MS,即十六分音符
{        
    unsigned int x,y;
        for(x=z;x>0;x--)
                 for(y=15000;y>0;y--);
}

void delay1ms(unsigned char z)        //延时1MS
{        
    unsigned int x,y;
        for(x=z;x>0;x--)
                 for(y=112;y>0;y--);
}
void timer1() interrupt 3         //用于产生各种音调
{
        TH1=T1TH;
        TL1=T1TL;
    BUZZ = ~BUZZ;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表