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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F2K60S2單片機C語言音樂編程實現

  [復制鏈接]
跳轉到指定樓層
樓主
ID:271728 發表于 2018-1-4 23:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
keil編程實例音樂

單片機源程序如下:

  1. /**********************
  2. 基于STC15F2K60S2系列單片機C語言編程實現
  3. 使用如下頭文件,不用另外再包含"REG51.H"
  4. ***********************/
  5. #include <STC15F2K60S2.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit beep=P3^4;                          //蜂鳴器
  9. sbit key1=P3^2;                        //按鍵1
  10. sbit key2=P3^3;                        //按鍵2
  11. sbit key3=P1^7;     //按鍵3

  12. sbit Sel0=P2^0;
  13. sbit Sel1=P2^1;
  14. sbit Sel2=P2^2;//位選的三個引腳控制位

  15. uchar pinlv;
  16. uchar pinlv_flag;//改變數碼管滾動頻率

  17. uchar show_w1;
  18. uchar show_w2;
  19. uchar show_w3;
  20. uchar show_w4;
  21. uchar show_w5;
  22. uchar show_w6;
  23. uchar show_w7;
  24. uchar show_w8;//show_wi,分別對應從左到右的每個數碼管上的數字

  25. uchar duanxuan[]={0x73,0x38,0x79,0x77,0x6d,0x79,0x00,0x79,0x37,0x1e,0x3f,0x6e,0x40,0x40,0x0f,0x39,0x38,0x6e,0x00,0x00};//段選,顯示PLEASE ENJOY--XLY
  26. uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //位選,選擇是0-7中的一個數碼管

  27. uchar flag0,count;//數碼管掃描快慢分頻作用

  28. uchar timeh,timel,jindu=0,gequ=0;                  //定義定時器的重裝值
  29. bit flag;        //播放標志位
  30. uchar code music1[] ={    //音樂代碼,歌曲為《同一首歌》,格式為: 音符, 節拍, 音符, 節拍,   
  31. 0x15,0x20,0x21,0x10,         //音符的十位代表是低八度,中八度還是高八度,1代表低八度,2代表中八度,3代表高八度
  32. 0x22,0x10,0x23,0x15,         //個位代表簡譜的音符,例如0x15代表低八度的S0,0x21代表中八度的DO。
  33. 0x24,0x05,0x23,0x10,         //節拍則是代表音長,例如:0x10代表一拍,0x20代表兩拍,0x05代表1/2拍
  34. 0x21,0x10,0x22,0x20,
  35. 0x21,0x10,0x16,0x10,
  36. 0x21,0x40,0x15,0x20,
  37. 0x21,0x10,0x22,0x10,
  38. 0x23,0x10,0x23,0x05,
  39. 0x24,0x05,0x25,0x10,
  40. 0x21,0x10,0x24,0x15,
  41. 0x23,0x05,0x25,0x10,
  42. 0x22,0x05,0x23,0x05,
  43. 0x23,0x05,0x22,0x05,
  44. 0x22,0x30,0x23,0x20,
  45. 0x25,0x10,0x31,0x10,
  46. 0x27,0x15,0x26,0x05,
  47. 0x26,0x20,0x25,0x10,
  48. 0x25,0x05,0x26,0x05,
  49. 0x27,0x10,0x26,0x05,
  50. 0x25,0x05,0x23,0x40,
  51. 0x24,0x15,0x24,0x05,
  52. 0x25,0x10,0x26,0x10,
  53. 0x25,0x10,0x24,0x05,
  54. 0x23,0x05,0x22,0x20,
  55. 0x17,0x10,0x17,0x05,
  56. 0x16,0x05,0x15,0x10,
  57. 0x16,0x10,0x21,0x40,
  58. 0x00,0x00
  59. };
  60. uchar code music2[] ={                          //歌曲為小星星

  61. 0x21,0x10,0x21,0x10,
  62. 0x25,0x10,0x25,0x10,
  63. 0x26,0x10,0x26,0x10,
  64. 0x25,0x20,0x24,0x10,
  65. 0x24,0x10,0x23,0x10,
  66. 0x23,0x10,0x22,0x10,
  67. 0x22,0x10,0x21,0x20,
  68. 0x25,0x10,0x25,0x10,
  69. 0x24,0x10,0x24,0x10,
  70. 0x23,0x10,0x23,0x10,
  71. 0x22,0x20,
  72. 0x25,0x10,0x25,0x10,
  73. 0x24,0x10,0x24,0x10,
  74. 0x23,0x10,0x23,0x10,
  75. 0x22,0x20,
  76. 0x21,0x10,0x21,0x10,
  77. 0x25,0x10,0x25,0x10,
  78. 0x26,0x10,0x26,0x10,
  79. 0x25,0x20,0x24,0x10,
  80. 0x24,0x10,0x23,0x10,
  81. 0x23,0x10,0x22,0x10,
  82. 0x22,0x10,0x21,0x20,
  83. 0x00,0x00
  84. };
  85. uchar code music3[] ={                           //歌曲為天空之城
  86. 0x16,0x05,0x17,0x05,
  87. 0x21,0x15,0x17,0x05,
  88. 0x21,0x10,0x23,0x10,
  89. 0x17,0x30,0x23,0x10,
  90. 0x16,0x15,0x15,0x05,
  91. 0x16,0x10,0x21,0x10,
  92. 0x15,0x30,0x13,0x10,
  93. 0x14,0x15,0x13,0x05,
  94. 0x14,0x05,0x21,0x05,
  95. 0x21,0x10,0x13,0x30,
  96. 0x21,0x10,0x17,0x10,
  97. 0x14,0x05,0x14,0x10,
  98. 0x17,0x10,0x17,0x20,
  99. 0xff,
  100. 0x16,0x05,0x17,0x05,
  101. 0x21,0x15,0x17,0x05,
  102. 0x21,0x10,0x23,0x10,
  103. 0x17,0x30,0x13,0x05,
  104. 0x13,0x05,0x16,0x15,
  105. 0x15,0x05,0x16,0x10,
  106. 0x21,0x10,0x15,0x30,
  107. 0x13,0x10,0x14,0x10,
  108. 0x21,0x05,0x17,0x05,
  109. 0x17,0x10,0x21,0x10,
  110. 0x22,0x10,0x23,0x05,
  111. 0x21,0x20,0xff,
  112. 0x21,0x05,0x17,0x05,
  113. 0x16,0x10,0x17,0x10,
  114. 0x15,0x10,0x16,0x20,
  115. 0xff,
  116. 0x21,0x05,0x22,0x05,
  117. 0x23,0x15,0x22,0x10,
  118. 0x23,0x10,0x24,0x10,
  119. 0x25,0x05,0x22,0x30,
  120. 0x15,0x10,0x22,0x03,
  121. 0x21,0x03,0x17,0x03,
  122. 0x21,0x03,0x21,0x10,
  123. 0x21,0x05,0x22,0x10,
  124. 0x23,0x05,0x23,0x40,
  125. 0x16,0x05,0x17,0x05,
  126. 0x21,0x10,0x17,0x05,
  127. 0x21,0x05,0x22,0x10,
  128. 0x21,0x15,0x15,0x05,
  129. 0x15,0x20,0x24,0x10,
  130. 0x23,0x10,0x22,0x10,
  131. 0x21,0x10,0x23,0x30,
  132. 0x16,0x05,0x17,0x05,
  133. 0x21,0x15,0x17,0x05,
  134. 0x21,0x10,0x23,0x10,
  135. 0x17,0x30,0x13,0x10,
  136. 0x16,0x15,0x15,0x05,
  137. 0x16,0x10,0x21,0x10,
  138. 0x15,0x30,0x13,0x10,
  139. 0x14,0x10,0x21,0x05,
  140. 0x17,0x05,0x17,0x10,
  141. 0x21,0x10,0x22,0x10,
  142. 0x23,0x05,0x21,0x05,
  143. 0x21,0x20,0x21,0x05,
  144. 0x17,0x05,0x16,0x10,
  145. 0x17,0x10,0x15,0x10,
  146. 0x16,0x40,0x00,0x00
  147. };
  148. uchar code quzi[] ={          //此數組數據為各個音符在定時器中的重裝值,第一列是高位,第二列是低位        //時間
  149. 0xf8,0x8c,          //低八度,低1
  150. 0xf9,0x5b,          
  151. 0xfa,0x15,          //低3
  152. 0xfa,0x67,
  153. 0xfb,0x04,          //低5
  154. 0xfb,0x90,
  155. 0xfc,0x0c,          //低7       
  156. 0xfc,0x44,          //中央C調
  157. 0xfc,0xac,          //中2
  158. 0xfd,0x09,
  159. 0xfd,0x34,          //中4
  160. 0xfd,0x82,
  161. 0xfd,0xc8,          //中6
  162. 0xfe,0x06,
  163. 0xfe,0x22,          //高八度,高1       
  164. 0xfe,0x56,
  165. 0xfe,0x6e,          //高3
  166. 0xfe,0x9a,
  167. 0xfe,0xc1,          //高5
  168. 0xfe,0xe4,
  169. 0xff,0x03            //高7
  170. };
  171. /**********************
  172. 函數名稱:void delay(unsigned int xms)
  173. 功能描述:延時
  174. 入口參數:xms:輸入需要延時的毫秒值
  175. 出口參數:無
  176. 備注:

  177. ***********************/
  178. void delay(unsigned int xms)
  179. {
  180.         uint i,j;                                                  
  181.          for(i=xms;i>0;i--)
  182.                  for(j=124;j>0;j--);
  183. }
  184. /**********************
  185. 函數名稱:uchar quyin(uchar tem)
  186. 功能描述:在quzi數組中,找到music數組定義的簡譜音符的重裝值,并返回其在quzi數組中的位置
  187. 入口參數:tem:music數組中定義的簡譜音符
  188. 出口參數:返回的是tem音符在quzi數組中的位置值
  189. 備注:

  190. ***********************/
  191. uchar quyin(uchar tem)
  192. {
  193.         uchar qudiao,jp,weizhi;                  //定義曲調,音符和位置
  194.         qudiao=tem/16;                                  //高4位是曲調值
  195.         jp=tem%16;                                           //低4位是音符
  196.         if(qudiao==1)                                  //當曲調值為1時,即是低八度,低八度在quzi數組中基址為0
  197.                 qudiao=0;
  198.         else if(qudiao==2)                          //當曲調值為2時,即是中八度,中八度在quzi數組中基址為14
  199.                 qudiao=14;
  200.         else if(qudiao==3)                          //當曲調值為3時,即是高八度,高八度在quzi數組中,基址為28
  201.                 qudiao=28;
  202.         weizhi=qudiao+(jp-1)*2;                  //通過基址加上音符作為偏移量,即可定位此音符在quzi數組中的位置
  203.         return weizhi;                                  //返回這一個位置值
  204. }
  205. /**********************
  206. 函數名稱:void playmusic()
  207. 功能描述:播放音樂
  208. 入口參數:無
  209. 出口參數:無
  210. 備注:

  211. ***********************/
  212. void playmusic()
  213. {
  214.         uchar p,m,tem;   //m為節拍      
  215.         while(1)   
  216.         {   
  217.                 if(flag==1)                                          //若播放的標志位為1則播放音樂
  218.                 {
  219.                         if(gequ==0)                                  //歌曲選擇位為0,則播放第一首歌
  220.                         {       
  221.                                 p=music1[jindu];             
  222.                                 if(p==0x00)                          //如果碰到結束符,延時1秒,回到開始再來一遍
  223.                                 {
  224.                                         jindu=0;
  225.                                         delay(1000);
  226.                                         break;
  227.                                 }        
  228.                                 else if(p==0xff)           //若碰到休止符,延時100ms,繼續取下一音符
  229.                                 {
  230.                                         jindu=jindu+1;
  231.                                         delay(100);
  232.                                         TR0=0;
  233.                                         break;
  234.                                 }      
  235.                                 else                                   //正常情況下取音符和節拍
  236.                                 {
  237.                                         tem=quyin(music1[jindu]);                //取出當前音符在quzi數組中的位置值
  238.                                         timeh=quzi[tem];                                //把音符相應的計時器重裝載值賦予timeh和timel
  239.                                         timel=quzi[tem+1];
  240.                                         jindu++;
  241.                                         TH0=timeh;                                                //把timeh和timel賦予計時器
  242.                                         TL0=timel;
  243.                                         m=music1[jindu];                                         //取得節拍
  244.                                         jindu++;
  245.                                 }                    
  246.                     TR0=1;                            //開定時器0   
  247.                                 delay(m*180);                                      //等待節拍完成, 通過P3^4口輸出音頻   
  248.                                 TR0=0;                            //關定時器0
  249.                                 beep=0;                                                          //使beep端口置0,起保護蜂鳴器作用
  250.                         }                                                                               
  251.                         else if(gequ==1)                   //歌曲選擇位為1,則播放小星星
  252.                         {       
  253.                                 p=music2[jindu];            
  254.                                 if(p==0x00)                         //如果碰到結束符,延時1秒,回到開始再來一遍
  255.                                 {
  256.                                         jindu=0;
  257.                                         delay(1000);
  258.                                         break;
  259.                                 }        
  260.                                 else if(p==0xff)   //若碰到休止符,延時100ms,繼續取下一音符
  261.                                 {
  262.                                         jindu=jindu+1;
  263.                                         delay(100);
  264.                                         TR0=0;
  265.                                         break;
  266.                                 }      
  267.                                 else                           //正常情況下取音符和節拍
  268.                                 {
  269.                                         tem=quyin(music2[jindu]);                //取出當前音符在quzi數組中的位置值
  270.                                         timeh=quzi[tem];                        //把音符相應的計時器重裝載值賦予timeh和timel
  271.                                         timel=quzi[tem+1];
  272.                                         jindu++;
  273.                                         TH0=timeh;                                        //把timeh和timel賦予計時器
  274.                                         TL0=timel;
  275.                                         m=music2[jindu];                                         //取得節拍
  276.                                         jindu++;
  277.                                 }                    
  278.                         TR0=1;                    //開定時器1   
  279.                                 delay(m*300);             //等待節拍完成, 通過P3^4口輸出音頻   
  280.                                 TR0=0;                    //關定時器1
  281.                                 beep=0;                                          //使beep端口置0,起保護蜂鳴器作用
  282.                         }
  283.                         else if(gequ==2)                  //歌曲選擇位為2,則播放天空之城
  284.                         {       
  285.                                 p=music3[jindu];            
  286.                                 if(p==0x00)                         //如果碰到結束符,延時1秒,回到開始再來一遍
  287.                                 {
  288.                                         jindu=0;
  289.                                         delay(1000);
  290.                                         break;
  291.                                 }        
  292.                                 else if(p==0xff)   //若碰到休止符,延時100ms,繼續取下一音符
  293.                                 {
  294.                                         jindu=jindu+1;
  295.                                         delay(100);
  296.                                         TR0=0;
  297.                                         break;
  298.                                 }      
  299.                                 else                           //正常情況下取音符和節拍
  300.                                 {
  301.                                         tem=quyin(music3[jindu]);                //取出當前音符在quzi數組中的位置值
  302.                                         timeh=quzi[tem];                        //把音符相應的計時器重裝載值賦予timeh和timel
  303.                                         timel=quzi[tem+1];
  304.                                         jindu++;
  305.                                         TH0=timeh;                                        //把timeh和timel賦予計時器
  306.                                         TL0=timel;
  307.                                         m=music3[jindu];                                         //取得節拍
  308.                                         jindu++;
  309.                                 }                    
  310.                     TR0=1;                    //開定時器1   
  311.                                 delay(m*200);             //等待節拍完成, 通過P3^4口輸出音頻   
  312.                                 TR0=0;                    //關定時器1
  313.                                 beep=0;                                          //使beep端口置0,起保護蜂鳴器作用
  314.                         }
  315.                 }
  316.                 else                                                           //播放標志位不為1時,暫停播放音樂
  317.                 while(flag!=1);   
  318.         }
  319. }
  320. /**********************
  321. 函數名稱:void init_sys()
  322. 功能描述:系統初始化,功能是配置IO口
  323. 入口參數:無
  324. 出口參數:無
  325. 備注:

  326. ***********************/
  327. void init_sys()
  328. {
  329.         P0M0=0xff;                           //設置推挽模式
  330.         P0M1=0x00;
  331.         P2M0=0x08;
  332.         P2M1=0x00;
  333.         P3M0=0x10;
  334.         P3M1=0x00;
  335.         P4M0=0x00;
  336.         P4M1=0x00;
  337.         P5M0=0x00;
  338.         P5M1=0x00;
  339. }
  340. /**********************
  341. 函數名稱:void init()
  342. 功能描述:定時器和外部中斷的初始化
  343. 入口參數:無
  344. 出口參數:無
  345. 備注:

  346. ***********************/
  347. void init()                                                  
  348. {
  349.         TMOD=0x01;                          //設置定時器0,定時方式1,16位手動重裝模式(TH0和TL0全用)
  350.         TH0=0xD8;                          //設置定時初值
  351.         TL0=0xEF;
  352.         IE=0x8f;                          // 1000 1111  EA=1(打開總的終中斷),ET1=1(定時器1中斷使能),EX0=1(外部中斷0使能),ET0=1(定時器0中斷使能),EX1=0(外部中斷1使能);
  353.         IP=0x02;                          // 0000 0010  PT0=1;   定時器0優先級高
  354.         TR0=0;                                  //定時器0停止工作,初始化
  355.         beep=0;                                  //使beep端口置0,起保護蜂鳴器作用
  356.        
  357.         flag0=0;
  358.         count=0;
  359.        
  360.         show_w1=0;
  361.         show_w2=1;
  362.         show_w3=2;
  363.         show_w4=3;
  364.         show_w5=4;
  365.         show_w6=5;
  366.         show_w7=6;
  367.         show_w8=7;//賦初值,為接下來取模做準備
  368. }
  369. void main()
  370. {
  371.         init_sys();                          //系統初始化
  372.         init();
  373.         P0=0x00;      //P0口初始化
  374.         key1=1;                                //三個按鍵設為輸入狀態,檢測中斷
  375.         key2=1;
  376.         key3=1;
  377.         flag=0;                                //播放標志位清零
  378.        
  379.         TMOD=0x90;//定時器1,方式1
  380.         ET1=1;//開啟定時器1中斷       
  381.         pinlv_flag=0;
  382.         pinlv=100;

  383.         TH1=(65535-1000)/256;//定時器1的高八位設置
  384.         TL1=(65535-1000)%256;//定時器1的低八位設置,這里總體就是設置定時器0的初始值是1ms
  385.         TR1=1;//啟動定時器1
  386.         EA=1;//打開總的中斷
  387.        
  388.         while(1)
  389.         {
  390.                 playmusic();        //播放音樂函數
  391.         }
  392. }                                                                       
  393. /**********************
  394. 函數名稱:void tim1() interrupt 1
  395. 功能描述:定時器0中斷處理,重新裝值,并把beep值取反,產生方波
  396. 入口參數:無
  397. 出口參數:無
  398. 備注:

  399. ***********************/
  400. void tim1() interrupt 1                                                //計時器控制頻率
  401. {
  402.         TH0=timeh;                                                                //賦初值
  403.         TL0=timel;
  404.         beep=~beep;                                                           //中斷使得beep翻轉產生方波
  405. }
  406. /**********************
  407. 函數名稱:void ex1() interrupt 0
  408. 功能描述:按下按鍵1的外部中斷,對標志位取反,功能是暫停和播放音樂
  409. 入口參數:無
  410. 出口參數:無
  411. 備注:

  412. ***********************/
  413. void ex1() interrupt 0                                          
  414. {
  415.         delay(5);               
  416.         if(key1==0)                                                         //判斷key1是否按下          
  417.         {
  418.                 delay(5);              //按鍵消抖
  419.                 if(key1==0)
  420.                 {
  421.                         while(!key1);
  422.                         flag=~flag;                                         //播放中斷位取反,播放或者暫停
  423.                 }
  424.         }
  425. }
  426. /**********************
  427. 函數名稱:void ex2() interrupt 2
  428. 功能描述:按下按鍵2的外部中斷,作用為切換歌曲
  429. 入口參數:無
  430. 出口參數:無
  431. 備注:

  432. ***********************/
  433. void ex2() interrupt 2
  434. {
  435.         delay(5);
  436.         if(key2==0)                                    //按鍵key2按下,切換歌曲
  437.         {
  438.                 jindu=0;                           //歌曲的進度清零,從頭開始演唱
  439.                 gequ++;                                   //下一曲
  440. ……………………

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

所有資料51hei提供下載:
final_4.rar (46.47 KB, 下載次數: 97)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:349092 發表于 2018-6-10 22:50 | 只看該作者
        共享資料的黑幣獎勵!
回復

使用道具 舉報

板凳
ID:606316 發表于 2019-9-2 11:22 | 只看該作者
大神牛B!!!!!!!!!!!!!!
回復

使用道具 舉報

地板
ID:369306 發表于 2019-12-23 19:47 | 只看該作者
強強強,拿去參考了  又學到了
回復

使用道具 舉報

5#
ID:560110 發表于 2020-1-15 21:55 | 只看該作者
共享資料的黑幣獎勵!
回復

使用道具 舉報

6#
ID:230847 發表于 2020-1-25 12:42 | 只看該作者
參考一下,自己打了5塊板子,準備制作一下音樂播放器。謝謝
回復

使用道具 舉報

7#
ID:383526 發表于 2020-4-19 12:37 | 只看該作者
感謝大佬
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级视频在线播放 | 国产一区三区在线 | 亚洲综合久久精品 | 精品久久久久久亚洲精品 | 久久久久国产一区二区三区四区 | 嫩草影院黄 | 福利社午夜影院 | 国产欧美一区二区三区日本久久久 | 91电影在线播放 | av网站在线播放 | 成人午夜黄色 | 丝袜 亚洲 欧美 日韩 综合 | 久国久产久精永久网页 | 在线视频一区二区 | 久久久亚洲成人 | 欧产日产国产精品99 | 国产情侣激情 | 亚洲人在线| 自拍偷拍中文字幕 | 久久久资源 | 国产日韩欧美 | 婷婷久久综合 | 在线欧美激情 | 男女国产视频 | 中文字幕第九页 | 91精品国产麻豆 | 欧美一区二区三区在线看 | 国产精品高潮呻吟久久 | 国产传媒| 亚洲国产成人在线视频 | 男女国产网站 | 黄色网址大全在线观看 | 国产高清在线精品 | 日韩高清一区 | 在线欧美| 日本三级网 | 久久久国产精品一区 | 日韩欧美一区二区三区免费观看 | 国产精品99久久久久久人 | 欧美在线日韩 | 成人久久18免费网站图片 |