找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2171|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

求解答紅字部分的單片機(jī)源程序

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 1 黑幣 回復(fù)本帖可獲得 1 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:348746 發(fā)表于 2018-6-10 22:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0;                         //播放和停止鍵
sbit SPK=P3^7;                       //蜂鳴器
uchar Song_Index=0,Tone_Index=0;     //當(dāng)前音樂(lè)段索引,音符索引
//數(shù)碼管段碼表
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//標(biāo)準(zhǔn)音符頻率對(duì)應(yīng)的延時(shí)表
uchar codeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};
uchar codeLO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};
//三段音樂(lè)的音符
uchar code Song[][50]=
{
        {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},
        {3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},
        {3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}
};
//三段音樂(lè)的節(jié)拍
uchar code Len[][50]=
{
        {1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},
        {1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},
        {1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}
};
//外部中斷0
void EX0_INT() interrupt 0
{
        TR0=0;   //播放結(jié)束或者播放中途切換歌曲時(shí)停止播放
        Song_Index=(Song_Index+1)%3; //跳到下一首的開(kāi)頭
        Tone_Index=0;
        P2=DSY_CODE[Song_Index];            //數(shù)碼管顯示當(dāng)前音樂(lè)段號(hào)
}
//定時(shí)器0中斷函數(shù)
void T0_INT() interrupt 1
{
       TL0=LO_LIST[Song[Song_Index][Tone_Index]];
        TH0=HI_LIST[Song[Song_Index][Tone_Index]];
        SPK=~SPK;
}
//延時(shí)
void DelayMS(uint ms)
{
        uchart;
        while(ms--)for(t=0;t<120;t++);
}
//主程序
void main()
{
        P2=0xc0;
        SPK=0;
        TMOD=0x00;                          //T0方式0
       IE=0x83;
        IT0=1;
        IP=0x02;
        while(1)
        {
                 while(K1==1);                //未按鍵等待
                 while(K1==0);                //等待釋放
                 TR0=1;                             //開(kāi)始播放
                 Tone_Index=0;                //從第0個(gè)音符開(kāi)始
                 //播放過(guò)程中按下K1可提前停止播放(K1=0)。
                 //若切換音樂(lè)段會(huì)觸發(fā)外部中斷,導(dǎo)致TR0=0,播放也會(huì)停止
                 while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1)
                 {
                         DelayMS(300*Len[Song_Index][Tone_Index]);   //播放延時(shí)(節(jié)拍)
                         Tone_Index++;                //當(dāng)前音樂(lè)段的下一音符索引
                 }
                 TR0=0;                    //停止播放
                 while(K1==0);        //若提前停止播放,按鍵未釋放時(shí)等待
        }
}


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

使用道具 舉報(bào)

沙發(fā)
ID:320306 發(fā)表于 2018-6-11 13:05 | 只看該作者
這些就是延時(shí)時(shí)間啊,通過(guò)不同的時(shí)間模擬不同的音符。。。。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:296837 發(fā)表于 2018-6-11 17:29 | 只看該作者
TL0=LO_LIST[Song[Song_Index][Tone_Index]];         TH0=HI_LIST[Song[Song_Index][Tone_Index]];就這個(gè)需要解釋,但是我不想解釋,,其他的都是延時(shí)用的。仔細(xì)看程序。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表