本帖最后由 wicy001 于 2012-4-28 13:45 编辑
利用STC90C516RD+实现PWM输出WAV格式的音频,这是一个非常简单的程序
说明:1.此单片机没有集成PWM,需要使用定时器实现
2.播放wav音频的格式为8bit,8Khz 单声道,大小<60K,放在程序存储器中。
3.晶振需要 8Khz*(2^8bit)*12T=24.576Mhz,如果烧写使用6T方式,晶振可减半。
4.端口接耳机,耳机另一端接+5V,这样声音听着会大一些。
问题:
输出有噪音,噪音非常尖锐,而且声音很大,比声音信号要大。请各位大侠看看,问题出在哪,应该怎么解决?
-----------
声音尖锐,频率应该很高,试着加一个RC低通,但效果不明显。
---------------为方便大家快速阅读,将帖子相关内容整理如下-------------
图1:RC电路
图2:经过RC电路仿真波形
【如何去掉图中的尖刺?】
图3:未经RC电路前端口的仿真波形 【斜坡受RC影响,正常。如果不加RC电路,输出是平的】
/*************************程序****************************/
#include <reg52.h> //MCU为STC89/STC90
#include "sound.h" //wav格式数据
sbit BEEP = P0^0; //耳机一端接在P0.0脚上,一端接+5V
unsigned int counter,wavedataL;
unsigned char currentdata,nextdata,i;
void sys_start()
{
TMOD|= 0x02; //T0,自动重装模式
TH0 = currentdata;
TL0 = currentdata;
ET0 = 1;
EA = 1;
TR0 = 1;
BEEP=0;
}
main()
{
unsigned int tmp;
tmp=sound[0x29]; //从wav文件中取,数据长度。数据长度应该是4个字节,
tmp=tmp<<8;
wavedataL=tmp+sound[0x28]; //由于wav存在片内flash中,文件大小有限制,数据长度用int型足够表示了。
counter=0x2c; //wav文件第一个数据
currentdata=sound[counter];
nextdata=sound[counter];
//以上数字请参考wav格式说明
sys_start();
while(1)
{
if(counter>wavedataL) //反复重播
{
counter=0x2c;
}
if(BEEP) TH0=0xFF-currentdata;
else TH0=currentdata;
}
}
/*************************************/
void Timer0int(void) interrupt 1 //定时器0中断
{
BEEP=~BEEP;
if(BEEP)
{
counter++;
nextdata=sound[counter];
}
else
currentdata=nextdata;
}
常见的喇叭都1-2W,正常工作起来,声音是很大的。但是你的喇叭功率已经达到5V*210A>1W了,声音不应该像你说的那么小。
你在确认一下:
1.5V的电压是否全部加在了喇叭上? 中间是否有电阻分压了?
2.喇叭的功率是多大,如果远大于1W,声音会小
3.确定一下三级管的参数,通常用的9013,9014最大驱动0.5W的设备。
你可以改变一下电路,加上电容,看看效果。
不能用直流驱动。你要用电容耦合过去来驱动喇叭。
8欧 0.5W,直径3CM的喇叭
三极管8050
没用电阻分压限流
在喇叭上并了一个104和一个105和一个续流二极管4007,不加二极管会有很高的尖峰
按照喇叭的参数计算,电压2V就可以了
看了三极管CE电压波形是三角波,1.2~5V,振幅是3.8V
喇叭两端的波形也是三角波,0.3~3.5V,振幅3.2V
单片机输出波形是方波0~5V
现在的效果如何?
从喇叭的参数来看,以前喇叭过载了,所以会发热。
一周热门 更多>