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

標(biāo)題: 單片機(jī)音樂(lè)計(jì)時(shí)器Proteus仿真+代碼設(shè)計(jì)分享 [打印本頁(yè)]

作者: sfja    時(shí)間: 2019-6-20 15:53
標(biāo)題: 單片機(jī)音樂(lè)計(jì)時(shí)器Proteus仿真+代碼設(shè)計(jì)分享
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

要求通過(guò)4個(gè)按鍵來(lái)設(shè)置想要倒數(shù)的時(shí)間,其中系統(tǒng)默認(rèn)倒計(jì)時(shí)為1分鐘,K1可調(diào)整倒計(jì)時(shí)間1~60分鐘,K2可設(shè)置倒計(jì)時(shí)為5分鐘,K3可設(shè)置倒計(jì)時(shí)為15分鐘,K4可設(shè)置的倒計(jì)時(shí)為20分鐘,K5為啟動(dòng)鍵。當(dāng)初值被設(shè)定好,只要啟動(dòng)K5,就可以啟動(dòng)倒計(jì)時(shí)功能。當(dāng)計(jì)時(shí)為0時(shí)播放音樂(lè),而且它能循環(huán)播放,可隨時(shí)人為停止。
二. 方案原理
此次設(shè)計(jì)以89C52芯片為核心來(lái)設(shè)計(jì)音樂(lè)計(jì)時(shí)器,其具有倒數(shù)計(jì)時(shí)、時(shí)間設(shè)置、音樂(lè)演奏等功能。除了設(shè)定默認(rèn)值為1分鐘外,本計(jì)時(shí)器還有5分鐘,15分鐘和20分鐘的快捷鍵,而且可在上述時(shí)間的基礎(chǔ)上任意調(diào)整自己想設(shè)定的倒計(jì)時(shí)時(shí)間。當(dāng)?shù)褂?jì)時(shí)結(jié)束時(shí),計(jì)時(shí)器會(huì)播放音樂(lè),可循環(huán)播放,亦可隨時(shí)停止。
  這個(gè)音樂(lè)計(jì)時(shí)器由四個(gè)模塊組成,分別是數(shù)碼管模塊,倒計(jì)時(shí)模塊,音樂(lè)模塊和核心處理模塊。通過(guò)對(duì)P2口的查詢(xún),我們可以實(shí)現(xiàn)對(duì)時(shí)間的不同設(shè)定和調(diào)整。系統(tǒng)晶振為12MHz,RESET管腳處連接復(fù)位開(kāi)關(guān)。同時(shí),我們使用查詢(xún)方式來(lái)設(shè)定定時(shí)器時(shí)間。
三. 方案具體說(shuō)明
通過(guò)計(jì)算某一音頻周期(1/頻率),然后將此周期除以2,即為半周期的時(shí)間。利用單片機(jī)定時(shí)器計(jì)時(shí)這個(gè)半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O口反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O口反相,這樣就能在此I/O口上得到此頻率的脈沖,再結(jié)合中斷延時(shí)程序,程序中節(jié)拍控制是通過(guò)調(diào)用延時(shí)子程序DELAY的次數(shù)來(lái)實(shí)現(xiàn),產(chǎn)生音樂(lè)。利用P2.1、P2.2、P2.3管腳,對(duì)應(yīng)開(kāi)關(guān)K2、K3、K4,分別啟動(dòng)不同的倒計(jì)時(shí)程序5分鐘、15分鐘、20分鐘。通過(guò)查詢(xún)方式對(duì)P3.2管腳進(jìn)行查詢(xún),進(jìn)入1到60分鐘的時(shí)間調(diào)整程序。P0引腳作為顯示輸出連至LED顯示器,P1.0、P1.1、P1.2、P1.3為位選信號(hào),控制不同位的數(shù)碼管。程序中使用定時(shí)器T0方式1來(lái)產(chǎn)生歌譜中各音符對(duì)應(yīng)頻率的音頻脈沖,由P1.5通放大輸出,,1拍為748 ms。確定了設(shè)計(jì)思路后,就可以具體設(shè)計(jì)了。先編寫(xiě)程序,然后加入硬件進(jìn)行調(diào)試。
四. 模塊原理說(shuō)明
(一).數(shù)碼管模塊
     數(shù)碼管動(dòng)態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方式之一,動(dòng)態(tài)驅(qū)動(dòng)是將所有數(shù)碼管的8個(gè)顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨(dú)立的I/O線(xiàn)控制,當(dāng)單片機(jī)輸出字形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,但究竟是那個(gè)數(shù)碼管會(huì)顯示出字形,取決于單片機(jī)對(duì)位選通COM端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開(kāi),該位就顯示出字形,沒(méi)有選通的數(shù)碼管就不會(huì)亮。通過(guò)分時(shí)輪流控制各個(gè)數(shù)碼管的的COM端,就使各個(gè)數(shù)碼管輪流受控顯示,這就是動(dòng)態(tài)驅(qū)動(dòng)。在輪流顯示過(guò)程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為1~2ms,由于人的視覺(jué)暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位數(shù)碼管并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會(huì)有閃爍感,動(dòng)態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。
(二).倒計(jì)時(shí)模塊
     定時(shí)器倒計(jì)時(shí)部分用中斷來(lái)實(shí)現(xiàn)功能。定義定時(shí)器0,工作方式1,當(dāng)時(shí)間過(guò)去1s后,數(shù)碼管就按照設(shè)定規(guī)則顯示數(shù)字。
(三).音樂(lè)模塊
(1) 音樂(lè)的產(chǎn)生主要是通過(guò)單片機(jī)的I/O口輸出高低不同的脈沖信號(hào)來(lái)控制蜂鳴器發(fā)音。要想產(chǎn)生音頻脈沖信號(hào),需要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時(shí)間。利用單片機(jī)定時(shí)器計(jì)時(shí)這個(gè)半個(gè)周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O口反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O口反相,這樣就能在此I/O口上得到此頻率的脈沖。
通常,利用單片機(jī)的內(nèi)部定時(shí)器0,工作在方式1下,改變計(jì)數(shù)初值TH0和TL0來(lái)產(chǎn)生不同頻率。 對(duì)于音樂(lè)的節(jié)拍,每個(gè)音符使用1個(gè)字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍。如果1拍為0.4S,1/4拍為0.1S,只要設(shè)定延遲時(shí)間就可求得節(jié)拍的時(shí)間。假設(shè)1/4拍為1DELAY,那么1拍應(yīng)為4DELAY,以此類(lèi)推。所以只要求得1/4拍的DELAY,其余的節(jié)拍就是它的倍數(shù)。
總而言之,一首樂(lè)曲是由音階和節(jié)拍兩大要素構(gòu)成。一首樂(lè)曲演奏的原理是:不同音階分別對(duì)應(yīng)不同的頻率,發(fā)出不同的音調(diào),而節(jié)拍則控制發(fā)出音調(diào)時(shí)間的長(zhǎng)短;若將樂(lè)曲的音調(diào)連續(xù)發(fā)出,并使其按相應(yīng)的節(jié)拍變化,即可演奏一首樂(lè)曲。根據(jù)這一特點(diǎn),我們采用單片機(jī)輔以相應(yīng)的接口來(lái)設(shè)計(jì)音樂(lè)播放器。
(2)產(chǎn)生音樂(lè)通過(guò)單片機(jī)的I/O口輸出高低不同的脈沖信號(hào)來(lái)控制蜂鳴器發(fā)音。利用AT89C52單片機(jī)的內(nèi)部定時(shí)器0,工作在方式1下,改變計(jì)數(shù)初值TH0和TL0來(lái)產(chǎn)生不同的頻率。若單片機(jī)采用12MHz晶振,要產(chǎn)生頻率為587Hz的音頻脈沖時(shí),其音頻脈沖信號(hào)的周期T=1/587=1703.577us,約1704us,半周期的時(shí)間852us,因此只要今計(jì)數(shù)器計(jì)數(shù)=852us/1us=852,在每計(jì)數(shù)852次時(shí)將I/O口反相,就可得C調(diào)中音Re。  
計(jì)數(shù)脈沖值與頻率的關(guān)系如下:      
N=Fi/2/Fr 式中:N—計(jì)數(shù)值     
Fi—機(jī)器頻率。晶體振蕩器為12MHz時(shí),內(nèi)部計(jì)時(shí)一次為1us,故其頻率為1MHz      
Fr—想要產(chǎn)生的頻率  所以定時(shí)常數(shù)(計(jì)數(shù)值T)的求法:     T=65536-N=65536-Fi/2/Fr  例如,設(shè)Fi=1MHz,求低音Do(262Hz)、中音Do(523Hz)和高音Do(1046Hz)的計(jì)數(shù)初值。  
解:T=65536-N=65536-Fi/2/Fr=65536-500000/Fr      
低音Do的T=65536-500000/262=63628      
中音Do的T=65536-500000/523=64580      
高音Do的T=65536-500000/1046=65058
(四).核心處理模塊
    對(duì)計(jì)時(shí)器和中斷進(jìn)行初始化后,系統(tǒng)出現(xiàn)默認(rèn)時(shí)間設(shè)定值,也就是1分鐘。如果有按鍵按下,屏幕上面的時(shí)間會(huì)發(fā)生改變。K1可調(diào)整倒計(jì)時(shí)間1~60分鐘,K2可設(shè)置倒計(jì)時(shí)為5分鐘,K3可設(shè)置倒計(jì)時(shí)為15分鐘,K4可設(shè)置的倒計(jì)時(shí)為20分鐘。在時(shí)間設(shè)定完畢后,利用K5啟動(dòng)計(jì)時(shí)器,在計(jì)時(shí)結(jié)束后調(diào)用音樂(lè)函數(shù),SPEAKER就會(huì)播放出我們所設(shè)定的旋律。
五. 實(shí)驗(yàn)原理圖
六. 實(shí)驗(yàn)感悟
在本次設(shè)計(jì)中,我重新復(fù)習(xí)了中斷和計(jì)時(shí)器部分的知識(shí),同時(shí)也學(xué)到了單片機(jī)播放音樂(lè)的原理。然而在實(shí)驗(yàn)過(guò)程中,我遇到了不少問(wèn)題:1.復(fù)位開(kāi)關(guān)失效,即它并未有起到復(fù)位效果;2.每次設(shè)定好初始值后,計(jì)時(shí)器往往會(huì)自動(dòng)啟動(dòng)計(jì)時(shí)功能,即K5失效;3.K5按鍵不靈敏,往往需要重復(fù)按2次以上才會(huì)啟動(dòng)計(jì)時(shí);4.SPEAKER并沒(méi)有按照程序的設(shè)定播放出一段完整的音樂(lè)。如今,通過(guò)調(diào)試和修改,一到三的問(wèn)題得到了解決,而第四個(gè)問(wèn)題,只有在對(duì)程序進(jìn)行編譯,才能發(fā)現(xiàn)錯(cuò)誤的所在。在整個(gè)實(shí)驗(yàn)過(guò)程中,我在不斷的修改與調(diào)整中學(xué)習(xí)到越來(lái)越多的東西,同時(shí)也讓我原本掌握的知識(shí)更加牢固,這對(duì)我來(lái)說(shuō)是大有裨益的。
七. 相關(guān)程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit SPK=P1^5;
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit K5=P2^4;
sbit A1=P1^0;
sbit A2=P1^1;
sbit A3=P1^2;
sbit A4=P1^3;
uchar miao_g,miao_d,fen_g,fen_d;
uchar code Num[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num1;
uchar code song[]={0x58,0x84,0xA8,0x84,0x68,0x82,0x62,0x5C,0xA4,0xA4,0xA4,0xA4,0x93,0x81,0x9C,0x9C,0xC8,0xC4,0xC8,0xD2,0xC2,0xA8,0x92,0x82,0x6B,0xC4,0xC4,0xC4,0xA8,0x94,0x8C,0xFF};
//音律部分,前四位為音階,后四位為節(jié)拍,其中以1/4節(jié)拍為單位節(jié)拍;
uchar m;
uchar code yinjie[]={0xff,0xff,0xFC,0x4A,0xFC,0xAE,0xFD,0x08,0xFD,0x30,0xFD,0x80,0xFD,0xC6,0xFE,0x02,0xFE,0x2A,0xFE,0x5C,0xFE,0x84,0xFE,0x98,0xFE,0xC0,0xFE,0xE8,0xFF,0x06};
//音階所對(duì)應(yīng)的計(jì)時(shí)器初值,前兩位是占位,中間14位是中音1~7,后面14位是高音1~7,晶振為12MHz;
uchar ding;
void delay_1();//1/4節(jié)拍函數(shù)聲明;
void delay(uint k);//計(jì)數(shù)器延時(shí)函數(shù)聲明;
void display(uint fen_g,uint fen_d,uint miao_g,uint miao_d);//數(shù)碼管顯示函數(shù)聲明;
void music();//音樂(lè)函數(shù)聲明;
void delayxiaodou(int n);//消抖函數(shù)聲明,用于主函數(shù)K5;
//數(shù)碼管部分
void delay(uint k)          //延時(shí)函數(shù),用于計(jì)時(shí)器計(jì)算1s部分和數(shù)碼管延時(shí)顯示部分
{  uint x,y;
    for(x=k;x>0;x--)
           for(y=125;y>0;y--);
           }         
void delayxiaodou(int n)
{
     while(n--);
}
void display(uint fen_g,uint fen_d,uint miao_g,uint miao_d)   //數(shù)碼管顯示時(shí)間
{   
  
            P0=0xFF;                 //消隱;
     A1=1;A2=0;A3=0;A4=0;
         P0=Num[fen_g];
         delay(1);
         P0=0xFF;
         A1=0;A2=1;A3=0;A4=0;
         P0=Num[fen_d];
         delay(1);
         A1=0;A2=0;A3=1;A4=0;
         P0=0xFF;
         P0=Num[miao_g];
         delay(1);
         A1=0;A2=0;A3=0;A4=1;
         P0=0xFF;
         P0=Num[miao_d];
         delay(1);
         TR0=0;
         
}
//倒計(jì)時(shí)部分
void timer()interrupt 1        //定時(shí)器0,方式1
{
   TH0=0x3C;  //50ms倒計(jì)時(shí)
   TL0=0xB0;
   num1++;
   if(num1==20) //50ms*20=1s
   {   num1=0;
       miao_d--;
           if(miao_d==-1)
           {   miao_d=9;
               miao_g--;
                   if(miao_g==-1)
                   {  miao_g=5;
                      fen_d--;
                          if(fen_d==-1)
                          {  fen_d=9;
                             fen_g--;
                                 if(fen_g==-1)
                                 {
                                    fen_g=5;}}}}}}
//音樂(lè)部分
void music()
{  uint data j=0;
    uchar data g;
        uchar data i;
        while (*(song+j)!=0xff)//歌曲的停頓;
        {   g=*(song+j)&0x0F;//低4位,節(jié)拍;
            m=*(song+j)>>4;         //高4位,音階;
                TH1=yinjie[2*m];
                TL1=yinjie[2*m+1];
                TR1=1;
                if((yinjie[2*m]==0xff)&&(yinjie[2*m+1]==0xff))
                {  TR1=0;
                   SPK=1;}
                for(i=g;i>0;i--)
                {  delay_1();
                   TR1=0;
                   j++;
                   }}}                                                  
void delay_1()//1/4        節(jié)拍所需要用的時(shí)間,約187ms;
{  uchar m,n,p;
   for(m=100;m>0;m--)
     for(n=20;n>0;n--)
           for(p=15;p>0;p--);
}
void timer0() interrupt 3        //半個(gè)周期后,SPK處的脈沖反相,得到音階;
{ TH1=yinjie[2*m];
  TL1=yinjie[2*m+1];
  SPK=!SPK;
  }
//核心處理模塊
void main()
{
   TMOD=0x01; //啟動(dòng)定時(shí)器,初值為50ms;
   TH0=0x3C;
   TL0=0xB0;
   ET0=1;     //定義中斷;
   ET1=1;
   EA=1;
   TR0=0;          //時(shí)鐘初始化;
   miao_g=miao_d=fen_g=0;
   fen_d=1;
   ding=0;
   while(1)
   {
      display(fen_g,fen_d,miao_g,miao_d);
          if(K5!=0)
          {
          if(K1==0)                   //K1按鍵:在1分鐘基礎(chǔ)上遞增,可自定義計(jì)時(shí)時(shí)間;
           {  delayxiaodou(100);
              if(K1==0)
                  { miao_g=miao_d=0;
                    fen_d++;
                        if(fen_d==10)
                        {  fen_d=0;
                           fen_g++;
                           if(fen_g==6)
                           {fen_d=0;
                           }}}}
                           while(!K1);
          if(K2==0)                        //K2按鍵:初值為5分鐘;
           {  delayxiaodou(100);
               if(K2==0)
                   {  
                      miao_g=miao_d=0;
                      fen_d=5;
                          fen_g=0;
               
                          }
                          }
                          while(!K2);
          if(K3==0)                        //K3按鍵:初值為15分鐘;
            {  delayxiaodou(100);
                   if(K3==0)
                   { miao_g=miao_d=0;
                     fen_d=5;
                         fen_g=1;
                        
                         }
                         }
                         while(!K3);
                if(K4==0)                 //K4按鍵:初值為20分鐘;
                {  delayxiaodou(100);
                   if(K4==0)
                   {  miao_g=miao_d=0;
                      fen_d=0;
                          fen_g=2;
                          
                          }
                          }
                          while(!K4);
                          }
                if(K5==0)                  //K5按鍵:初值設(shè)定好后,啟動(dòng)倒計(jì)時(shí);
                 {  delayxiaodou(1);
                    if(K5==0)
                        {  ding++;
                           if(ding==2)
                           { ding=5;}
                           }}
                           while(!K5);
                   if(ding==5)
                        TR0=1;
                                 //倒計(jì)時(shí)結(jié)束;
                        display(fen_g,fen_d,miao_g,miao_d);
                        if(fen_g==0&&fen_d==0&&miao_g==0&&miao_d==0)
                          music();
        }
        }
  
全部資料51hei下載地址:
單片機(jī)設(shè)計(jì)——音樂(lè)計(jì)時(shí)器.zip (472.64 KB, 下載次數(shù): 105)

作者: 慕寒老婆    時(shí)間: 2019-10-19 19:48
portues 工程文件是哪個(gè)呀?下載之后,沒(méi)有找到
后來(lái)才知道原來(lái)需要安裝Proteus7.5才能打開(kāi),下面是仿真圖

51hei.png (18.19 KB, 下載次數(shù): 100)

51hei.png

作者: 慕寒老婆    時(shí)間: 2019-10-19 19:57
請(qǐng)問(wèn)壓縮包里的protues工程文件在哪里呀 沒(méi)有找到
作者: TZTZCOM    時(shí)間: 2020-3-6 16:56
不錯(cuò)的設(shè)計(jì),值得學(xué)習(xí)
作者: a782153803    時(shí)間: 2020-5-29 18:45
好東西 謝謝樓主
作者: 羽兒    時(shí)間: 2020-6-20 19:45
為啥數(shù)碼管一閃一閃的,除了復(fù)位和K5能按,其它按鈕都按不了,小白的我太難了
作者: jiny~~    時(shí)間: 2021-4-26 16:49
羽兒 發(fā)表于 2020-6-20 19:45
為啥數(shù)碼管一閃一閃的,除了復(fù)位和K5能按,其它按鈕都按不了,小白的我太難了

哇,我也是嗚嗚嗚,那你現(xiàn)在解決了嗎




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 日日夜夜精品视频 | 国产久 | 欧美一区二区三区久久精品 | 一二三四在线视频观看社区 | 一区二区在线 | 亚洲精品一区二区三区中文字幕 | 一级做a爰片性色毛片 | 成人久久久久 | 成年无码av片在线 | 欧美日韩在线视频一区 | 国产精品久久久久久久久久久免费看 | 日韩性生活网 | 国产精品国产精品国产专区不片 | 婷婷福利 | 免费能直接在线观看黄的视频 | 亚洲视频一区二区三区 | 最新av在线网址 | 亚洲一区二区在线播放 | 亚洲精品9999 | 亚洲一区二区视频在线播放 | 免费在线观看黄色av | 亚洲高清视频在线观看 | 一道本不卡| 亚洲国产69 | 国产精品视频在线免费观看 | 久久久片| 91亚洲国产成人精品一区二三 | 亚洲午夜视频在线观看 | 日韩成人一区二区 | 成人免费av | 亚洲午夜一区二区 | 国产黄色小视频 | 久久ww| av大片 | 国产一区二区精品在线观看 | 成人免费看片网 | 天堂影院av | 天天爽夜夜爽精品视频婷婷 | 国产精品日韩欧美一区二区 | 国产高潮好爽受不了了夜夜做 |