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

2019-07-15 20:31发布

各位朋友,大家好!
我最近在学习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++);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
依然落叶飘零
1楼-- · 2019-07-16 11:21
 精彩回答 2  元偷偷看……
moyansen
2楼-- · 2019-07-16 14:42
依然落叶飘零 发表于 2014-4-2 09:21
楼上说了,双重循环。

双重循环??不是很明白。该如何设置?
把下面的
  1. for(j=0;j < sizeof(pai);j++)
  2.                                 delay();
复制代码改为
  1. for(j=0;j < pai[i];j++)
  2.                     delay()
复制代码
为什么不可以呢?


依然落叶飘零
3楼-- · 2019-07-16 16:33
  1. for(i = 0;i<sizeof[pai];i++)
  2. {
  3.     for(j = 0;j<pai[i];j++)
  4.     {
  5.         delay();
  6.     }
  7. }
复制代码

一周热门 更多>