微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大大们帮我看看这个音乐摇摇棒程序有什么问题

求大大们帮我看看这个音乐摇摇棒程序有什么问题

时间:10-02 整理:3721RD 点击:

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int                         //宏定义
  4. sbit KEY=P3^0;                                         //定义画面切换按键
  5. sbit speaker=P2^0;
  6. uchar KY;                                                        //KY作用在后面说明
  7. uchar disp;                                                 //显示汉字指针
  8. uchar pic=0,num=0;                                    //pic为按键次数;num为中断次数
  9. uchar timer0h,timer0l,time;         //歌曲发音
  10. // 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据
  11. code unsigned char FREQH[] = {
  12.     0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
  13.     0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
  14.     0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
  15.     0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567
  16. // 频率-半周期数据表 低八位
  17. code unsigned char FREQL[] = {
  18.     0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
  19.     0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  20.     0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
  21.     0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567
  22. //一辈子的孤单数据表           要想演奏不同的乐曲, 只需要修改这个数据表
  23. code unsigned char ybzdgd[] = {
  24. //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
  25. //6, 2, 3 分别代表:6, 中音, 3个半拍;
  26. //5, 2, 1 分别代表:5, 中音, 1个半拍;
  27. //3, 2, 2 分别代表:3, 中音, 2个半拍;
  28. //5, 2, 2 分别代表:5, 中音, 2个半拍;
  29. //1, 3, 2 分别代表:1, 高音, 2个半拍;
  30. //
  31. 5,0,1, 5,0,1, 3,1,1, 2,1,1,
  32. 2,1,1, 1,1,1, 3,1,1, 3,1,1, 2,1,1, 2,1,4, 5,0,1, 5,0,1, 3,1,1, 2,1,1,
  33. 2,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,1, 3,1,4, 5,0,1, 5,0,1, 3,1,1, 2,1,1,
  34. 2,1,1, 1,1,1, 3,1,1, 3,1,1, 2,1,1, 2,1,4, 2,1,1, 1,1,1, 3,1,1, 2,1,1,
  35. 1,1,1, 2,1,1, 1,1,1, 1,1,8, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 1,1,1, 2,1,1,
  36. 2,1,6, 3,1,1, 2,1,2, 1,1,1, 1,1,1, 5,0,1, 6,0,1, 5,0,1, 5,0,6, 3,1,1,
  37. 2,1,1, 2,1,1, 1,1,1, 1,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,2, 1,1,1,
  38. 2,1,2, 3,1,1, 3,1,4, 5,0,1, 3,1,1, 5,1,2, 6,1,1, 3,1,1, 2,1,1, 2,1,6,
  39. 5,0,1, 3,1,1, 2,1,2, 1,1,1, 2,1,2, 3,1,1, 3,1,4, 5,0,1, 3,1,1, 2,1,1,
  40. 2,1,1, 1,1,1, 3,1,1, 2,1,1, 2,1,4, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 1,1,1,
  41. 2,1,1, 1,1,1, 1,1,1, 1,1,6, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 2,1,1,
  42. 2,1,6, 5,0,1, 3,1,1, 2,1,1,2,1,1, 1,1,1, 2,1,1, 3,1,1, 3,1,6,  5,0,1,
  43. 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,1,
  44. 2,1,1, 1,1,1, 2,1,1, 3,1,1, 3,1,6,0,0,0};
  45. uchar code love[] = {
  46.         0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x60,0x00,0x18,0x00,0x06,0x80,0x01,0xe0,0x00,
  47.         0x98,0x00,0x86,0x00,0x81,0x00,0x86,0x00,0x98,0x00,0xe0,0x00,0x80,0x01,0x00,0x06,
  48.         0x00,0x18,0x00,0x60,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x80,
  49.         0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,
  50.         0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,
  51.         0x81,0x80,0xff,0xff,0x00,0x00,0x00,0x1c,0x00,0x22,0x01,0x41,0x81,0x80,0x81,0x80,
  52.         0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,       
  53.         0x81,0x80,0x81,0x80,0x81,0x80,0x81,0x80,0x82,0x80,0x44,0x80,0x38,0x80,0x00,0x00,                       
  54. /*LOVE*/
  55. };
  56. uchar code loveyou[] = {
  57.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  58.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  59.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  60.         0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0xFC,0x3F,
  61.         0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0xFC,0x00,
  62.         0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  63.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  64.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*心形图案*/
  65. };
  66. uchar code hehe[] = {
  67.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  68.         0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
  69.         0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
  70.         0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,
  71.         0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
  72.         0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0x08,0x10,
  73.         0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
  74.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*呵呵o(∩_∩)o图案*/
  75. };
  76. unsigned char code hanzi[] = {
  77. //-- 哈士奇队 --
  78.         0x00,0x10,0x00,0x60,0x00,0x80,0x00,0x01,
  79.         0x00,0x02,0xf7,0x0c,0x00,0x02,0x00,0x01,
  80.         0x00,0x80,0x00,0x60,0x13,0x1c,0xa4,0x02,
  81.         0xa4,0x02,0x64,0x04,0xf7,0xff,0x00,0x00,
  82.         0x00,0x00,0x10,0x00,0x10,0xff,0x31,0x20,
  83.         0x51,0x00,0x91,0xc7,0x13,0x44,0x17,0x44,
  84.         0x13,0x44,0x91,0x44,0x51,0x44,0x31,0xc7,
  85.         0x11,0x00,0x10,0x00,0x10,0x00,0x00,0x00,
  86.         0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x20,
  87.         0x20,0x20,0x20,0x20,0x20,0x20,0xf7,0xef,
  88.         0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  89.         0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,
  90.         0x20,0x00,0x40,0xe7,0x90,0x24,0x11,0x24,
  91.         0x12,0x24,0x14,0x24,0x12,0x24,0x11,0x24,
  92.         0x90,0x24,0x40,0xe7,0x20,0x00,0x10,0x8f,
  93.         0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x8f,                       
  94. //-- 摇摇棒!--
  95.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  96.         0x00,0x00,0x00,0x00,0x7C,0x10,0xFE,0x3B,
  97.         0xFE,0x3B,0x7C,0x10,0x00,0x00,0x00,0x00,
  98.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  99.         0x00,0x00,0x40,0x02,0x44,0x06,0x56,0x12,
  100.         0x54,0x15,0xD4,0x14,0x5F,0xFF,0x74,0x14,
  101.         0xD4,0x15,0x44,0x12,0x54,0x05,0x90,0x00,
  102.         0xFF,0xFF,0xD0,0x00,0x10,0x03,0x10,0x04,
  103.         0x00,0x00,0x00,0x04,0x82,0x06,0x9B,0xF4,
  104.         0xA2,0x44,0x82,0x44,0xBC,0x7F,0x84,0x44,
  105.         0xB4,0x44,0xCC,0xF4,0x54,0x05,0x90,0x04,
  106.         0xFF,0x7F,0x10,0x81,0x10,0x42,0x10,0x02,
  107.         0x00,0x00,0x00,0x04,0x82,0x06,0x9B,0xF4,
  108.         0xA2,0x44,0x82,0x44,0xBC,0x7F,0x84,0x44,
  109.         0xB4,0x44,0xCC,0xF4,0x54,0x05,0x90,0x04,
  110.         0xFF,0x7F,0x10,0x81,0x10,0x42,0x10,0x02,               
  111. };
  112. /*****函数声明*****/
  113. void display1(void);
  114. void display2(void);
  115. void display3(void);
  116. void display4(void);
  117. /*****n(us)延时子程序*****/
  118. void DelayUs(uint N)                        //亮灯的延时程序
  119. {
  120.         uint x;
  121.         for(x=0; x<=N;x++);
  122. }
  123. void delay(unsigned char t)     //延时程序,控制发音的时间长度
  124. {
  125.     uchar t1;
  126.     unsigned long t2;
  127.     for(t1=0;t1<t;t1++)    //双重循环, 共延时t个半拍
  128.       for(t2=0;t2<8000;t2++); //延时期间, 可进入T0中断去发音
  129.     TR0=0;                        //关闭T0, 停止发音
  130. }
  131. void song()                      //演奏一个音符
  132. {
  133.         TH0 = timer0h;               //控制音调
  134.         TL0 = timer0l;
  135.         TR0 = 1;                     //启动T0, 由T0输出方波去发音
  136.         delay(time);                 //控制时间长度
  137. }        
  138. /*****中断服务程序*****/
  139. void t0int() interrupt 1 using 2         //T0中断程序,控制发音的音调
  140. {
  141.     TR0 = 0;                     //先关闭T0
  142.     speaker = !speaker;          //输出方波, 发音
  143.     TH0 = timer0h;               //下次的中断时间, 这个时间, 控制音调高低
  144.     TL0 = timer0l;
  145.     TR0 = 1;                     //启动T0
  146. }        
  147. void intersvr0(void) interrupt 0 using 1
  148. {
  149.         KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
  150.         if(KY==0)
  151.         {
  152.                 num++; //计算中断次数
  153.                 switch(pic) //选择画面
  154.                 {
  155.                         case 0:{display1();}break;
  156.                         case 1:{display2();}break;
  157.                         case 2:{display3();}break;
  158.                         case 3:{display4();}break;
  159.                         default:{display1();}
  160.                 }
  161.         }
  162. }
  163. /*****显示子程序1(汉字)*****/
  164. void display1(void)
  165. {
  166.         uchar i;
  167.         if(num>10){disp++;num=0;} //12个汉字分为3次显示完(每次显示4个),每中断10次切换
  168.         if(disp>1)disp=0;
  169.         DelayUs(6000); //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
  170.         for(i=0;i<64;i++)
  171.         {
  172.                 P0=~hanzi[disp*128+i*2];
  173.                 P1=~hanzi[disp*128+i*2+1];
  174.                 DelayUs(80);
  175.         }
  176. }         
  177. /*****显示子程序2(LOVE)*****/
  178. void display2(void)
  179. {
  180.         uchar i;
  181.         DelayUs(4000);
  182.         for(i=0;i<64;i++)
  183.         {
  184.                 P0=~love[i*2];
  185.                 P1=~love[i*2+1];
  186.                 DelayUs(120);
  187.         }
  188. }
  189. /*****显示子程序3(心形图案)*****/
  190. void display3(void)
  191. {
  192.         uchar i;
  193.         DelayUs(4000);
  194.         for(i=0;i<64;i++)
  195.         {
  196.                 P0=~loveyou[i*2];
  197.                 P1=~loveyou[i*2+1];
  198.                 DelayUs(120);
  199.         }
  200. }
  201. /*****显示子程序4(呵呵o(∩_∩)o图案)*****/
  202. void display4(void)
  203. {
  204.         uchar i;
  205.         DelayUs(4000);
  206.         for(i=0;i<64;i++)
  207.         {
  208.                 P0=~hehe[i*2];
  209.                 P1=~hehe[i*2+1];
  210.                 DelayUs(120);
  211.         }
  212. }
  213. /*****主函数*****/
  214. void main(void)
  215. {
  216.         uchar k,i;
  217.         PT0=1;
  218.     TMOD=1;                    //置T0定时工作方式1
  219.     ET0=1;                     //开T0中断
  220.     EA=1;                      //开CPU中断
  221.         IT0=1;
  222.         EX0=1;
  223.         KY=0;
  224.     while(1)
  225.         {
  226.                 if(KEY==0) //画面切换键按下
  227.                 {
  228.                         DelayUs(10000); //按键去抖
  229.                         if(KEY==0);
  230.                         pic++;
  231.                 }
  232.                 if(pic>3)
  233.                         pic=0;
  234.               i=0;
  235.               time=1;
  236.               while(time)
  237.                   {
  238.                 k=sszymmh[i]+7*ybzdgd[i+1]-1/;/第i个是音符, 第i+1个是第几个八度
  239.                 timer0h=FREQH[k];      //从数据表中读出频率数值
  240.                 timer0l=FREQL[k];      //实际上, 是定时的时间长度
  241.                 time=ybzdgd[i+2];   //读出时间长度数值
  242.                 i+=3;
  243.                 song();                  //发出一个音符
  244.                 }   
  245.         }
  246. }
  247. /*****END*****/

复制代码

一边音乐一边摇摇会不会有点抢时间?

受教了

好东西

我也想做个这东西

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top