久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1971|回復: 1
打印 上一主題 下一主題
收起左側

求單片機音樂彩燈怎么加入按鍵奏樂程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:339722 發表于 2018-5-28 16:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
原程序如下
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit duan=P2^6;
sbit key1=P3^2;//按key1可切換花樣
sbit key2=P3^3;//按key2可切換歌曲
sbit fm=P3^7;//蜂鳴器連續的IO口
sbit P34=P3^4;//矩陣鍵盤的一列
uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
                                                0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花樣1
uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,
                                                0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花樣2
uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,
                                                0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
char code huayang4[]={ 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};
uchar count1;//花樣標志       
uchar count2;//歌曲標志       
uchar timeh,timel,i;
//================簡譜====================
//編程規則:字節高位是簡譜,低位是持續時間,
//代表多少個十六分音符
//1-7代表中央C調,8-E代表高八度,0代表停頓
//最后的0是結束標志
uchar code lzlh[]={         //兩只老虎
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         //歌曲結束標志
};
uchar code sb[]={ //送別
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
};
uchar code mlh[]={ //茉莉花
0x31,0x21,0x31,0x51,0x61,0x51,0x81,0x61,
        0x51,0x31,0x54,0x62,0x82,0x91,0x81,0x58,
                0x51,0x31,0x54,0x62,0x82,0x91,0xA1,0x91,
                0x61,0x52,0x52,0x22,0x31,0x51,0x31,0x21,0x11,0xD1,0x16,
                0x31,0x21,0x12,0x23,0x31,0x52,0x61,0x81,
                0x62,0x52,0x51,0x31,0x22,
                0x31,0x51,0x31,0x21,0x11,0x21,0xD4,0x12,
                0x23,0x31,0x11,0xD1,0x11,0xD1,0xC6,
                0x31,0x21,0x12,0x23,0x31,0x52,0x61,0x81,
                0x62,0x52,0x51,0x31,0x22,
                0x31,0x51,0x31,0x21,0x11,0x21,0xD4,0x12,
                0x23,0x31,0x11,0xD1,0x11,0xD1,0xC6,
                0xFF
};
uchar code xxx[]={ //小星星
0x12,0x12,0x52,0x52,0x62,0x62,0x54,0x42,
        0x42,0x32,0x32,0x22,0x21,0x14,
                0x52,0x52,0x42,0x42,0x32,0x32,0x24,0x52,
                0x52,0x42,0x42,0x32,0x32,0x24,
                0x12,0x12,0x52,0x52,0x62,0x62,0x64,0x42,
                0x32,0x32,0x22,0x22,0x14,
                0xFF
};
//==============簡譜音調對應的定時器初值=======
//適合11.0592M的晶振
uchar code cuzhi[]={
         0xff,0xff,//占位
         0xFC,0x8E,//中央C調1-7
         0xFC,0xED,       
         0xFD,0x43,       
         0xFD,0x6A,       
         0xFD,0xB3,       
         0xFD,0xF3,       
         0xFE,0x2D,
         0xFE,0x47,        //高八度1-7          
         0xFE,0x76,
         0xFE,0xA1,
         0xFE,0xC7,       
         0xFE,0xD9,
         0xFE,0xF9,
         0xFF,0x16
         };
uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
//將音調轉化為對應的LED樣式
void delay1(uint z);        //延時1MS
void delay(uint z);        //延時165MS,即十六分音符
void song();
main()
{        uchar x;
        count1=0;//流水燈無花樣
        count2=1;//唱第一首歌
        P34=0;//選取矩陣鍵盤的一列
        EA=1;//開總中斷
        EX0=1;//開外部中斷0
        IT0=1;//外部中斷0下降沿觸發方式
        EX1=1;//開外部中斷1
        IT1=1;//外部中斷1下降沿觸發方式

        TMOD=0x01;//定時器0工作在方式1
        TH0=0;
        TL0=0;
        ET0=1;
       
        while(1)
        {
                if(count1!=0)
                {
                        switch(count1)
                        {
                                case 1:
                                        for(x=0;x<14;x++)
                                        {
                                                duan=1;
                                                P2=huayang1[x];
                                                fm=1;
                                                delay1(300);
                                                duan=0;
                                                if(count1!=1)
                                                        break;       
                                        }
                                break;
                                case 2:
                                        for(x=0;x<14;x++)
                                        {
                                                duan=1;
                                                P2=huayang2[x];
                                                fm=1;
                                                delay1(300);
                                                duan=0;
                                                if(count1!=2)
                                                        break;       
                                        }
                                break;
                                case 3:
                                        for(x=0;x<16;x++)
                                        {
                                                duan=1;
                                                P2=huayang3[x];
                                                fm=1;
                                                delay1(300);
                                                duan=0;
                                                if(count1!=3)
                                                        break;       
                                        }
                                break;
                                case 4:
                                        for(x=0;x<8;x++)
                                        {
                                                duan=1;
                                                P2=huayang4[x];
                                                fm=1;
                                                delay1(300);
                                                duan=0;
                                                if(count1!=4)
                                                        break;       
                                        }
                                break;
                        }
                }
                else
                {
                        song();
                        delay1(1000);
                }
        }
                                
}
void int0() interrupt 0
{
        EA=0;//關總中斷
        delay1(1);//去抖
        if(key1==0)
        {
                count2=0;//不讓蜂鳴器唱歌
                TR0=0;
                count1++;
                if(count1==5)
                         count1=1;

        }
        EA=1;//開總中斷
}
void int1() interrupt 2
{
        EA=0;//關總中斷
        delay1(1);//去抖
        if(key2==0)
        {
                count1=0;//流水燈無花樣
                TR0=1;
                i=0;//從頭開始唱
                count2++;
                if(count2==3)
                         count2=1;

        }
        EA=1;//開總中斷
}
void timer0() interrupt 1         //用于產生各種音調
{
        TH0=timeh;
        TL0=timel;
        fm=~fm;
}
void song()
{
        uint temp;
        uchar jp;//jp是簡譜
        i=0;
        while(1)
        {        if(count2==0)
                {       
                        break;
                }
                if(count2==1)        //選曲
                         temp=lzlh[i];
                if(count2==2)
                        temp=sb[i];
                if(count2==2)
                    temp=mlh[i];
                if(count2==3)
                    temp=xxx[i];
                if(temp==0xff)
                        break;
                       
                jp=temp/16; //取數的高4位
                duan=1;
                P2=yinyue[jp];
                duan=0;
                if(jp!=0)
                {
                timeh=cuzhi[jp*2];
                timel=cuzhi[jp*2+1];
                }
                else
                {
                TR0=0;
                fm=1;//關蜂鳴器
                }
                delay(temp%16); //取數的低4位
                TR0=0;         //唱完一個音停10MS
                fm=1;
                delay1(10);
                TR0=1;
                i++;
        }
        TR0=0;
        fm=1;
       
}
void delay(uint z)        //延時165MS,即十六分音符
{        uint x,y;
        for(x=z;x>0;x--)
                 for(y=19000;y>0;y--);
}

void delay1(uint z)        //延時1MS
{        uint x,y;
        for(x=z;x>0;x--)
                 for(y=112;y>0;y--);
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜臀网| 亚洲草草视频 | 中文字幕综合 | 亚洲精品视频免费观看 | 久久久久国产精品一区 | 在线观看免费av网 | 国产视频中文字幕 | 久操福利| av一区二区三区四区 | 日韩一区中文字幕 | 日日日色 | 久久不射电影网 | 久在线| 天天操人人干 | 精品国产精品三级精品av网址 | 在线免费国产 | 日韩在线视频一区二区三区 | 国产精品黄色 | 亚洲一区二区三区免费在线 | 日韩欧美亚洲 | 久久涩涩 | 亚洲bt 欧美bt 日本bt | 精品一区二区三区中文字幕 | 在线看av的网址 | 国产免费又黄又爽又刺激蜜月al | 亚洲精品一区中文字幕乱码 | 国产精品成人一区二区三区 | 天天综合成人网 | 国产一区三区在线 | 日韩中文在线 | 午夜电影网 | 久久久91精品国产一区二区三区 | 国产精品日产欧美久久久久 | 国产一区2区 | 欧美黑人一区二区三区 | 久久亚洲欧美日韩精品专区 | 国产成人啪免费观看软件 | 国产亚洲www | 中文字幕在线观看国产 | 亚洲一区二区三区视频 | 国产成人综合在线 |