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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機紅外遙控音樂臺燈設計生產(chǎn)實習報告

  [復制鏈接]
跳轉到指定樓層
樓主
ID:239393 發(fā)表于 2017-10-14 15:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

紅外遙控音樂臺燈的設計生產(chǎn)實習報告


摘要
隨著計算機技術的發(fā)展, 單片機的應用范圍也不斷擴大,目前單片機滲透到工作和生活的各個領域。在以單片機為核心的控制系統(tǒng)中,紅外遙控成為目前使用比較廣泛的一種無線通信和遙控手段。本課程設計提出一種基于單片機的紅外遙控音樂臺燈的設計方法。主要采用單片機為控制核心,以紅外信號為通信手段,通信揚聲器發(fā)聲、LED發(fā)光二極管發(fā)光來完成音樂臺燈的功能。本設計具有無線、非接觸控制,抗干擾能力強,信息傳輸可靠,功耗低,成本低,易實現(xiàn)等顯著優(yōu)點及特色。通過本設計可以完成簡單的音樂臺燈的功能。通過本次實習設計,我對單片機中斷系統(tǒng)等知識有了進一步的了解,對單片機的相關知識做到理論聯(lián)系實際。

目  錄
摘  要
Abstract
第1章  緒論
1.1  概述
1.2  主要功能
第2章  電路設計
2.1  整體電路設計
2.2  電路模塊設計
2.2.1  單片機最小系統(tǒng)電路
2.2.2  紅外解碼電路
2.2.3  音樂播放模塊電路
2.2.4   LED燈具組電組                                                                  
第3章  程序設計
3.1  紅外解碼程序
3.2  音樂播放程序
第4章  硬件調試
生產(chǎn)實習總結
參考文獻
附錄1  整體電路圖及實物圖
附錄2  電路元件
附錄3  程序源碼


第1章 緒論
1.1  概述
利用單片機演奏音樂是單片機愛好者的興趣之一,應用的范圍也比較廣泛。所謂音樂播放器,由單片機進行信息處理,再經(jīng)過信號放大,由蜂鳴器發(fā)出樂曲聲。我們知道,振動產(chǎn)生聲音,振動頻率不同所發(fā)出的聲音也就不同。有規(guī)律的振動發(fā)出的聲音叫“樂音”。音樂由音頻和節(jié)拍構成,音頻即發(fā)聲的頻率;節(jié)拍即延時的長短。因此利用單片機的定時器,產(chǎn)生一定頻率的方波,即可以產(chǎn)生一定頻率的聲音。再利用單片機軟件延時的方法來產(chǎn)生不同的節(jié)拍。把音頻和節(jié)拍結合起來,進行合理的排列,即可播放出比較悅耳的音樂。本文比較詳細地介紹了音樂播放器的工作原理、設計思路、硬件的選擇及相關作用、軟件的實現(xiàn)方法以及詳細的程序清單。
控制單片機播放音樂的方式有很多,多數(shù)使用者利用單片機存儲音樂與控制播放。本設計利用STC89C51單片機及少數(shù)外圍電路控制音樂播放,產(chǎn)生兩首不同的歌曲。 對于單片機產(chǎn)生音樂,關鍵是控制頻率的輸出。本設計采用了定時器T0中斷的方法產(chǎn)生不同頻率的脈沖,從而產(chǎn)生不同頻率的聲音。此外,使用紅外一體化頭VS1838B接收紅外信號,通過外部中斷INT0來進行對紅外信號的解碼,由單片機內部程序對不同的鍵值完成不同的操作。并且使用常用的無源蜂鳴器進行發(fā)聲,實現(xiàn)了一個簡單的遙控音樂播放器的功能。
1.2  主要功能
本次設計所要實現(xiàn)為以STC89C51為核心的紅外遙控音樂及LED燈具組的功能。首先,我們選擇耐壓值為12V的白色發(fā)光二極管作為本次設計的燈具組成器件。其次,選用ULN2003及揚聲器的語音模塊通過對所選的音樂進行編碼輸入到單片機后再解碼到語音模塊來實現(xiàn)我們的臺燈音樂播放功能

第2章 電路設計
2.1 整體電路設計
根據(jù)設計要求,紅外遙控音樂臺燈可以分為三個模塊進行設計:
1.單片機最小系統(tǒng)電路:單片機最小系統(tǒng),或者稱為最小應用系統(tǒng),是指用最少的元件組成的單片機可以工作的最小的系統(tǒng)單元。
對51系列單片機來說,最小系統(tǒng)一般應該包括:單片機、時鐘電路、復位電路。本設計中使用的單片機為STC89C51,晶振電路使用12MHZ的晶振。復位電路:由電容串聯(lián)電阻構成,當系統(tǒng)一上電,RST腳將會出現(xiàn)高電平,當RST腳的高電平持續(xù)兩個機器周期以上就將復位。
2.紅外解碼電路:本電路主要用于對紅外遙控器發(fā)出的紅外信號進行解碼,然后程序根據(jù)解碼后的不同鍵值相應完成不同的功能。
3.音樂播放模塊:本模塊采用ULN2003及揚聲器組成語音系統(tǒng)對經(jīng)單片機解碼后所得的音樂代碼的數(shù)字量放大再轉換為模擬量實現(xiàn)音樂的播放。
4.LED燈具組:我們選用耐壓值為12V的發(fā)光二極管總共為12個。每4個led分為一組,分別與單片機A8、A9、A10管腳相連,從而實現(xiàn)臺燈的三檔亮度調節(jié)。
分析各模塊電路的功能,畫出原理框圖如圖2-1所示:
圖2-1 紅外遙控音臺燈原理框圖

2.2  電路模塊設計
2.2.1 單片機最小系統(tǒng)電路
圖2-2 單片機最小系統(tǒng)電路圖
由圖2-2可以知道,單片機最小系統(tǒng)主要由復位電路、時鐘電路等組成。
1.復位電路:由電容串聯(lián)電阻構成,并結合"電容電壓不能突變"的性質,可以知道,當系統(tǒng)一上電,RST腳將會出現(xiàn)高電平,并且,這個高電平持續(xù)的時間由電路的RC值來決定。
典型的51單片機當RST腳的高電平持續(xù)兩個機器周期以上就將復位,所以,適當組合RC的取值就可以保證可靠的復位。一般教科書推薦C 取10uF,R取8.2K左右。當然也有其他取法的,原則就是要讓RC組合可以在RST腳上產(chǎn)生不少于2個機周期的高電平。單片機復位電路就好比電腦的重啟部分,當電腦在使用中出現(xiàn)死機,按下重啟按鈕電腦內部的程序從頭開始執(zhí)行。單片機也一樣,當單片機系統(tǒng)在運行中,受到環(huán)境干擾出現(xiàn)程序跑飛的時候,按下復位按鈕內部的程序自動從頭開始執(zhí)行。
2.時鐘電路:單片機內部有一個高增益反相放大器,引腳XTAL1 和XTAL2 分別是該放大器的輸入端和輸出端,如果引腳XTAL1 和XTAL2 兩端跨接上晶體振蕩器(晶振)或陶瓷振蕩器就構成了穩(wěn)定的自激振蕩電路,該振蕩電路的輸出可直接送入內部時序電路。
單片機的時鐘可由兩種方式產(chǎn)生,即內部時鐘方式和外部時鐘方式。
(1)內部時鐘方式。內部時鐘方式即是由單片機內部的高增益反相放大器和外部跨接的晶振、微調電容構成時鐘電路產(chǎn)生時鐘的方法。外接晶振(陶瓷振蕩器)時,C1、C2 的值通常選擇為30Pf左右;C1、C2 對頻率有微調作用,晶振或陶瓷諧振器的頻率范圍可在1.2MHz ~12MHz之間選擇。為了減小寄生電容,更好地保證振蕩器穩(wěn)定、可靠地工作,振蕩器和電容應盡可能安裝得與單片機引腳XTALl 和XTAL2 靠近。由于內部時鐘方式外部電路接線簡單,單片機應用系統(tǒng)中大多采用這種方式。內部時鐘方式產(chǎn)生的時鐘信號的頻率就是晶振的固有頻率,常用fsoc 來表示。
(2)外部時鐘方式。外部時鐘方式即完全用單片機外部電路產(chǎn)生時鐘的方法,外部電路產(chǎn)生的時鐘信號被直接接到單片機的XTAL1引入,此時XTAL2 開路。
3.內外程序存儲器選擇控制端EA/Vpp,決定了單片機訪問內部或外部的程序存儲器。EA高電平時,訪問內部程序存儲器,但當程序計數(shù)器(PC)值超過0FFFFH時,單片機自動轉向外部程序存儲器。當EA低電平時,不管單片機有無內部存儲器,只訪問外部存儲器[1]。
2.2.2  紅外解碼電路
紅外解碼電路如圖2-3所示:

圖2-3 紅外解碼電路圖
由圖2-3知道,紅外解碼電路中主要元件為紅外一體化接收頭VS1838B。
一體化紅外接收頭VS1838B是集信號放大、濾波、檢波、整形于一體的紅外接收器,電路內置PIN二極管和前置放大器,采用可以紅外濾波的環(huán)氧樹脂材料封裝,可靠性高,不易受環(huán)境影響并可以防止非控制信號的輸出脈沖出現(xiàn)。
內部結構如圖2-4所示:
圖2-4 VS1838B內部結構圖
VS1838B內置帶通濾波器、積分器、和自動增益控制電路以抑制各種干擾和噪音。數(shù)據(jù)信號和干擾信號的主要區(qū)別在于載波頻率、脈沖波長和工作周期上。所以數(shù)據(jù)信號應該滿足載波信號的頻率盡量接近帶通濾波器的中心頻率(38KHZ);脈沖長度在300us以上;數(shù)據(jù)的編碼類型相兼容。而本系統(tǒng)選用的VS1838B在這三方面和NEC編碼格式是相配的
2.2.3 音樂播放模塊
音樂播放模塊電路如圖2-5所示:


圖2-5 音樂播放模塊電路圖

1.ULN2003:高壓大電流達林頓晶體管陣列,由七個硅NPN復合晶體管組成。電路特點: ULN2003的每一對達林頓都串聯(lián)一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數(shù)據(jù)。具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應于各類要求高速大功率驅動的系統(tǒng)。本設計中用于揚聲器的驅動,同時可以為再次擴展時提供驅動電路。

2.2.4  LED燈具組

3程序設計
分析紅外遙控音樂播放和控制led臺燈亮度的功能,包括選擇播放三首歌曲、不同歌曲對應不同臺燈亮度。根據(jù)以上功能,可心得出結論:該程序設計的主要工作,即核心問題是紅外信號的解碼。因為,無論是播放音樂的哪一個操作,還是控制不同臺燈亮度,都是建立在對紅外信號的正確解碼下的。首先進行正確的紅外解碼,然后根據(jù)解碼后的鍵值進行播放歌曲與顯示臺燈亮度。按照以上得出的結論,畫出程序流程圖如圖3-1所示:
圖3-1 程序流程圖
結合程序流程圖,可以知道:將整個程序的設計分為兩個模塊,即:紅外解碼、播放及亮燈。
3.1  紅外解碼程序
在進行程序設計之前,先分析一下紅外信號的波形。每當次按鍵按下,紅外發(fā)射器會發(fā)出一串脈沖,紅外接收器會收到這一串脈沖寬度不等的脈沖波形流,其脈沖流包括:(1)前導碼:第1個脈沖波形;(2)用戶碼1:第2到第9個脈沖波形;(3)用戶碼2:第10到第17個脈沖波形;(4)數(shù)據(jù)碼:第18到第25個脈沖波形;(5)數(shù)據(jù)反碼:第26到第33個脈沖波形;(6) 連續(xù)按鍵脈沖:第34和第35個脈沖為結束脈沖,在每次按鍵結束后會有兩個結束脈沖,如果一直按鍵不放的話,會一直發(fā)送連續(xù)按鍵脈沖,并可以認為在收到10個連續(xù)按鍵脈沖后是下一個按鍵(本次設計中不考慮連續(xù)按鍵脈沖)。其碼型結構如圖3-2所示:
圖3-2 紅外信號碼型圖
由圖3-2可知:紅外信號碼型中本次設計中要使用的部分,即是圖3-2中的8位鍵數(shù)據(jù)碼。下面分析具體的怎樣進行紅外信號的解碼。
紅外信號為采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖3-3所示。
圖3-3 紅外信號脈沖寬度圖
上述“0”和“1”組成的32位二進制碼經(jīng)38kHz的載頻進行二次調制以提高發(fā)射效率,達到降低電源功耗的目的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射,即產(chǎn)生了如圖3-2所示的有效碼組序列。在圖3-3中同樣可以看到引導碼脈寬為9ms,間隔4.5ms。在紅外信號經(jīng)過解碼電路后,原碼型中的高低電平進行反轉。在得到的新碼型中,去掉第一個下降沿(引導碼),第二個下降沿開始即為有效碼序列,應該進行解碼并記錄。在本設計中,將解碼后的信號引入外部中斷1,由于是下降沿有效,故IT1=1[2]。紅外解碼源碼如下:
3.2  播放及亮燈程序
分析音樂播放的過程,其為不同頻率聲音的組合,當一組恰當頻率聲音組合按照一定的先后順序與節(jié)拍播放時,即可產(chǎn)生音樂。故要產(chǎn)生音頻信號,只要算出某一音頻的周期,將此周期除以2即為半周期的時間,利用定時器計時此半周期時間,計時到后取反輸出,重復此過程即得到此頻率的聲音信號。此信號從P3.2腳輸出,用ULN2003驅動揚聲器播放音樂。其中每個音符使用兩個字節(jié)表示:低位字節(jié)(偶地址)代表音級,表示的音級為c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3;高位字節(jié)(奇地址)代表音符的時值(節(jié)拍),表示拍數(shù)為1/8拍(0.10s)~8拍(6.40s)。
程序設計中用軟件延時程序來控制音級, 與紅外解碼共用定時器0進行節(jié)拍的控制。紅外信號解碼后,蜂鳴器播放音樂源碼如下:
  1. #include "reg52.h"                                          //此文件中定義了單片機的一些特殊功能寄存器
  2.             
  3. typedef unsigned int u16;                //對數(shù)據(jù)類型進行聲明定義
  4. typedef unsigned char u8;
  5. sbit IRIN=P3^2;
  6. u8 IrValue[6];
  7. u8 Time;
  8. u8 DisplayData[8];
  9. u8 code smgduan[17]={
  10. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
  12. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼
  13. /*******************************************************************************
  14. * 函 數(shù) 名         : delay
  15. * 函數(shù)功能                               : 延時函數(shù),i=1時,大約延時10us
  16. *******************************************************************************/
  17. void delay(u16 i)
  18. {
  19.               while(i--);            
  20. }/*******************************************************************************
  21. * 函數(shù)名         : IrInit()
  22. * 函數(shù)功能                               : 初始化紅外線接收
  23. * 輸入           : 無
  24. * 輸出                       : 無
  25. *******************************************************************************/
  26. void IrInit()
  27. {
  28.               IT0=1;//下降沿觸發(fā)
  29.               EX0=1;//打開中斷0允許
  30.               EA=1;              //打開總中斷
  31.               IRIN=1;//初始化端口
  32. }
  33. /*******************************************************************************
  34. * 函 數(shù) 名       : main
  35. * 函數(shù)功能                            : 主函數(shù)
  36. * 輸    入       : 無
  37. * 輸    出                  : 無
  38. *******************************************************************************/
  39. void main()
  40. {            
  41.               IrInit();
  42.               while(1)
  43.               {            
  44.                             DisplayData[0] = smgduan[IrValue[2]/16];
  45.                             DisplayData[1] = smgduan[IrValue[2]%16];
  46.                             DisplayData[2] = smgduan[16];
  47.                   DigDisplay();                           
  48.               }                           
  49. }
  50. /*******************************************************************************
  51. * 函數(shù)名         : ReadIr()
  52. * 函數(shù)功能                               : 讀取紅外數(shù)值的中斷函數(shù)
  53. * 輸入           : 無
  54. * 輸出                       : 無
  55. *******************************************************************************/
  56. void ReadIr() interrupt 0
  57. {
  58.               u8 j,k;
  59.               u16 err;
  60.               Time=0;                                                                     
  61.               delay(700);              //7ms
  62.               if(IRIN==0)                            //確認是否真的接收到正確的信號
  63.               {            
  64.                            
  65.                             err=1000;                                                        //1000*10us=10ms,超過說明接收到錯誤的信號
  66.                             /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  67.                             侯,程序死在這里*/            
  68.                             while((IRIN==0)&&(err>0))              //等待前面9ms的低電平過去                             
  69.                             {                                         
  70.                                           delay(1);
  71.                                           err--;
  72.                             }
  73.                             if(IRIN==1)                                          //如果正確等到9ms低電平
  74.                             {
  75.                                           err=500;
  76.                                           while((IRIN==1)&&(err>0))                            //等待4.5ms的起始高電平過去
  77.                                           {
  78.                                                         delay(1);
  79.                                                         err--;
  80.                                           }
  81.                                           for(k=0;k<4;k++)                            //共有4組數(shù)據(jù)
  82.                                           {                                                      
  83.                                                         for(j=0;j<8;j++)              //接收一組數(shù)據(jù)
  84.                                                         {
  85.                                                                       err=60;                           
  86.                                                                       while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  87.                                                                       {
  88.                                                                                     delay(1);
  89.                                                                                     err--;
  90.                                                                       }
  91.                                                                       err=500;
  92.                                                                       while((IRIN==1)&&(err>0))              //計算高電平的時間長度。
  93.                                                                       {
  94.                                                                                     delay(10);              //0.1ms
  95.                                                                                     Time++;
  96.                                                                                     err--;
  97.                                                                                     if(Time>30)
  98.                                                                                     {
  99.                                                                                                   return;
  100.                                                                                     }
  101.                                                                       }
  102.                                                                       IrValue[k]>>=1;              //k表示第幾組數(shù)據(jù)
  103.                                                                       if(Time>=8)                                         //如果高電平出現(xiàn)大于565us,那么是1
  104.                                                                       {
  105.                                                                                     IrValue[k]|=0x80;
  106.                                                                       }
  107.                                                                       Time=0;                            //用完時間要重新賦值                                                                                                
  108.                                                         }
  109.                                           }
  110.                             }
  111.                                if(IrValue[2]!=~IrValue[3])
  112.    { EX1=1;
  113.      return; }
復制代碼



第4章  硬件調試
根據(jù)上述設計電路畫出電路原理圖,根據(jù)原理圖焊接電路板,實物圖如圖4-1所示:

圖4-1 實物圖
在本設計中使用的紅外遙控器如圖4-2所示,遙控器各按鍵相應碼值如圖4-3所示:
      
圖4-2 紅外遙控器              圖4-3 遙控器按鍵碼值
紅外遙控音樂臺燈的設計中,對于紅外遙控器未將全部的按鍵設計功能,本設計使用按鍵對應碼值及功能如表4-1所示:
表4-1 遙控器按鍵、碼值及功能表
遙控器按鍵
按鍵對應碼值
功能
數(shù)字鍵0
數(shù)字鍵1
16
0c
      關閉臺燈
1檔
數(shù)字鍵2
18
      2檔
數(shù)字鍵3
5e
3檔
根據(jù)設計功能進行硬件調試,調試過程如下:
(1)單片機上電,此時無按鍵按鍵,臺燈不亮,蜂鳴器不工作。
(2)按下數(shù)字鍵1,對應碼值0c,臺燈亮度為1檔,蜂鳴器工作,播放曲目1:祝你平安
(3)按下數(shù)字鍵2,對應碼值18,臺燈亮度為2檔,蜂鳴器工作,播放曲目2:八月桂花
(4)按下數(shù)字鍵3,對應碼值5e,臺燈亮度為3檔,蜂鳴器工作,播放曲目3:菊花臺

生產(chǎn)實習總結
為期17天的生產(chǎn)實習結束了。這段時間以來,我們經(jīng)歷了很多,學到了很多,同樣也領悟了很多。俗話說實踐是檢驗真理的唯一標準。我們生活學習都在學校,接觸的是課本是公式,然而自己動手做東西的機會少之又少。所以此次生產(chǎn)實習是我們鍛煉自身的好機會,通過所學的知識將其結合到實際生產(chǎn)之中,并在這個過程中發(fā)現(xiàn)自己的不足然后解決它。同樣,此次生產(chǎn)實習也是對我們三年來學習能力的一個檢驗,因而需用百分之兩百的力氣及汗水來完成此次實習。
一、實習過程
我們所選的課題為遙控音樂臺燈的設計,其中涉及到單片機程序編寫及調試,電路設計,3d打印等多項知識儲備。因此,我們小組三人決定分工合作,一人負責程序編寫和調試,其他兩人分別負責電路設計和3d打印設計這兩部分。歷時三天,我們實現(xiàn)了單片機紅外控制程序及音樂編碼與解碼等和3dmax軟件的設計操作等必須的技能的掌握。接下來就是電路的設計與電路板的制備過程,相比前面的操作,這兩項顯得容易多,畢竟我們三年來都在接觸與之相關的課程。因而我們在一天半內完成了電路板的印制。經(jīng)初步的電路調試發(fā)現(xiàn)紅外控制與led燈組不匹配,經(jīng)過反復的盤查查找出了錯誤為復位電路設計出錯,經(jīng)改正后最終實現(xiàn)了基本設計要求。由此可見在做任何東西的時候都不是一蹴而就的,需要我們反復的驗證并查找錯誤然后改進,因為金字塔不是一天就能建成的。
二、實習體會
  歷時17天的生產(chǎn)實習已經(jīng)接近尾聲了,我們小組每個人在這實習過程中都收獲良多,仿佛是對自己的系統(tǒng)進行了一次updata,清理了我們腦海中錯誤的知識印象,加深那些我們模糊知識的記憶,弄清了那些似懂非懂得知識理解。此次生產(chǎn)實習讓我們學會了很多,也懂得了很多在枯燥的學習中沒法獲得到的知識和道理;仡欉@三個星期,我們明白了一個道理:人生不可能存在一帆風順的事,只有自己勇敢地面對人生中的每一個挫折和失敗,才能通往自己的羅馬大道。在這三周里,我們煩躁過,懈怠過,失敗更是家常便飯。但在每次失落的時候我們都會反省自己,告訴自己清楚自己應該做的是什么,在挫折面前我們應該善用于揚長避短的方法來促進自己,提高自己的綜合水平能力。在學習方面雖然自己普通平凡,但是我們會努力提高,做到最好,不管遇到什么困擾我們都不會跌倒,我會不懈努力。


參考文獻
[1] 張毅剛.MCS-51單片機應用設計.哈爾濱:哈爾濱工業(yè)大學出版社,2003
[2] 求是科技.8051系列單片機C程序設計完全手冊.北京:人民郵電出版社,2006
[3] 李升.單片機原理與接口技術.北京:北京大學出版社,2011


附錄1  整體電路圖及實物圖
  



附錄2  電路元件
1
單片機
STC89C51
1片
2
滑動變阻器
W201
1個
3
Carmp3遙控器

1個
4
達林頓晶體管
ULN2003
1片
5
紅外一體接收頭
VS1838B
1個
6
電容
30PF
2個

Dc插座

1個
8
電解電容
10UF
1個
9
電阻
1K
1個
10
電阻
512R
12個
11
四角按鍵開關

1個
12
晶振
12MHz
1個
13
白色發(fā)光二極管

12個
14
揚聲器
2W4R
1個
15
排針及排插

若干

附錄3  程序源碼
單片機源程序如下:

  1. #include <REG52.H>   
  2. #include <INTRINS.H>  
  3. sbit Beep =  P1^5;
  4. typedef unsigned int u16;                //對數(shù)據(jù)類型進行聲明定義
  5. typedef unsigned char u8;

  6. sbit led1=P2^0;
  7. sbit led2=P2^1;
  8. sbit led3=P2^2;

  9. sbit IRIN=P3^2;
  10. u8 t1;

  11. u8 IrValue[6];
  12. u8 Time;

  13. unsigned char code music[];


  14. unsigned char n=0;  //n為節(jié)拍常數(shù)變量   
  15. unsigned char code music_tab[] ={    //祝你平安
  16. 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,
  17. 0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
  18. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,
  19. 0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
  20. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,
  21. 0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
  22. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,
  23. 0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
  24. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,
  25. 0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
  26. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,
  27. 0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
  28. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,
  29. 0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
  30. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,
  31. 0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
  32. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,
  33. 0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
  34. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,
  35. 0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
  36. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,
  37. 0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
  38. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,
  39. 0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
  40. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,
  41. 0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
  42. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,
  43. 0x00
  44. };  

  45. unsigned char code song[] ={     //八月桂花
  46. 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10,  
  47. 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40,  
  48. 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20,  
  49. 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18,  
  50. 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26,  
  51. 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20,  
  52. 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10,  
  53. 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20,  
  54. 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10,  
  55. 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20,  
  56. 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10,  
  57. 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20,  
  58. 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20,  
  59. 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10,  
  60. 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20,  
  61. 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15,  
  62. 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20,  
  63. 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40,  
  64. 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20,  
  65. 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20,  
  66. 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30,  
  67. 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20,  
  68. 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20,  
  69. 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00  
  70. };
  71. unsigned char code song2[]={
  72. 0x64,0x62,0x52,0x62,0x04,0x62,0x72,0x62,
  73. 0x52,0x68,0x44,0x42,0x52,0x62,0x72,0x64,
  74. 0x54,0x52,0x42,0x04,0x64,0x72,0x62,0x82,
  75. 0x76,0x82,0x72,0x72,0x62,0x76,0x22,0x64,
  76. 0x52,0x62,0x74,0x62,0x52,0x54,0x52,0x42,
  77. 0x54,0x42,0x72,0x64,0x62,0x52,0x64,0x04,
  78. 0x62,0x72,0x62,0x52,0x68,0x44,0x42,0x52,
  79. 0x62,0x72,0x64,0x54,0x52,0x42,0x54,0x04,
  80. 0x64,0x72,0x62,0x82,0x76,0x82,0x72,0x72,
  81. 0x62,0x78,0x64,0x52,0x62,0x74,0x62,0x52,
  82. 0x52,0x46,0x46,0x02,0x42,0x52,0x64,0x62,
  83. 0x72,0x84,0x82,0xc2,0xb2,0xa2,0xa2,0x82,
  84. 0x78,0x82,0x72,0x62,0x52,0x44,0x32,0x42,
  85. 0x54,0x52,0x42,0x54,0x42,0x52,0x64,0x62,
  86. 0x72,0x84,0x82,0xc2,0xb2,0xa2,0xb2,0xa8,
  87. 0x74,0x72,0x62,0x92,0xa2,0x42,0x52,0x68,
  88. 0x58,0x4f,0x0f,0x00

  89. }; //菊花臺

  90. /*******************************************************************************
  91. * 函 數(shù) 名         : delay
  92. * 函數(shù)功能                               : 延時函數(shù),i=1時,大約延時10us
  93. *******************************************************************************/
  94. void delay1(u16 i)
  95. {
  96.               while(i--);            
  97. }
  98. /*******************************************************************************
  99. * 函數(shù)名         : IrInit()
  100. * 函數(shù)功能                               : 初始化紅外線接收
  101. * 輸入           : 無
  102. * 輸出                       : 無
  103. *******************************************************************************/

  104. void IrInit()
  105. {
  106.               IT0=1;//下降沿觸發(fā)
  107.               EX0=1;//打開中斷0允許
  108.               EA=1;              //打開總中斷
  109.               PX0=1;
  110.               IRIN=1;//初始化端口
  111. }


  112. void int0()  interrupt 1   //采用計數(shù)器0 控制節(jié)拍   
  113. {  TH0=0xd8;  
  114.    TL0=0xef;  
  115.    n--;  
  116. }  

  117. void delay (unsigned char m)   //控制頻率延時   
  118. {  
  119. unsigned i=3*m;  
  120. while(--i);  
  121. }  

  122. void delayms(unsigned char a)  //豪秒延時子程序   
  123. {  
  124.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結果就知道了!   
  125. }  

  126. void beep()  
  127. { unsigned char p,m;   //m為頻率常數(shù)變量   
  128.   unsigned char i=0;  
  129.   TMOD&=0x0f;  
  130.   TMOD|=0x01;  
  131.   TH0=0xd8;TL0=0xef;  
  132.   IE=0xff;
  133. play:  
  134.    while(t1)  
  135.     {  
  136.     a:               switch (t1)
  137.               {
  138.                             case 1:              p=music_tab[i];break;
  139.                             case 4: p=song[i];break;
  140.                             case 7: p=song2[i];break;
  141.               }
  142.        if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到結束符,延時1秒,回到開始再來一遍   
  143.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延時100ms,繼續(xù)取下一音符   
  144.             else        
  145.                                                                       {
  146.                                                                                     switch (t1)
  147.                                                                                     {
  148.                                                                                                   case 1:m=music_tab[i++], n=music_tab[i++]; break;
  149.                                                                                                   case 4:m=song[i++], n=song[i++];break;
  150.                                                                                                   case 7:m=song2[i++], n=song2[i++];break;
  151.                                                                                     }
  152.                                                                                     }  //取頻率常數(shù) 和 節(jié)拍常數(shù)   
  153.              TR0=1;                                             //開定時器0   
  154.            while((n!=0)&&t1) Beep=~Beep,delay(m);                         //等待節(jié)拍完成, 通過P1口輸出音頻(可多聲道哦!)   
  155.        TR0=0;                                             //關定時器0   
  156.     }  
  157. }
  158. void main()
  159. {
  160.               IrInit();
  161.               while(1)
  162.               {
  163.                             if(t1) beep();
  164.               }
  165. }
  166. void ReadIr() interrupt 0
  167. {
  168.               u8 j,k;
  169.               u16 err;
  170.               Time=0;                                                                     
  171.               delay1(700);              //7ms
  172.               if(IRIN==0)                            //確認是否真的接收到正確的信號
  173.               {            
  174.                            
  175.                             err=1000;                                                        //1000*10us=10ms,超過說明接收到錯誤的信號
  176.                             /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  177.                             侯,程序死在這里*/            
  178.                             while((IRIN==0)&&(err>0))              //等待前面9ms的低電平過去                             
  179.                             {                                         
  180.                                           delay1(1);
  181.                                           err--;
  182.                             }
  183.                             if(IRIN==1)                                          //如果正確等到9ms低電平
  184.                             {
  185.                                           err=500;
  186.                                           while((IRIN==1)&&(err>0))                            //等待4.5ms的起始高電平過去
  187.                                           {
  188.                                                         delay1(1);
  189.                                                         err--;
  190.                                           }
  191.                                           for(k=0;k<4;k++)                            //共有4組數(shù)據(jù)
  192.                                           {                                                      
  193.                                                         for(j=0;j<8;j++)              //接收一組數(shù)據(jù)
  194.                                                         {

  195.                                                                       err=60;                           
  196.                                                                       while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  197.                                                                       {
  198.                                                                                     delay1(1);
  199.                                                                                     err--;
  200.                                                                       }
  201.                                                                       err=500;
  202.                                                                       while((IRIN==1)&&(err>0))              //計算高電平的時間長度。
  203.                                                                       {
  204.                                                                                     delay1(10);              //0.1ms
  205.                                                                                     Time++;
  206.                                                                                     err--;
  207.                                                                                     if(Time>30)
  208.                                                                                     {
  209.                                                                                                   return;
  210.                                                                                     }
  211.                                                                       }
  212.                                                                       IrValue[k]>>=1;              //k表示第幾組數(shù)據(jù)
  213.                                                                       if(Time>=8)                                          //如果高電平出現(xiàn)大于565us,那么是1
  214.                                                                       {
  215.                                                                                     IrValue[k]|=0x80;
  216.                                                                       }
  217.                                                                       Time=0;                            //用完時間要重新賦值                                                                                                
  218.                                                         }
  219.                                           }
  220.                             }
  221.                                if(IrValue[2]!=~IrValue[3])
  222.    { EX1=1;
  223.      return; }

  224.                 switch(IrValue[2])
  225.    {
  226.                                case 0x16:                //0
  227.                                           led1=1;led2=1;led3=1;
  228.                                 t1=0;
  229.                                           break;
  230.                             case 0x0c:                //1
  231.                                           led1=0;led2=1;led3=1;
  232.                                 t1=1;
  233.                                           break;
  234. ……………………

  235. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整論文下載(word格式 可編輯):
遙控音樂臺燈.zip (2.28 MB, 下載次數(shù): 116)



評分

參與人數(shù) 2黑幣 +55 收起 理由
喵咔 + 5
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2017-10-19 22:00 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:229527 發(fā)表于 2017-11-16 10:04 | 只看該作者
謝謝了 樓主!
回復

使用道具 舉報

地板
ID:261731 發(fā)表于 2017-12-14 20:29 | 只看該作者
謝謝樓主
回復

使用道具 舉報

5#
ID:87193 發(fā)表于 2017-12-15 09:34 | 只看該作者
謝謝樓主分享,資料挺詳細的
回復

使用道具 舉報

6#
ID:281262 發(fā)表于 2018-5-18 10:16 | 只看該作者
謝謝分享
回復

使用道具 舉報

7#
ID:332780 發(fā)表于 2018-5-18 10:27 | 只看該作者
剛接觸 希望能學到東西 謝謝大家
回復

使用道具 舉報

8#
ID:281262 發(fā)表于 2018-5-20 15:59 | 只看該作者
謝謝樓主
回復

使用道具 舉報

9#
ID:364711 發(fā)表于 2018-7-4 11:59 | 只看該作者

謝謝樓主
回復

使用道具 舉報

10#
ID:364711 發(fā)表于 2018-7-4 12:54 | 只看該作者

謝謝樓主
回復

使用道具 舉報

11#
ID:15207 發(fā)表于 2018-7-4 21:22 | 只看該作者
紅外解碼正好需要,先下載后面用的到
回復

使用道具 舉報

12#
ID:611470 發(fā)表于 2020-5-14 20:16 來自手機 | 只看該作者
這兩個是什么?

IMG_20200514_201150.jpg (25.71 KB, 下載次數(shù): 28)

IMG_20200514_201150.jpg
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美一区二区三区国产精品 | 久久九七| 精品国产成人 | 日本精品一区二区三区四区 | 精品av| 国产91在线 | 中日 | 欧美视频在线播放 | 国产成人综合在线 | 高清视频一区二区三区 | 国产成人精品久久二区二区91 | 最新国产精品 | 国产欧美日韩综合精品一区二区 | 欧美日韩国产在线 | 中文字幕在线免费视频 | 欧美人妖网站 | 99精品久久久 | 亚洲精品一区二区三区 | 日韩av最新网址 | 午夜精品久久久久久 | 久久国产视频一区 | 天堂成人国产精品一区 | 国产在线一级片 | 欧美一级在线观看 | 久久综合狠狠综合久久综合88 | 欧美精品一区二区在线观看 | 精品国产免费一区二区三区五区 | 日韩二三区 | 日韩欧美中文字幕在线观看 | 欧美成人免费在线 | 亚洲免费观看视频 | 国产精品久久久久久久久久免费看 | 国产精品欧美精品日韩精品 | 97久久精品午夜一区二区 | 日韩精品一区二区三区 | 国产特级毛片aaaaaa喷潮 | 久久999| 一区二区三区免费观看 | 久久久女女女女999久久 | 亚洲精品国产区 | 91福利网址| 欧美一级二级视频 |