專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

用單片機(jī)+PWM來解碼WAV真人聲樂

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年07月25日   【字體:

本程序是51hei單片機(jī)開發(fā)板所提供一個(gè)列子,用單片機(jī)解碼wav真人聲音音樂,并用pwm的方法輸出,開發(fā)板的p2.2口是接的蜂鳴器,但蜂鳴器的效果實(shí)在是太差,在使用中直接把蜂鳴器去掉,接上一個(gè)2w的小喇叭效果更佳.wav.h是wav數(shù)據(jù)請(qǐng)從下面的壓縮包下載: http://www.torrancerestoration.com/f/waefc.rar   下面是主程序部分:

#include<reg52.h>
#include "wav.h"

sbit dataOut = P2^2;
#define maxSize    2060

unsigned char pwmData=0;      
unsigned char pwmCycle=256;        //pwm的頻率 
unsigned int datIndex=0;

void TimerInit() {
 TMOD=0x22;
 TH0=(256-pwmData)%256; 
 TH1=(256-(pwmCycle-pwmData))%256;

 RCAP2H=0xfe; //1
 RCAP2L=0xc7; //199
  TH2=RCAP2H; 
 TL2=RCAP2L;
 
 PT2=0; //高中斷優(yōu)先級(jí) 
   
    TR0=1; TR1=0; TR2=1;  //啟動(dòng)/停止定時(shí)器
 ET0=1; ET1=1; ET2=1;  //打開中斷
 EA=1;
}
                                                                          
///////////////////定時(shí)器0中斷//////////////////////
Timer0() interrupt 1 {
 TR0=0;              //turn off Timer0
 dataOut=0; 
 TR1=1;              //turn on Timer1
  

///////////////////定時(shí)器1中斷///////////////////////
Timer1() interrupt 3 {
 TR1=0;              //turn off Timer1
 dataOut=1;
 TH0=(256-pwmData)%256;
 TH1=(256-(pwmCycle-pwmData))%256;
 TR0=1;              //turn on Timer0 
}

///////////////////定時(shí)器2中斷///////////////////////
Timer2() interrupt 5 {
 TF2=0;
 pwmData=wavdata1[datIndex];
 if(++datIndex==maxSize) {
  datIndex=0; 
 }
}

main(){
 TimerInit();
 while(1);
 { }
}

關(guān)閉窗口

相關(guān)文章