找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的这个单片机音乐盒在proteus里不能响? 求帮助

[复制链接]
跳转到指定楼层
楼主

  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit key1=P3^2;  /*暂停键 */
  5. sbit key2=P3^3;  /* 切换歌曲键*/
  6. sbit fm=P1^1;  /*蜂鸣器口*/
  7. sbit MOD=P1^7;
  8. uchar count=0; /*歌曲标志*/
  9. uchar timeh,timel,i;

  10. uchar code DSY_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  11.                                                 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x70};  
  12. uint code tone_delay_table[]={ 64021,64103,64260,64400,64524,64580,64684,
  13.                                                         64777,64820,64898,64968,65030,65058,65110,65157,65178};/*每个音符对应的延迟*/
  14. uchar code huayang[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x0f,0xf0,0x00};

  15. void delay_ms(uchar x) /*延迟函数*/
  16. {
  17.         uchar i;
  18.         while(x--)
  19.         for(i=0;i<120;i++);
  20. }


  21. uchar code qnzl[]={   /*千年之恋*/
  22. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
  23. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  24. 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,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,0xff          /*结束标志*/
  37. };
  38. uchar code jmszl[]={ /*寂寞沙洲冷*/
  39. 0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
  40. 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
  41. 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
  42. 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
  43. 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
  44. 0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
  45. 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
  46. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
  47. 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
  48. 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
  49. 0x51,0x51,0x51,0x51,0x31,0x61,0x53,
  50. 0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
  51. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
  52. 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
  53. 0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
  54. 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,0xff  /*结束标志*/
  55. };
  56. uchar code qizige[]={  /*七子之歌*/
  57. 0x54,0x32,0x52,0x32,0x54,0x62,0x52,0x32,0x62,0x54,
  58. 0x14,0x12,0x22,0x34,0x52,0x32,0x02,0x32,0x58,
  59. 0x52,0x52,0x62,0x52,0x32,0x54,0x52,0x62,0x52,0x82,0x62,0x58,
  60. 0x14,0x52,0x32,0x22,0x12,0x24,0x32,0x54,0x2,0x22,0x34,0x1f,0x18,
  61. 0x04,0x54,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x62,0x81,0xa2,0x82,0x9c,
  62. 0x02,0x52,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x64,0xa2,0x92,0x9f,
  63. 0xa4,0x92,0x81,0x62,0x52,0x54,0x84,0x62,0x52,0x32,0x22,0x14,
  64. 0x04,0x22,0x32,0x58,0x58,0x04,0x52,0x62,0x8f,
  65. 0xff /*结束标志*/
  66. };
  67. uchar code ganen[]={ /*感恩的心*/
  68. 0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x72,0x62,0x54,
  69. 0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,
  70. 0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x92,0x82,0x54,
  71. 0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,
  72. 0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,
  73. 0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,
  74. 0x31,0x52,0x51,0x52,0x31,0x51,0x58,0x31,0x82,0x81,0x82,0x31,0x61,0x68,
  75. 0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,
  76. 0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,0x62,0x94,0x82,0x94,
  77. 0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94,
  78. 0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,
  79. 0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88,
  80. 0xff  /*结束标志*/
  81. };
  82. uchar code cuzhi[]={
  83.                                         0xff,0xff,                                                0xFC,0x8E,                                                 0xFC,0xED,
  84.                                         0xFD,0x43,
  85.                                         0xFD,0x6A,
  86.                                         0xFD,0xB3,
  87.                                         0xFD,0xF3,
  88.                                         0xFE,0x2D,
  89.                                         0xFE,0x47,                                                 0xFE,0x76,
  90.                                         0xFE,0xA1,
  91.                                         0xFE,0xC7,
  92.                                         0xFE,0xD9,
  93.                                         0xFE,0xF9,
  94.                                         0xFF,0x16
  95.                                         };
  96. void delay1(uint z); /*         延时1MS*/
  97. void delay(uint z);  /*延时165ms,既16分音符*/
  98. void song();

  99. void main()
  100. {
  101.         P0=0xbf;
  102.         EA=1;
  103.         EX0=1;
  104.         IT0=1;
  105.         EX1=1;
  106.         IT1=1;
  107.         TMOD=0x01;
  108.         TH0=0;
  109.         TL0=0;
  110.         ET0=1;
  111.         while(1)
  112.         {
  113.             if(MOD==0)
  114.                 {
  115.                   count++;
  116.                   if(count==5)
  117.                   count=1;
  118.                 }
  119.                 if(count!=0)
  120.                 {
  121.                         song();
  122.                         delay1(1000);
  123.                 }
  124.         
  125.         }
  126. }

  127. void int0() interrupt 0
  128. {
  129.         EA=0;
  130.         delay1(1);
  131.         if(key1==0)
  132.         {
  133.                 count=0;/*暂停音乐*/
  134.                 TR0=0;
  135.         }
  136.         EA=1;
  137. }

  138. void int1() interrupt 2
  139. {
  140.         TR0 = 0;        
  141.         delay1(1);  /*去抖*/
  142.         if(key2==0)
  143.         {
  144.                 i=0;/*从头开始唱*/
  145.                 count++;
  146.                 TR0=~TR0;
  147.                 if(count==5)
  148.                 count=0;
  149.         }
  150. }

  151. void timer0() interrupt 1/*用于产生各种音调*/
  152. {

  153.         if(count!=0) //放音乐
  154.         {
  155.                 TH0=timeh;
  156.                 TL0=timel;
  157.                 fm=~fm;
  158.         }
  159. }

  160. void song()
  161. {
  162.         uint temp;
  163.         uchar jp;
  164.         i=0;
  165.         while(1)
  166.         {
  167.                 if(count==0)
  168.                 {
  169.                         break;
  170.                 }
  171.                 if(count==1)  //选曲
  172.                 temp=jmszl[i];
  173.                 if(count==2)
  174.                 temp=qnzl[i];
  175.                 if(count==3)
  176.                 temp=qizige[i];
  177.                 if(count==4)
  178.                 temp=ganen[i];
  179.                 if(temp==0xff)
  180.                 break;
  181.                 jp=temp/16;
  182.                 P2 = huayang[jp];
  183.                 P0=DSY_table[count];
  184.                 if(jp!=0)
  185.                 {
  186.                         timeh=cuzhi[jp*2];
  187.                         timel=cuzhi[jp*2+1];
  188.                 }
  189.                 else
  190.                 {
  191.                         TR0=0;
  192.                         fm=1;
  193.                 }
  194.                 delay(temp%16);
  195.                 TR0=0;
  196.         
  197.                 fm=1;
  198.                 delay1(10);
  199.                 TR0=1;
  200.                 i++;
  201.         }
  202.         TR0=0;
  203.         fm=1;
  204. }

  205. void delay(uint z)/*延时165ms,既16分音符*/
  206. {
  207.         uint x,y;
  208.         for(x=z;x>0;x--)
  209.                 for(y=19000;y>0;y--);
  210. }

  211. void delay1(uint z)/*延时1ms*/
  212. {
  213.         uint x,y;
  214.         for(x=z;x>0;x--)
  215.         for(y=112;y>0;y--);
  216. }
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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