关于蜂鸣器不能输出问题

2019-07-15 13:48发布

跪求大神指点,刚写的一个51程序,但不能发声。
我的思路:
T0中断作为节拍,T1中断作为音频发生器。
程序如下:
#include <reg52.h>
#include <intrins.h>
//Do~Si
#define uint8        unsigned char;
#define uint16  unsigned int;
sbit        SOUND=P2^0;
uint16        code        FreLow[7]={262,294,330,349,392,440,494};                                //低音音频        表,高8位用0表示
uint16        code        FreMid[7]={523,578,659,698,784,880,988};                                //中音,高8位用1表示
uint16        code        FreHig[7]={1046,1175,1318,1397,1568,1760,1976};                //高音,高8位用2表示
uint8        code        MusicLoad[]={
                                                                                                0x11,0x05,
                                                                                                0x12,0x05,
                                                                                                0x13,0x05,
                                                                                                0x11,0x05,
                                                                                                0x11,0x05,
                                                                                                0x12,0x05,
                                                                                                0x13,0x05,
                                                                                                0x11,0x05,
                                                                                                0x13,0x05,
                                                                                                0x14,0x05,
                                                                                                0x15,0x0a,
                                                                                                0x13,0x05,
                                                                                                0x14,0x05,
                                                                                                0x15,0x0a,
                                                                                                0x15,0x05,
                                                                                                0x16,0x05,
                                                                                                0x15,0x05,
                                                                                                0x14,0x05,
                                                                                                0x13,0x05,
                                                                                                0x11,0x05,
                                                                                                0x15,0x05,
                                                                                                0x16,0x05,
                                                                                                0x15,0x05,
                                                                                                0x14,0x05,
                                                                                                0x13,0x05,
                                                                                                0x11,0x05,
                                                                                                0x12,0x05,
                                                                                                0x05,0x05,
                                                                                                0x11,0x0a,
                                                                                                0x12,0x05,
                                                                                                0x05,0x05,
                                                                                                0x11,0x0a,
                                                                                                0x00,0x00
};                                                //音频播放表格式:音频+节拍为一组

uint8                *pFre;                                                        //音频指针
uint8                *pBeat;                                                        //节拍指针
uint16        Fre;                                                                //暂存音频
uint8                temp;                                                        //暂存节拍



void timer_beat(void)interrupt 1{
        //定时器T0,计时50ms一个小周期
        TH0=0x3c;
        TL0=0xb0;
        if(temp==(*pBeat)){
                //节拍已经够了,指向下一组
                pFre=pFre+2;
                pBeat=pBeat+2;
                temp=0;
        }
        //节拍不够,继续打节拍
        ++temp;
}


void        timer_fre(void)interrupt        3{
        //音频发生器
        TH1=Fre/256;                                                //取高8
        TH0=Fre%256;
        SOUND=~SOUND;                                        //音频输出
}


void Music_Play(void){
        while((*pFre)&&(*pBeat)){
                //音频表还没播放完毕
                if(((*pFre)&0xf0)==0){
                        //检测到为低音
                        Fre=65536-1000000/FreLow[(*pFre)&0x0f];                             //取出该音频
                }
                else if(((*pFre)&0xf0)==1){
                        //检测到为中音
                        Fre=65536-1000000/FreMid[(*pFre)&0x0f];
                }
                else if(((*pFre)&0xf0)==2){
                        //检测到为高音
                        Fre=65536-1000000/FreHig[(*pFre)&0x0f];
                }
                //T1初始化
                TH1=Fre/256;
                TH1=Fre%256;
                //T0初始化
                TH0=0x3c;
                TL0=0xb0;
                //打开中断
                EA=1;
                ET0=1;
                ET1=1;
                //打开T0、T1
                TR1=1;
                TR0=1;
        }
}


void main(void){
        pFre=MusicLoad;                               //指向表头
        pBeat=MusicLoad+1;
        temp=0;
        TR0=0;
        TR1=0;
        while(1){
                Music_Play();
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
chenwei6991627
1楼-- · 2019-07-15 15:10
先看看那定时器工作了没有,再看看你的蜂鸣器驱动脚有没有信号
尼斯达
2楼-- · 2019-07-15 16:14
 精彩回答 2  元偷偷看……
尼斯达
3楼-- · 2019-07-15 22:11
chenwei6991627 发表于 2016-5-30 14:05
先看看那定时器工作了没有,再看看你的蜂鸣器驱动脚有没有信号

我查看了P2,没变化呢
尼斯达
4楼-- · 2019-07-16 04:06
刚刚自己反复看了之后,问题已解决~~~~
1. 有两处地方的TH1和TL1的赋初值写错了
2. 三个 if 分支判断高中低频的判断语句写错了,应该是判断==0x01而不是1,0x10=16
待解决问题~~~
1. 使用两个中断来分别控制音频输出和节拍输出效果并不好,节奏很怪,不知道什么原因呢
张大猛
5楼-- · 2019-07-16 07:59
对   自己找到错误有利于成长
LYGOK
6楼-- · 2019-07-16 09:43
定时器没有设置

一周热门 更多>