找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1051|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机八音盒程序不能播放歌曲

[复制链接]
跳转到指定楼层
楼主
这个跑马灯音乐盒为啥不能播放歌曲
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit key1=P3^2;//定义按key1可切换花样                                                                  
  5. sbit key2=P3^3;//定义按key2可切换歌曲
  6. sbit fm=P3^5;//蜂鸣器连续的IO口,接蜂鸣器的管脚
  7. //sbit fm=P3^6;
  8. uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
  9.                          0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};                                //花样1
  10. uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,0xef,0xfb,0xdf,0xfd,0xbf,0xfe};              //花样2
  11. uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0x00};//花样3
  12. uchar code huayang4[]={ 0x3f,0xcf,0xf3,0xfc,0xfc,0xf3,0xcf,0x3f,0x3f,0xf3,0xcf,0xfc,0x3f,0xf3,0xcf,0xfc};    //花样4
  13. uchar code huayang5[]={ 0xff,0x00,0xff,0x00,0xf0,0x0f,0xf0,0x0f,0xf0,0x0f,0xf0,0x0f};                        //花样5
  14.                                                                                                                                                                         
  15. uchar count1;//花样标志        
  16. uchar count2;//歌曲标志        
  17. uchar timeh,timel,i;                                                                 
  18. //---------------------------简谱---------------------------------------
  19. //编程规则:字节高位是简谱,低位是持续时间,代表多少个十六分音符。
  20. //1-7代表中央C调,8-E代表高八度,0代表停顿
  21. //最后的0是结束标志
  22. uchar code qnzl[]={         //        歌曲1
  23. 0xA1,0xA1,0xA1,0xA1,0x32,0x31,0x21,0x32,0x62,
  24. 0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0x32,0x22,
  25. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  26. 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
  27. 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
  28. 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
  29. 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
  30. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  31. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  32. 0x42,0x63,0x83,0x83,0x91,0x91,
  33. 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
  34. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  35. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  36. 0x42,0x82,0x88,0x02,0x74,0x93,0x89,
  37. 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
  38. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  39. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  40. 0x42,0x63,0x83,0x83,0x91,0x91,
  41. 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
  42. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  43. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  44. 0x42,0x82,0x88,0x02,0x74,0x93,0x89,
  45. 0xff};//结束标志
  46. uchar code jmszl[]={ // 歌曲二
  47. 0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
  48. 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
  49. 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,
  50. 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
  51. 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
  52. 0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
  53. 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
  54. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
  55. 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,                                                                                                                                 
  56. 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
  57. 0x51,0x51,0x51,0x51,0x31,0x61,0x53,        
  58. 0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
  59. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
  60. 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
  61. 0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
  62. 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,
  63. 0xff};
  64. uchar code song1 []=   //歌曲三
  65. {
  66. 0x34,0x32,0x32,0x34,0x42,0x51,
  67. 0x62,0x52,0x42,0x32,0x34,0x04,
  68. 0x74,0x74,0x62,0x62,0x64,
  69. 0x3c,0x04,
  70. 0x64,0x62,0x52,0x42,0x32,0x34,
  71. 0x33,0x31,0x32,0x72,0x76,0x72,
  72. 0x83,0x81,0x82,0x82,0x82,0x74,0x72,
  73. 0x7c,0x04,
  74. 0x63,0x61,0x62,0x62,0x64,0x72,0x82,
  75. 0x72,0x74,0x72,0x62,0x52,0x42,0x32,
  76. 0x42,0x44,0x42,0x42,0x52,0x62,0x52,
  77. 0x5c,0x04,
  78. 0x64,0x62,0x62,0x64,0x72,0x82,
  79. 0x72,0x74,0x72,0x62,0x52,0x42,0x32,
  80. 0x42,0x46,0x53,0x41,0x42,0x32,
  81. 0x3c,0x04,
  82. 0xFF};
  83. uchar code song2[]={0x12,0x52,0x52,0x52,0x56,0x42,        // 歌曲四
  84. 0x32,0x42,0x32,0x22,0x18,
  85. 0x82,0x82,0x82,0x82,0x86,0x72,
  86. 0xB2,0x72,0x72,0x62,0x58,
  87. 0x52,0x82,0x82,0x72,0x56,0x42,
  88. 0x32,0x42,0x32,0x22,0x16,0xB2,
  89. 0xB2,0x32,0x32,0x22,0x16,0x52,
  90. 0x42,0x32,0x22,0xC2,0x88,
  91. 0xFF};
  92. uchar code song3 []={         //        歌曲五
  93. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA6,
  94. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA6,
  95. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
  96. 0xff };
  97. //----------------------------简谱音调对应的定时器初值---------------------------
  98. //适合11.0592M的晶振,对定时器置入的初值
  99. uchar code cuzhi[]={
  100.          0xff,0xff,//占位用的,没有实际的意义
  101.          0xFC,0x8E,//中央C调1-7
  102.          0xFC,0xED,        
  103.          0xFD,0x43,        
  104.          0xFD,0x6A,        
  105.          0xFD,0xB3,        
  106.          0xFD,0xF3,        
  107.          0xFE,0x2D,
  108.          0xFE,0x47,        //高八度1-7         
  109.          0xFE,0x76,
  110.          0xFE,0xA1,
  111.          0xFE,0xC7,        
  112.          0xFE,0xD9,
  113.          0xFE,0xF9,
  114.          0xFF,0x16
  115.          };
  116. uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
  117. //将音调转化为对应的LED样式
  118. void delay1(uint z);        //延时1MS
  119. void delay(uint z);        //延时165MS,即十六分音符
  120. void song();
  121. void beep();//蜂鸣器叫一声
  122. main()
  123. {        uchar x;
  124.         count1=1;//流水灯花样
  125.         count2=0;//不唱歌
  126.         EA=1;//开总中断
  127.         EX0=1;//开外部中断0
  128.         IT0=1;//外部中断0下降沿触发方式
  129.         EX1=1;//开外部中断1
  130.         IT1=1;//外部中断1下降沿触发方式

  131.         TMOD=0x01;//定时器0工作在方式1
  132.         TH0=0;
  133.         TL0=0;
  134.         ET0=1;
  135.         
  136.         while(1)
  137.         {
  138.                 if(count1!=0)
  139.                 {
  140.                         switch(count1)
  141.                         {
  142.                                 case 1:
  143.                                         for(x=0;x<25;x++)
  144.                                         {
  145.                                                 P1=huayang1[x]; //花样流水灯1
  146.                                                 beep();
  147.                                                 delay1(150);
  148.                                                 if(count1!=1)
  149.                                                         break;        
  150.                                         }
  151.                                 break;
  152.                                 case 2:
  153.                                         for(x=0;x<14;x++)
  154.                                         {
  155.                                                 P1=huayang2[x];//花样流水灯2
  156.                                                 beep();
  157.                                                 delay1(300);
  158.                                                 if(count1!=2)
  159.                                                         break;        
  160.                                         }
  161.                                 break;
  162.                                 case 3:
  163.                                         for(x=0;x<17;x++)
  164.                                         {
  165.                                                 P1=huayang3[x];//花样流水灯3
  166.                                                 beep();
  167.                                                 delay1(150);
  168.                                                 if(count1!=3)
  169.                                                         break;        
  170.                                         }
  171.                                 break;
  172.                                 case 4:
  173.                                         for(x=0;x<16;x++)
  174.                                         {
  175.                                                 P1=huayang4[x];//花样流水灯4
  176.                                                 beep();
  177.                                                 delay1(300);
  178.                                                 if(count1!=4)
  179.                                                         break;                                       
  180.                                         }
  181.                                 break;
  182.                                 case 5:
  183.                                         for(x=0;x<12;x++)
  184.                                         {
  185.                                                 P1=huayang5[x];//花样流水灯5
  186.                                                 beep();
  187.                                                 delay1(300);
  188.                                                 if(count1!=5)
  189.                                                         break;                                       
  190.                                         }
  191.                                 break;
  192.                         }
  193.                 }
  194.                 else
  195.                 {
  196.                         song();
  197.                         delay1(1000);
  198.                 }
  199.         }
  200.                                  
  201. }
  202. void int0() interrupt 0
  203. {
  204.         EA=0;//关总中断
  205.         delay1(1);//去抖
  206.         if(key1==0)
  207.         {
  208.                 count2=0;//不让蜂鸣器唱歌
  209.                 TR0=0;
  210.                 count1++;
  211.                 if(count1==6)
  212.                          count1=1;

  213.         }
  214.         EA=1;//开总中断
  215. }
  216. void int1() interrupt 2  //外部中断1
  217. {
  218.         EA=0;//关总中断
  219.         delay1(1);//去抖
  220.         if(key2==0)
  221.         {
  222.                 count1=0;//流水灯无花样
  223.                 TR0=1;
  224.                 i=0;//从头开始唱
  225.                 count2++;
  226.                 if(count2==6)
  227.                          count2=1;
  228.         }
  229.         EA=1;//开总中断
  230. }

  231. //---------------.按照51单片机的中断向量顺序编的号,也是缺省状态下的优先级------------
  232. //外部中断0 interrupt 0
  233. //定时器0     interrupt 1
  234. //外部中断1 interrupt 2
  235. //定时器1     interrupt 3
  236. //串口中断   interrupt 4
  237. //定时器2     interrupt 5
  238. void timer0() interrupt 1         //用于产生各种音调 定时器0
  239. {
  240.         TH0=timeh;
  241.         TL0=timel;
  242.         fm=~fm;
  243. }
  244. void song()
  245. {
  246.         uint temp;
  247.         uchar jp; //简谱
  248.         i=0;
  249.         while(1)
  250.         {        if(count2==0)
  251.                 {        
  252.                         break;
  253.                 }
  254.                 if(count2==1)          //选曲1
  255.                         { temp=qnzl [i];}        
  256.                 if(count2==2)    //选曲2
  257.                         temp=jmszl[i];
  258.                 if(count2==3)     //选曲3
  259.                         temp=song1 [i];
  260.                 if(count2==4)    //选曲4
  261.                         temp=song2 [i];
  262.                 if(count2==5)   //选曲5
  263.                         temp=song3 [i];        
  264.                 if(temp==0xff)
  265.                         break;
  266.                         
  267.                 jp=temp/16; //取数的高4位
  268.                 P1=yinyue[jp];
  269.                 if(jp!=0)
  270.                 {
  271.                 timeh=cuzhi[jp*2];
  272.                 timel=cuzhi[jp*2+1];
  273.                 }
  274.                 else
  275.                 {
  276.                 TR0=0;
  277.                 fm=1;//关蜂鸣器
  278.                 }
  279.                 delay(temp%16); //取数的低4位
  280.                 TR0=0;         //唱完一个音停10MS
  281.                 fm=1;
  282.                 delay1(10);
  283.                 TR0=1;
  284.                 i++;
  285.         }
  286.         TR0=0;
  287.         fm=1;
  288.         
  289. }
  290. void delay(uint z)        //延时165MS,即十六分音符
  291. {        uint x,y;
  292.         for(x=z;x>0;x--)
  293.                  for(y=19000;y>0;y--);
  294. }

  295. void delay1(uint z)        //延时1ms
  296. {        uint x,y;
  297.         for(x=z;x>0;x--)
  298.                  for(y=112;y>0;y--);
  299. }
  300. void beep()        //蜂鸣器叫一声
  301. {        uchar i;
  302.         for(i=0;i<50;i++)
  303.         {        fm=~fm;
  304.                 delay1(1);
  305.         }
  306.         fm=1;
  307. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:748788 发表于 2020-12-17 21:32 | 只看该作者
程序没有问题,可能是你的线路有问题。下图是仿真截图:


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表