新手求助:数字音乐盒程序不能实现功能

2019-07-15 17:04发布

  1. #include <reg51.h>        //51单片机头文件
  2. #include "L1602.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^0;        //LCD1602数据/命令选择端(H/L)
  6. sbit RW=P2^1;        //LCD1602读/写选择端(H/L)
  7. sbit E=P2^2;        //LCD1602使能信号端
  8. sbit BEEP=P2^7;        //蜂鸣器接口
  9. sbit k1=P1^0;        //下一首
  10. sbit k2=P1^1;        //上一首
  11. sbit k3=P1^2;        //播放/暂停
  12. sbit k4=P1^3;        //复位
  13. char count2;        //歌曲标志
  14. typedef unsigned char BYTE;
  15. typedef unsigned int WORD;
  16. uchar a,b,c,aa,num;
  17. uchar num1,num2,t;
  18. uchar code dis0[]=" Welcome to use ";
  19. uchar code dis01[]="   Musical Box  ";
  20. uchar code time[]="  TIME   00:00  ";
  21. uchar code dis1[]="   qiang nian   ";
  22. uchar code dis2[]=" ji mo sha zhou ";
  23. uchar code dis3[]="    wei  yi     ";
  24. uchar code dis4[]="qi kai de sheng ";
  25. uchar second=00,minute=00;
  26. void clock_init()
  27. {
  28.         uchar i,j;
  29.         write_com(0x80);
  30.         for(i=0;i<16;i++)
  31.         {
  32.                 write_data(dis0[i]);
  33.         }
  34.                 write_com(0x80+0x40);
  35.         for(j=0;j<16;j++)
  36.         {
  37.                 write_data(dis01[j]);
  38.         }
  39. }
  40. void write_sfm(uchar add,uchar sum)
  41. {
  42.         uchar shi,ge;
  43.         shi=sum/10;
  44.         ge=sum%10;
  45.         write_com(0x80+add);
  46.         write_data(0x30+shi);
  47.         write_data(0x30+ge);
  48. }
  49. void clock_write(uint s,uint m)
  50. {
  51.         write_sfm(0x49,m);
  52.         write_sfm(0x4b,s);
  53. }
  54. //---------------------------简谱---------------------------------------
  55. //编程规则:字节高位是简谱,低位是持续时间,
  56. //代表多少个十六分音符
  57. //1-7代表中央C调,8-E代表高八度,0代表停顿
  58. //最后的0是结束标志
  59. uchar code table1[]={        //千年之恋
  60.         0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,
  61.         0x94,0xA8,0x08,                                                                //前奏
  62.         0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,//竹林
  63.         0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,//七 {MOD}的国度 不
  64.         0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,//有一种神秘 灰 {MOD}的
  65.         0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,//将我卷入了迷雾中
  66.         0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,//看不清的双手
  67.         0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,//一朵花传来谁经
  68.         0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,//穿越千年的伤 痛
  69.         0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,//只为求一个结果
  70.         0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,//你留下的轮廓 指引我
  71.         0x42,0x63,0x83,0x83,0x91,0x91,//黑夜中不寂寞
  72.         0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,//穿越千年的哀愁
  73.         0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,//是你在尽头等我
  74.         0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,//最美丽的 感动 会值得
  75.         0x42,0x82,0x88,0x02,0x74,0x93,0x89,           //结束标
  76.         0xff
  77.         };
  78. uchar code table2[]={         //寂寞沙洲冷
  79.         0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,//自你走后心憔悴
  80.         0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,//白 {MOD}油桐 风中纷飞
  81.         0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,//落花似人有情
  82.         0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,//河畔的风放肆拼命地吹
  83.         0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,//不断拨弄 离人的眼泪
  84.         0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,//那样浓烈的爱再
  85.         0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,//伤感一夜一夜
  86.         0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,//当记忆的
  87.         0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,//是慌乱占
  88.         0x31,0x81,0x81,0x81,0x61,0x91,0x82,//有花儿伴着蝴蝶
  89.         0x51,0x51,0x51,0x51,0x31,0x61,0x53,//孤雁可以双飞
  90.         0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,//夜深人静独徘徊
  91.         0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,//当幸
  92.         0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,//闭上双眼难过头也不
  93.         0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,//
  94.         0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,//寂寞沙洲 我该思念谁
  95.         0xff
  96.         };
  97. uchar code table3[]={  //唯一
  98.         0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x53,0x03,0x53,0x53,0x53,0x34,0x44,
  99.         0x52,0x43,0x33,0x22,0x14,0x38,
  100.         0x40,0x43,0x43,0x43,0x33,0x23,0x13,0x38,0x03,0x13,0x23,0x13,0x33,0x26,0x04,
  101.         0x33,0x23,0x13,0x2c,0x04,
  102.         0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x55,0x03,0x53,0x53,0x53,0x43,0x44,
  103.         0x52,0x43,0x33,0x23,0x13,0x35,
  104.         0x04,0x43,0x43,0x43,0x33,0x23,0x13,0x33,0x54,0x83,0x83,0x93,0xa3,0x92,0x81,
  105.         0x63,0x62,0xa3,0x93,0x83,0x96,0x04,0x04,
  106.         0xa4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xa4,
  107.         0x72,0x72,0x72,0x52,0x72,0x82,0x94,0x04,0xa2,0xa2,0xb2,0xa2,0x82,0x92,
  108.         0x01,0xa4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xa4,
  109.         0x72,0x72,0x72,0x52,0x72,0x82,0x92,0xa2,0x84,0x64,0x03,0x51,0xb2,0xa2,0x82,
  110.         0x61,0x51,
  111.         0x04,0xa4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x52,0x32,0x68,
  112.         0x02,0xa4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x54,0x42,0x66,
  113.         0xff
  114.         };
  115. uchar code table4[]={  //旗开得胜
  116.         0xa2,0x82,0x92,0xa1,0x81,0x03,0x81,0xc1,0xb1,0xa1,0x91,0xa2,0x82,0x92,0xa1,
  117.         0x91,0x04,0xa2,0x82,0x92,0xa1,0x81,0x03,0x81,0xc1,0xb1,0xa1,0x91,0xa2,0x82,
  118.         0x92,0xa1,0x91,0x94,0x04,
  119.         0x01,0xa2,0x91,0xa1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x52,0x01,0xa2,0xa1,
  120.         0xc2,0xc2,0x01,0x92,0x81,0xa1,0x91,0x81,0x61,
  121.         0x01,0xa2,0x91,0xa1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x51,0x31,0x01,0xa2,
  122.         0xa1,0xc2,0xc1,0x91,0x01,0x92,0x81,0xa1,0x91,0x82,
  123.         0x01,0xa2,0x91,0xa1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x52,0x01,0xa2,0xa1,
  124.         0xc2,0xc2,0x01,0x92,0x81,0xa1,0x91,0x81,0x61,
  125.         0x01,0xa2,0x91,0xa1,0x91,0x81,0x61,0x01,0x62,0x81,0x81,0x61,0x51,0x31,0x01,
  126.         0xa2,0xa1,0xc1,0xa1,0x92,0x01,0x92,0x81,0xa1,0x91,0x82,
  127.         0x82,0x81,0x81,0xa2,0xc1,0xd1,0x02,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0xc1,
  128.         0xa2,0x91,0x02,0x81,0x81,0x82,0x81,0x81,0xa1,0xa1,0xc1,0xd1,0x02,0xd1,0xd1,
  129.         0xd1,0xd1,0xd1,0xd1,0xc1,0xa2,0x91,
  130.         0x03,0xa1,0xa1,0x91,0x81,0x61,0x81,0x82,0x91,0xa1,0x92,0x82,0xb1,0xb2,0xb1,
  131.         0xa1,0x91,0x92,0xa1,0xa2,0xa1,0x91,0x81,0x82,0x91,0x92,0xa1,0x91,0x81,0x72,
  132.         0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,
  133.         0x83,0x81,0x91,0x81,0x72,
  134.         0x81,0x82,0x91,0xa1,0x91,0x82,0xb1,0xb2,0xb1,0xa1,0x91,0x92,0xa1,0xa2,
  135.         0xa1,0x91,0x81,0x72,
  136.         0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,
  137.         0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,
  138.         0xa2,0x82,0x92,0xa1,0x81,0x03,0x81,0xc1,0xb1,0xa1,0x91,0xa2,0x82,0x92,0xa1,
  139.         0x91,0x04,0xa2,0x82,0x92,0xa1,0x81,0x03,0x81,0xc1,0xb1,0xa1,0x91,0xa2,0x82,
  140.         0x92,0xa1,0x91,0x93,0x91,0xa4,0x91,0x81,0x61,
  141.         0x02,0xa1,0x91,0xa1,0x91,0xa1,0x91,0xa1,0x91,0x84,0x04,
  142.         0xff
  143.         };

  144. //简谱曲调对应的定时器初值,适合11.0592的晶振
  145. uchar code cuzhi[]={
  146.                                                 0xff,0xff,//占位
  147.                                                 0xfc,0x8e,//中央C调1-7
  148.                                                 0xfc,0xed,
  149.                                                 0xfd,0x43,
  150.                                                 0xfd,0x6a,
  151.                                                 0xfd,0xb3,
  152.                                                 0xfd,0xf3,
  153.                                                 0xfe,0x2d,
  154.                                                 0xfe,0x47, //高八度1-7
  155.                                                 0xfe,0x76,
  156.                                                 0xfe,0xa1,
  157.                                                 0xfe,0xc7,
  158.                                                 0xfe,0xd9,
  159.                                                 0xfe,0xf9,
  160.                                                 0xff,0x16
  161.                                         };
  162. uchar code yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x00};
  163. //将音调转化为对应的LED样式
  164. //延时165MS,即十六分音符子函数
  165. void delay1(uint z)
  166. {
  167.         uint x,y;
  168.         for(x=z;x>0;x--)
  169.                 for(y=19000;y>0;y--);
  170. }
  171. //延时1MS子函数
  172. void delay2(uint z)
  173. {
  174.         uint x,y;
  175.         for(x=z;x>0;x--)
  176.                 for(y=110;y>0;y--);
  177. }
  178. //播放音乐子程序
  179. void song()
  180. {
  181.         uint temp;
  182.         uchar aa;
  183.         c=0;
  184.         while(1)
  185.         {
  186.                 if(count2==0)
  187.                 {
  188.                         break;
  189.                 }
  190.                 if(count2==1)
  191.                 {
  192.                         temp=table1[c];
  193.                         for(t=0;t<16;t++)
  194.                                 {               
  195.                                         write_data(dis1[t]);
  196.                                 }
  197.                 }
  198.                 if(count2==2)
  199.                 {
  200.                         temp=table2[c];
  201.                         for(t=0;t<16;t++)
  202.                                 {               
  203.                                         write_data(dis2[t]);
  204.                                 }
  205.                 }
  206.                 if(count2==3)
  207.                 {
  208.                         temp=table3[c];
  209.                         for(t=0;t<16;t++)
  210.                                 {               
  211.                                         write_data(dis3[t]);
  212.                                 }
  213.                 }
  214.                 if(count2==4)
  215.                 {
  216.                         temp=table4[c];
  217.                         for(t=0;t<16;t++)
  218.                                 {               
  219.                                         write_data(dis4[t]);
  220.                                 }
  221.                 }
  222.                 if(temp==0xff)
  223.                         break;
  224.                 aa=temp/16;//取数的高四位
  225.                 if(aa!=0)
  226.                 {
  227.                         a=cuzhi[aa*2];
  228.                         b=cuzhi[aa*2+1];
  229.                 }
  230.                 else
  231.                 {
  232.                         TR1=0;
  233.                         BEEP=1;
  234.                 }
  235.                 delay1(temp%16);//取数的低四位
  236.                 TR1=0;          //唱完一个音停10MS
  237.                 BEEP=1;
  238.                 delay2(10);
  239.                 TR1=1;
  240.                 c++;
  241.         }
  242.         TR1=0;
  243.         BEEP=1;
  244. }
  245. //按键扫描子程序
  246. void key()
  247. {
  248.         if(k3==0)
  249.         {
  250.                 delay2(10);
  251.                 if(k3==0)
  252.                 {
  253.                         num1++;
  254.                         if(num1==1)
  255.                         {
  256.                                 TR1=0;
  257.                                 aa=count2;
  258.                                 count2=0;
  259.                         }
  260.                         if(num1==2)
  261.                         {
  262.                                 num=0;
  263.                                 count2=aa;
  264.                                 TR1=1;
  265.                         }
  266.                         while(!k3);
  267.                 }
  268.         }
  269.         if(k4==0)
  270.         {
  271.                 TR1=0;
  272.                 count2=0;
  273.                 c=0;
  274.                 write_com(0x01);
  275.                 delay2(5);
  276.                 clock_init();        //?
  277.         }
  278. }                                                 
  279. //LCD1602液晶写命令子函数
  280. //void write_com(uchar com)
  281. //{
  282. //        RS=0;
  283. //        RW=0;
  284. //        E=0;
  285. //        P3=com;
  286. //        E=1;
  287. //        delay2(5);
  288. //        E=0;
  289. //}
  290. //LCD1602液晶写数据子函数
  291. //void write_date(uchar date)
  292. //{
  293. //        RS=1;
  294. //        RW=0;
  295. //        E=0;
  296. //        P3=date;
  297. //        E=1;
  298. //        delay2(5);
  299. //        E=0;
  300. //}
  301. //LCD1602液晶初始化子函数
  302. //void LCD1602_init()
  303. //{
  304. //        delay2(15);
  305. //        write_com(0x38);
  306. //        delay2(1);
  307. //        write_com(0x0c);
  308. //        delay2(1);
  309. //        write_com(0x06);
  310. //        delay2(1);
  311. //        write_com(0x01);
  312. //        delay2(1);
  313. //}
  314. //主程序
  315. void main()
  316. {
  317.         TMOD=0x11;
  318.         TH1=0;
  319.         TL1=0;
  320.         ET1=1;
  321.         TH0=0;
  322.         TL0=0;
  323.         ET0=1;
  324.         TR0=1;
  325.         EA=1;
  326.         EX1=1;
  327.         IT1=1;
  328.         EX0=1;
  329.         IT0=1;
  330.         count2=0;
  331.         init1602();
  332.         clock_init();
  333.         while(1);
  334.         {
  335.                 song();
  336.                 clock_write(second,minute);
  337.         }
  338. }
  339. //定时器0中断子函数
  340. void int_T0() interrupt 1
  341. {
  342.         num2++;
  343.         if(num2==5)
  344.         {
  345.                 num2=0;
  346.                 key();
  347.         }
  348. }
  349. //定时器1中断子函数
  350. void int_T1() interrupt 3
  351. {
  352.         TH1=(65535-45872)/256;
  353.         TL1=(65535-45872)%256;
  354. //TH1=a;
  355. //        TL1=b;
  356. //        BEEP=~BEEP;
  357.         num++;
  358.         if(num==20);
  359.         {       
  360.                 num=0;
  361.                 second++;
  362.         }
  363.         if(second==60)
  364.         {
  365.                 second=0;
  366.                 minute++;
  367.         }
  368. }
  369. void wb0() interrupt 0
  370. {
  371.         TR1=0;
  372.         if(k1==0)
  373.         {
  374.                 delay2(10);
  375.                 if(k1==0);
  376.                 {
  377.                         count2++;
  378.                         c=0;
  379.                         if(count2==1)
  380.                         {
  381.                                 //write_com(0x01);
  382.                                 delay2(1);
  383.                                 for(t=0;t<16;t++)
  384.                                 {               
  385.                                         write_data(dis1[t]);
  386.                                 }
  387.                         }
  388.                         if(count2 > 4)
  389.                         {
  390.                                 count2=1;
  391.                                 c=0;
  392.                                 TR1=0;
  393.                         }
  394.                         while(!k1);
  395.                 }
  396.         }
  397. }
  398. void wb1() interrupt 2
  399. {
  400.         TR1=0;
  401.         if(k2==0)
  402.         {
  403.                 delay2(10);
  404.                 if(k2==0);
  405.                 {
  406.                         count2--;
  407.                         c=0;
  408.                         if(count2==1)
  409.                         {
  410.                                 //write_com(0x01);
  411.                                 delay2(1);                               
  412.                                 for(t=0;t<16;t++)
  413.                                 {               
  414.                                         write_data(dis1[t]);
  415.                                 }
  416.                         }
  417.                         if(count2 <=0)
  418.                         {
  419.                                 count2=4;
  420.                                 c=0;
  421.                                 TR1=1;
  422.                         }
  423.                         while(!k2);
  424.                 }
  425.         }
  426. }
复制代码
yyh.txt 9.68 KB, 下载次数: 1
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。