欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于STC89C52RC的音樂盒

[復制鏈接]
跳轉到指定樓層
樓主

代碼

#include<reg52.h>

sbit BUZZER=P2^0;
unsigned char th,tl;
unsigned char flag1,flag2;
char code table[]={
0xc0,0xf9,0xa4,0xb0
/*,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e*/
};
unsigned int TONE[14]={1012,956,852,759,716,638,568,506,478,426,379,1276,1136,1433};
unsigned char code SONG[4][150]={
{5,5,5,5,3,4,5,8,6,6,6,6,8,6,5,5,5,5,5,5,7,6,4,4,4,4,4,4,4,3,2,1,1,8,8,8,8,5,3,8,
8,10,9,9,9,9,8,7,6,6,7,7,7,7,7,8,9,5,7,7,8,9,8,7,8,8,20},
{5,8,6,8,5,3,5,2,3,5,3,5,6,8,5,6,5,3,5,1,3,2,3,2,1,2,3,6,5,3,5,6,5,8,6,5,3,5,2,5,2,
3,2,1,20},
{3,5,8,6,5,3,5,6,8,5,8,10,9,8,9,8,6,8,5,3,5,6,5,6,8,9,5,6,3,2,1,2,2,2,3,5,5,8,2,3,
5,3,5,8,6,5,3,5,6,8,5,8,10,9,8,9,8,6,8,5,3,5,6,5,6,8,9,5,6,3,8,6,5,3,2,1,2,2,3,5,8,10,9,8,9,8,5,6,8,20},
{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,11,1,2,11,1,20}
};
unsigned char code BEAT[4][150]={
{4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,8,4,4,4,4,4,2,8,8,4,4,4,4,4,4,8,4,8,4,
4,4,4,2,4,8,8,4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,8},
{8,8,4,4,8,4,4,4,4,8,4,4,4,4,4,4,4,4,4,8,4,8,4,4,4,4,16,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,16},
{4,4,4,4,16,4,4,4,4,16,8,4,8,8,4,4,4,4,16,8,4,8,4,4,8,4,4,16,4,4,8,16,8,4,4,8,8,8,4,4,16,4,4,4,4,16,
4,4,4,4,16,8,4,8,8,4,4,4,4,16,8,4,8,4,4,8,4,4,16,8,4,8,8,4,4,8,16,8,4,16,8,4,8,8,4,4,4,4,16},
{4,4,4,4,4,4,4,4,4,4,8,4,4,8,2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8}
};

void SET_BUZZER_TONE(unsigned int tone)
{
TR0=0;
//關閉定時器0
//TH0=(65536-tone)/256;
//TL0=(65536-tone)%256;
th=(65536-tone)/256;
tl=(65536-tone)%256;
TR0=1 ;
//開啟定時器0
}

void DELAY_MIN_BEAT (unsigned char x)
{
unsigned int i,j,k;
for (i=0;i<x;i++)
    {
    for(j=0;j<100;j++)
    for(k=0;k<120;k++);
    }
TR0=0;//關閉定時器0
}

void TIME0_INIT()
{
IE|=0x82; //1000_0010開啟總中斷并開啟定時器0
TMOD=0x01;//定時器О工作在方式1
IP=0x02;
//定時器0具有最高優先級
}

void INT_INIT(){
IE|=0x85;//1000_0101開啟總中斷并開啟外部中斷0,1
TCON|=0x05;//外部中斷0和1負邊緣觸發
}

void display(char a)
{
P0=table[a];
}

void main()
{
    char num1,num2;
    unsigned char flag0;
    num1=0;//對應遞增按鈕,即外部中斷О
    num2=0;//對應遞減按鈕,即外部中斷1
    flag0=1;//定時器TO中斷標志位
    flag1=0;//遞增中斷標志位
    flag2=0;//遞減中斷標志位
        BUZZER=0;
    TIME0_INIT();//定時器初始化
    INT_INIT();//外部中斷初始化
    while(1)
    {
    display(num1);
        while(flag0)
        //定時器TO中斷標志位
        {
            if(SONG[num1][num2]==20) flag0=0;
            //如果檢測到最后一個音調為20,說明此曲應該結束
            else
            {
                if(flag1==1)
                //中斷檢測
                {
                    num1++;
                    if(num1>3) num1=0;
                    num2=0;
                    flag1=0;
                    display(num1);
                }
                if(flag2==1)
                //中斷檢測
                {
                    num1--;
                    if(num1<0) num1=3 ;num2=0;
                    flag2=0;
                    display(num1);
                }
                SET_BUZZER_TONE(TONE[SONG[num1][num2]]);//音調
                                DELAY_MIN_BEAT(BEAT[num1][num2]) ;//節拍
                num2++;
            }
        }
        num2=0;
        flag0=1;
        num1++;
    if(num1==4) num1=0;
    }
}
void T0_TONE(void) interrupt 1
{
TH0=th;
TL0=tl ;
BUZZER=~BUZZER;
}
void INT0_SELECT(void) interrupt 0{
flag1=1;
}
void INT1_SELECT(void) interrupt 2{
flag2=1;
}



51黑論壇_單片機音樂盒.zip

1.2 MB, 下載次數: 20, 下載積分: 黑幣 -5

BY-CDUT-ZSLOO

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表