微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51单片机播放音频的程序的问题,哪里有错啊

关于51单片机播放音频的程序的问题,哪里有错啊

时间:10-02 整理:3721RD 点击:
各位朋友,大家好!
我最近在学习51单片机,下面写了一段程序想控制蜂鸣器发出 哆雷咪发梭拉西多 的声音,但是就是无法得到预期的效果;
不知道哪里有问,求高手帮忙,指导一下!
先谢谢了!
#include <REGX51.H>
#define uint unsigned int
#define uchar unsigned char
sbit music=P1^2;        //P1.2脚与蜂鸣器连接
uint i;
void delay();
/*****************************************
1、2、3、4、5、6、7低中高音音调初值TL0的值
******************************************/
uchar code Ftl[]={0x8B,0x5B,0x14,0x66,0x03,0x8F,0x0B,               
                                  0x43,0xAB,0x08,0x33,0x81,0xC7,0x05,
                                  0x21,0x55,0x84,0x99,0xC0,0xE3,0x02,0xAA};       
/*****************************************
1、2、3、4、5、6、7低中高音音调初值TL0的值
******************************************/
uchar code Fth[]={0xF8,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,       
                                  0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                                  0xFB,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xAA};
/***********************
节拍数,一拍时间为200ms
************************/
uchar code pai[]={4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
/**********************************************************
函数名称:程序主函数
函数功能:有低音到高音播放1、2、3、4、5、6、7
***********************************************************/
void main()
{
        uchar i,j;
        EA=1;
        ET0=1;
        TMOD=0x01;
        while(1)
        {
                i=0;
                while(Ftl!=0xAA&&Fth!=0xAA)                 //当Ftl和Fth等于0xAA,播放完成,然后重新开始
                {
                        TH0=Fth;
                        TL0=Ftl;
                        TR0=1;
                        for(j=0;j<pai;j++)
                                delay();
                        TR0=0;
                        i++;
                }
                music=0;
        }
}
/***********************************************************
函数名称:中断函数
函数描述:定时器T0,方式1
************************************************************/
void T_timer() interrupt 1 using 1
{
        music=!music;
        TH0=Fth;
        TL0=Ftl;
}
/***********************************************************
函数名称:延时函数
函数功能:1个延时单位,延时200ms
************************************************************/
void delay()
{
        unsigned char i,j;
        for(i=0;i<100;i++)
                for(j=0;j<250;j++);
}

经过本人亲身测试,终于发现你的问题所在,你的数组格式不对啊。TH0=Fth;TL0=Ftl;这个明显都不对啊正确的应该是这样的TH0=Fth[n];TL0=Ftl[n].另外for(j=0;j<pai;j++),编译的时候提示出错。应该改为for(j=0;j < sizeof(pai);j++)。随便提一句,一般for语句无论里面有多少语句都加大括号{},他发我改过的程序给你看看,经过本人编译下载运行正常。

  1. #include <REGX51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit music=P1^2;        //P1.2脚与蜂鸣器连接
  5. uint n;
  6. void delay();

  7. /*****************************************
  8. 1、2、3、4、5、6、7低中高音音调初值TL0的值
  9. ******************************************/
  10. uchar code Ftl[]={0x8B,0x5B,0x14,0x66,0x03,0x8F,0x0B,               
  11.                                   0x43,0xAB,0x08,0x33,0x81,0xC7,0x05,
  12.                                   0x21,0x55,0x84,0x99,0xC0,0xE3,0x02,0xAA};        

  13. /*****************************************
  14. 1、2、3、4、5、6、7低中高音音调初值TL0的值
  15. ******************************************/
  16. uchar code Fth[]={0xF8,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,        
  17.                                   0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  18.                                   0xFB,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xAA};

  19. /***********************
  20. 节拍数,一拍时间为200ms
  21. ************************/
  22. uchar code pai[]={4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};

  23. /**********************************************************
  24. 函数名称:程序主函数
  25. 函数功能:有低音到高音播放1、2、3、4、5、6、7
  26. ***********************************************************/
  27. void main()
  28. {
  29.         uchar j;
  30.         EA=1;
  31.         ET0=1;
  32.         TMOD=0x01;
  33.         while(1)
  34.         {
  35.                 n=0;
  36.                 while(Ftl[n]!=0xAA&&Fth[n]!=0xAA)                 //当Ftl和Fth等于0xAA,播放完成,然后重新开始
  37.                 {
  38.                         TH0=Fth[n];
  39.                         TL0=Ftl[n];
  40.                         TR0=1;
  41.                         for(j=0;j < sizeof(pai);j++)
  42.                                 delay();
  43.                         TR0=0;
  44.                         n++;
  45.                 }
  46.                 music=0;
  47.         }
  48. }
  49. /***********************************************************
  50. 函数名称:中断函数
  51. 函数描述:定时器T0,方式1
  52. ************************************************************/
  53. void T_timer() interrupt 1 using 1
  54. {
  55.         music=!music;
  56.         TH0=Fth[n];
  57.         TL0=Ftl[n];
  58. }
  59. /***********************************************************
  60. 函数名称:延时函数
  61. 函数功能:1个延时单位,延时200ms
  62. ************************************************************/
  63. void delay()
  64. {
  65.         unsigned char i,j;
  66.         for(i=0;i<100;i++)
  67.               for(j=0;j<250;j++);
  68. }

复制代码

谢谢你!
我想问一下,
sizeof(pai)是用来计算数组长度的吗?
那j < sizeof(pai)可以改为 j<pai吗?
                     

sizeof(pai)这个是表示数组的长度。而数组名pai不是代表数组的长度,他是表示数组首元素的地址。

肯定不行的,楼上的已经解答的非常清楚了

把j < sizeof(pai)可以改为 j <pai 可以吗?
因为数组pai[]里面的元素表示我延时不同的拍数
sizeof(pai)这个表示数组pai[]长度,那拍数就没有变化了

可以再添加一个变量 使用双重循环

楼上说了,双重循环。

双重循环?不是很明白。该如何设置?
把下面的

  1. for(j=0;j < sizeof(pai);j++)
  2.                                 delay();

复制代码

改为

  1. for(j=0;j < pai[i];j++)
  2.                     delay()

复制代码


为什么不可以呢?

  1. for(i = 0;i<sizeof[pai];i++)
  2. {
  3.     for(j = 0;j<pai[i];j++)
  4.     {
  5.         delay();
  6.     }
  7. }

复制代码

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

网站地图

Top