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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求指導:51單片機怎么用PWM控制蜂鳴器放歌?

[復制鏈接]
跳轉到指定樓層
樓主
ID:566584 發表于 2020-6-13 21:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
對著自己的有源蜂鳴器拿程序研究半天,才知道有源音調改不了頭都大了
PWM控制調節占空比可以設置音量大小,調節頻率可以調節音調
用延時函數模擬PWM來做比較好?還是通過配置定時器中斷,利用中斷函數進行PWM輸出波形的切換?
又怎么包裝函數讓波形自動變化放歌呢?

希望大佬們能給我講講(最好對著程序講),謝謝


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

使用道具 舉報

沙發
ID:491577 發表于 2020-6-13 23:14 | 只看該作者
有源蜂鳴器只能夠發出固定的聲音,要播放音樂需要使用無源蜂鳴器。不需要用到PWM功能,用定時器就可以了。給你一個參考程序:
/************************************************************************  
[文件名]  C51音樂程序(八月桂花)  
[功能]    通過單片機演奏音樂  
  
/**********************************************************************/   
#include <REG52.H>   
#include <INTRINS.H>   
//本例采用89C52, 晶振為12MHZ   
//關于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.   
//頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;   
//所以拿出譜子, 試探編吧!   

sbit Beep =  P1^5;
   
unsigned char n=0;  //n為節拍常數變量   
unsigned char code music_tab[] ={   
0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數, 節拍常數, 頻率常數, 節拍常數,   
0x20, 0x40, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x10,   
0x1C, 0x10, 0x18 , 0x40,   
0x1C, 0x20, 0x20 , 0x20,   
0x1C, 0x20, 0x18 , 0x20,   
0x20, 0x80, 0xFF , 0x20,   
0x30, 0x1C, 0x10 , 0x18,   
0x20, 0x15, 0x20 , 0x1C,   
0x20, 0x20, 0x20 , 0x26,   
0x40, 0x20, 0x20 , 0x2B,   
0x20, 0x26, 0x20 , 0x20,   
0x20, 0x30, 0x80 , 0xFF,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x80,   
0x20, 0x30, 0x1C , 0x10,   
0x20, 0x10, 0x1C , 0x10,   
0x20, 0x20, 0x26 , 0x20,   
0x2B, 0x20, 0x30 , 0x20,   
0x2B, 0x40, 0x20 , 0x15,   
0x1F, 0x05, 0x20 , 0x10,   
0x1C, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x30,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x40, 0x1C , 0x20,   
0x20, 0x20, 0x26 , 0x40,   
0x13, 0x60, 0x18 , 0x20,   
0x15, 0x40, 0x13 , 0x40,   
0x18, 0x80, 0x00   
};   
   
void int0()  interrupt 1   //采用中斷0 控制節拍   
{  TH0=0xd8;   
   TL0=0xef;   
   n--;   
}   
   
void delay (unsigned char m)   //控制頻率延時   
{   
unsigned i=3*m;   
while(--i);   
}   
   
void delayms(unsigned char a)  //豪秒延時子程序   
{   
  while(--a);                  //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結果就知道了!   
}   
   
void main()   
{ unsigned char p,m;   //m為頻率常數變量   
  unsigned char i=0;   
  TMOD&=0x0f;   
  TMOD|=0x01;   
  TH0=0xd8;TL0=0xef;   
  IE=0x82;   
play:   
   while(1)   
    {   
    a: p=music_tab[i];   
       if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到結束符,延時1秒,回到開始再來一遍   
       else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延時100ms,繼續取下一音符   
            else         {m=music_tab[i++], n=music_tab[i++];}  //取頻率常數 和 節拍常數   
             TR0=1;                                             //開定時器1   
           while(n!=0) Beep=~Beep,delay(m);                         //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)   
       TR0=0;                                             //關定時器1   
    }   
}  
回復

使用道具 舉報

板凳
ID:491577 發表于 2020-6-13 23:27 | 只看該作者
再發一個詳細一點的:
SoundPlay.h文件:
/**************************************************************************
   
                                             SOUND PLAY FOR 51MCU
  
                               COPYRIGHT (c)   2005 BY JJJ.
                                       --  ALL RIGHTS RESERVED  --
  
   File Name:       SoundPlay.h
   Author:          Jiang Jian Jun
   Created:         2005/5/16
   Modified:                NO
   Revision:                 1.0
  
*******************************************************************************/

/*說明**************************************************************************
曲譜存貯格式 unsigned char code MusicName{音高,音長,音高,音長...., 0,0};        末尾:0,0 表示結束(Important)

音高由三位數字組成:
                個位是表示 1~7 這七個音符
                十位是表示音符所在的音區:1-低音,2-中音,3-高音;
                百位表示這個音符是否要升半音: 0-不升,1-升半音。

音長最多由三位數字組成:
                個位表示音符的時值,其對應關系是:
                        |數值(n):  |0 |1 |2 |3 | 4 | 5 | 6
                        |幾分音符: |1 |2 |4 |8 |16 |32 |64                 音符=2^n
                十位表示音符的演奏效果(0-2):  0-普通,1-連音,2-頓音
                百位是符點位: 0-無符點,1-有符點

調用演奏子程序的格式
                Play(樂曲名,調號,升降八度,演奏速度);
        |樂曲名           : 要播放的樂曲指針,結尾以(0,0)結束;
        |調號(0-11)       :        是指樂曲升多少個半音演奏;
        |升降八度(1-3)          : 1:降八度, 2:不升不降, 3:升八度;
        |演奏速度(1-12000):        值越大速度越快;

***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__

//**************************************************************************
#include"music.h"

#define SYSTEM_OSC                 12000000        //定義晶振頻率12000000HZ
#define SOUND_SPACE         4/5                 //定義普通音符演奏的長度分率,//每4分音符間隔
sbit    BeepIO    =           P1^5;                //定義輸出管腳
unsigned char value=0;
unsigned int  code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始頻率表
unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 };                                                                   //1~7在頻率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };                                               
unsigned char Sound_Temp_TH0,Sound_Temp_TL0;        //音符定時器初值暫存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1;        //音長定時器初值暫存
//**************************************************************************
void InitialSound(void)
{
        BeepIO = 0;
        Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;        // 計算TL1應裝入的初值         (10ms的初裝值)
        Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;        // 計算TH1應裝入的初值
        TH1 = Sound_Temp_TH1;
        TL1 = Sound_Temp_TL1;
        TMOD  |= 0x11;
        ET0    = 1;
        ET1           = 0;
        TR0           = 0;
        TR1    = 0;
        EA     = 1;
}

void BeepTimer0(void) interrupt 1        //音符發生中斷
{
        static unsigned char i;
        BeepIO = !BeepIO;
        TH0    = Sound_Temp_TH0;
        TL0    = Sound_Temp_TL0;
        i++;
        if(i==100)
        {
                i=0;
                value++;
                if(value==5)value=0;
        }

}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
        unsigned int NewFreTab[12];                //新的頻率表
        unsigned char i,j;
        unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
        unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
        for(i=0;i<12;i++)                                 // 根據調號及升降八度來生成新的頻率表
        {
                j = i + Signature;
                if(j > 11)
                {
                        j = j-12;
                        NewFreTab[i] = FreTab[j]*2;
                }
                else
                        NewFreTab[i] = FreTab[j];

                if(Octachord == 1)
                        NewFreTab[i]>>=2;
                else if(Octachord == 3)
                        NewFreTab[i]<<=2;
        }                                                                       
       
        SoundLength = 0;
        while(Sound[SoundLength] != 0x00)        //計算歌曲長度
        {
                SoundLength+=2;
        }

        Point = 0;
        Tone   = Sound[Point];       
        Length = Sound[Point+1];                         // 讀出第一個音符和它時時值
       
        LDiv0 = 12000/Speed;                                // 算出1分音符的長度(幾個10ms)        
        LDiv4 = LDiv0/4;                                         // 算出4分音符的長度
        LDiv4 = LDiv4-LDiv4*SOUND_SPACE;         // 普通音最長間隔標準
        TR0          = 0;
        TR1   = 1;
        while(Point < SoundLength)
        {
                SL=Tone%10;                                                                 //計算出音符
                SM=Tone/10%10;                                                                 //計算出高低音
                SH=Tone/100;                                                                 //計算出是否升半
                CurrentFre = NewFreTab[SignTab[SL-1]+SH];         //查出對應音符的頻率        
                if(SL!=0)
                {
                        if (SM==1) CurrentFre >>= 2;                 //低音
                        if (SM==3) CurrentFre <<= 2;                 //高音
                        Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計算計數器初值
                        Sound_Temp_TH0 = Temp_T/256;
                        Sound_Temp_TL0 = Temp_T%256;
                        TH0 = Sound_Temp_TH0;  
                        TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償
                }
                SLen=LengthTab[Length%10];         //算出是幾分音符
                XG=Length/10%10;                         //算出音符類型(0普通1連音2頓音)
                FD=Length/100;
                LDiv=LDiv0/SLen;                         //算出連音音符演奏的長度(多少個10ms)
                if (FD==1)
                        LDiv=LDiv+LDiv/2;
                if(XG!=1)       
                        if(XG==0)                                 //算出普通音符的演奏長度
                                if (SLen<=4)       
                                        LDiv1=LDiv-LDiv4;
                                else
                                        LDiv1=LDiv*SOUND_SPACE;
                        else
                                LDiv1=LDiv/2;                 //算出頓音的演奏長度
                else
                        LDiv1=LDiv;
                if(SL==0) LDiv1=0;
                        LDiv2=LDiv-LDiv1;                 //算出不發音的長度
                  if (SL!=0)
                {
                        TR0=1;
                        for(i=LDiv1;i>0;i--)         //發規定長度的音
                        {
                                while(TF1==0);
                                TH1 = Sound_Temp_TH1;
                                TL1 = Sound_Temp_TL1;
                                TF1=0;
                        }
                }
                if(LDiv2!=0)
                {
                        TR0=0; BeepIO=0;
                        for(i=LDiv2;i>0;i--)         //音符間的間隔
                        {
                                while(TF1==0);
                                TH1 = Sound_Temp_TH1;
                                TL1 = Sound_Temp_TL1;
                                TF1=0;
                        }
                }
                Point+=2;
                Tone=Sound[Point];
                Length=Sound[Point+1];
        }
        BeepIO = 0;
}
//**************************************************************************
#endif

main.c文件:

#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include "SoundPlay.h"
#include"music.h"

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;



void Delay1ms(unsigned int count)
{
        unsigned int i,j;
        for(i=0;i<count;i++)
        for(j=0;j<120;j++);
}

void main()
{
        InitialSound();
        while(1)
        {
                Play(Music_Girl,0,3,360);
               
                Delay1ms(500);
                Play(Music_Same,0,3,360);
                Delay1ms(500);
                Play(Music_Two,0,3,360);
                Delay1ms(500);
        }
}

music.h文件:
#ifndef __MUSIC_H__
#define __MUSIC_H__
//*****************************Music******************************************************
//揮著翅膀的女孩
unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
                                  0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
                                  0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
                                  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
                                  0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
                                  0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
                                  0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
                                  0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
                                  0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
                                  0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
                                  0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
                                  0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
                                  0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
                                  0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
                                  0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
                                  0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
                                  0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
                                  0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
                                  0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};
//同一首歌
const unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
                                  0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
                                  0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
                                  0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
                                  0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
                                  0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
                                  0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
                                  0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
                                  0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
                                  0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
                                  0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
                                  0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
                                  0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
                                  0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
                                  0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
                                  0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
                                  0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
                                  0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
                                  0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
                                  0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
                                  0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
                                  0x00,0x00 };
//兩只蝴蝶                                 
const unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
                                  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
                                  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
                                  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
                                  0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
                                  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
                                  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
                                  0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
                                  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
                                  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
                                  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
                                  0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
                                  0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
                                  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
                                  0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
                                  0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
                                  0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
                                  0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
                                  0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
                                  0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
                                  0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
                                  0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
                                  0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
                                  0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
                                  0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
                                  0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
                                  0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
                                  0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
                                  0x10,0x03, 0x15,0x00, 0x00,0x00 };
//***********************************************************************************
#endif

音樂播放器.zip

25.44 KB, 下載次數: 14

評分

參與人數 1黑幣 +5 收起 理由
浮一音 + 5 謝謝你,但我是想要用PWM實現、、

查看全部評分

回復

使用道具 舉報

地板
ID:67199 發表于 2020-6-14 22:48 | 只看該作者
幾年前玩翻頁鐘時,用STC60S2的PCA弄過,無源蜂鳴器當音樂鬧鈴

if(music_star)       //音樂啟動
      {jiepai=1;           //賦初值
       music_a=*music_p;   //節拍速度
       music_b=1;          //
       music_star=0;
      
       music_f=1;          //音樂播放啟動
      }
         
   if(music_f)    //音樂標志為1,放音樂
     {music_b--;          //節拍計時
   if(music_b==0)        //四分之一音節到,計時后一個四分之一音節   
    {music_b=music_a;
     jiepai--;        //節拍減一
     if(jiepai)       //判斷音節演奏完否
      {return;}          //未完成返回繼續演奏
     else            // 完成后取下一個音樂頻率
  {                      //計時復位
    CR=0;
    jiepai=*(++music_p)&0x0F ; //提取節拍, 以48MHZ為基準,
    if(jiepai==0)    //節拍為零,表示整首音樂演奏完畢,進行初值回位
    { CR=0;
            music_f=0;
   
     }
   else
   {yindiao=*music_p>>4;      //提取音調后,指針指向下一音節
   if(yindiao)              //音調不為零,由發聲,音調地址=(n-1)*2=2n-2
  { yindiao=yindiao<<1;      //音調代碼乘2
      CCAP0L =TABLE[yindiao+1]; //                        
      CCAP0H =TABLE[yindiao]; ; //裝載比較初值                     
    CR=1;
   }

原程序太大,如感興趣私發給你,自行參考。好久沒玩了,自己都整不太明白了...........

評分

參與人數 1黑幣 +5 收起 理由
浮一音 + 5 謝謝你,不過我是個小白看不太懂QAQ

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热免费视频在线观看 | 祝你幸福电影在线观看 | 久久久久亚洲精品 | 国产精品国产三级国产aⅴ原创 | 午夜影院普通用户体验区 | 国产精品综合久久 | 国产免费看 | 99精品福利视频 | 日韩欧美中文 | 欧美一级在线 | 精品欧美色视频网站在线观看 | 在线āv视频 | 国产成人精品一区二区三区在线 | 黄视频免费 | a级免费黄色片 | 91成人在线| 午夜精品久久久久久久99黑人 | 久久久国产网站 | 自拍第一页 | 久久久久久九九九九九九 | 欧美精品综合在线 | 国产激情偷乱视频一区二区三区 | 国产一区999| 成人欧美一区二区三区 | 日日操日日干 | 久久国产精品视频免费看 | 黄免费观看 | 911精品美国片911久久久 | 在线观看国产视频 | 免费观看av网站 | 中文字幕一区二区三区乱码图片 | 国产 日韩 欧美 制服 另类 | 欧美精品在线一区二区三区 | a视频在线观看 | 成人精品一区亚洲午夜久久久 | 欧美精品一区在线发布 | 亚洲一区二区三区视频在线 | 亚洲激情自拍偷拍 | aa级毛片毛片免费观看久 | 国产成人啪免费观看软件 | 日韩视频在线播放 |