找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2784|回復: 0
收起左側

利用定時器產(chǎn)生樂曲 唱祝你平安 帶proteus仿真及源碼

[復制鏈接]
ID:137190 發(fā)表于 2016-10-10 13:08 | 顯示全部樓層 |閱讀模式
利用51單片機定時器產(chǎn)生樂曲的proteus仿真,下面是原理圖
0.png 0.png

單片機利用定時器唱祝你平安仿真工程文件及所有完整程序等資料下載地址:
http://www.torrancerestoration.com/bbs/dpj-56298-1.html

源程序:
  1. /********************************************************************
  2.                             天馬電子  
  3. *********************************************************************/
  4. #include<reg52.h>                 //庫文件
  5. #define uchar unsigned char//宏定義無符號字符型
  6. #define uint unsigned int  //宏定義無符號整型
  7. /********************************************************************
  8.                             初始定義
  9. *********************************************************************/
  10. uchar Count;
  11. sbit _Speak =P3^7 ; //訊響器控制腳
  12. /********************************************************************
  13.                             歌曲字根碼
  14. *********************************************************************/
  15. unsigned char code SONG[] ={ //祝你平安
  16. 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
  17. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
  18. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
  19. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
  20. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
  21. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
  22. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
  23. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
  24. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
  25. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
  26. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
  27. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
  28. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
  29. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
  30. //路邊的野華不要采
  31. 0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
  32. 0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
  33. 0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
  34. 0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
  35. 0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
  36. 0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
  37. 0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
  38. 0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
  39. 0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
  40. 0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
  41. 0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
  42. 0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,};
  43. /********************************************************************
  44.                             定時中斷服務函數(shù)
  45. *********************************************************************/
  46. void Time0_Init()
  47. {
  48.         TMOD = 0x01;
  49.         IE = 0x82;
  50.         TH0 = 0xD8;
  51.         TL0 = 0xEF; //12MZ晶振,10ms
  52. }
  53. /*********************************************************************/
  54. void Time0_Int() interrupt 1
  55. {
  56.         TH0 = 0xD8;
  57.         TL0 = 0xEF;                     
  58.         Count++; //長度加1
  59. }
  60. /*********************************************************************/
  61. void Delay_xMs(unsigned int x) //1MS 延時子程序
  62. {
  63.         unsigned int i,j;
  64.         for( i =0;i < x;i++ )
  65.         {
  66.                 for( j =0;j<3;j++ );
  67.         }
  68. }
  69. /*********************************************************************/
  70. void Play_Song(unsigned char i) //:歌曲播放子程序i 為播放哪一段曲目
  71. {
  72.         unsigned char Temp1,Temp2;
  73.         unsigned int Addr;
  74.         Count = 0; //中斷計數(shù)器清0
  75.         Addr = i * 217;
  76. while(1)
  77.         {
  78.                 Temp1 = SONG[Addr++];
  79.                 if ( Temp1 == 0xFF ) //休止符
  80.                         {
  81.                                 TR0 = 0; Delay_xMs(100);
  82.                         }
  83.         else if ( Temp1 == 0x00 ) //歌曲結束符
  84.                 {
  85.                         return;
  86.                 }
  87. else
  88. {
  89.         Temp2 = SONG[Addr++];
  90.         TR0 = 1;
  91.         while(1)
  92.         {
  93.         _Speak = ~_Speak;
  94.         Delay_xMs(Temp1);
  95.         if ( Temp2 == Count )
  96.                 {
  97.                         Count = 0;
  98.                         break;
  99.                 }
  100.         }
  101. }
  102. }
  103. }
  104. /********************************************************************
  105.                             主函數(shù)
  106. *********************************************************************/
  107. void main() //主程序
  108. {
  109.         Time0_Init(); //定時器0 中斷初始化
  110.         while(1)
  111.         {
  112.                 Play_Song(0);
  113.         } //播放
  114. }

  115. /********************************************************************
  116.                               結束
  117. *********************************************************************/


復制代碼

相關帖子

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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