振南网站还在继续美化改进,暂时提供一个平台来发布振南的实验和相关资料! http://www.znmcu.cn/znx_51_iap_exps_wav_play_test.html STC/IAP15单片机 ZN-X开发板 群 187478076 振南QQ:987582714 振南的SD卡 FAT32 技术群:198521880
振南ZN-X开发板(STC51版)实验 之 PCA的应用【音频播放器】 实验说明: 振南的ZN-X开发板率先使用STC最新的增强型51单片机芯片(具体型号包括3种:STC15L2K60S2、IAP15L2K61S2/IAP15W4K61S4),它们在功能上几乎相同,只是RAM与ROM容量不同,另外前缀IAP的芯片本身具有仿真器的功能。 此实验主要是对PCA(Programable Counter Array,即可编程计数器阵列)的应用,它是STC特有的东西,功能强大,配置灵活,可以实现多种功能:捕获、定时、PWM输出、高速时钟输出等等。再加上一些应用上的技巧,将可以实现更多功能。 这里使用STC的PCA实现PWM输出和定时功能。PWM用来播放音频,而定时器则用来控制音频的播放采样率。也就是说,此实验中所有功能都是基于STC的PCA来实现的。主要是为了对STC的PCA进行测试,实现一个简单的音频播放功能。 所需硬件: 振南ZN-X开发板(STC51版)基板 基础资源模块【主要是用模块上的耳机音频接口】 USB转串口模块(用于供电与程序的下载) STC PCA简介: STC15系列部分单片机集成 了3路可编程计数器阵列(CCP/PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。 PWM输出可以在3组不同管脚之间切换: PWM通道 | 可分配管脚 | PWM0 | P1.1 | P3.5 | P2.5 | PWM1 | P1.0 | P3.6 | P2.6 | PWM2 | P3.7 | P3.7 | P2.7 |
此实验中我们选用P1.1作为PWM输出,它通过一片74HC32作为信号增强和缓冲,最终通过专门的接口输出(位于ZN-X开发板基板右下角的4x2排针,第1针,即上排最左边那根针,如下图)。 关于PCA的定时器与PWM功能的详细介绍: 关于PCA的定时器与PWM功能,振南在前面发布的《STC PCA PWM应用实验》和《STC PCA 定时器应用实验》中有非常详细的介绍,包括:PCA实现定时器和PWM的原理、实现的方法、STC芯片中PCA定时器和PWM的相关寄存器等等。 请参见: http://www.znmcu.cn/znx_51_iap_exps_pca_pwm_test.html http://www.znmcu.cn/znx_51_iap_exps_pca_timer_test.html 关于此实验的详细说明: 我们知道PWM可以通过数字方式对模拟量进行合成,既然这样,那就可以实现音频的播放了,我们只需要将声波信号的PCM电压值通过PWM进行合成,并且通过定时器去控制采集率,即产生两个电压之间的时间间隔。再通过后级的一些电容滤波和音频接口电路,即可输出简单的音频效果。 实际上,使用PWM实现音频功能在很多产品上都在使用,比如早期的一些手机的铃声、游戏机的音乐等等。 至于音频数据的获取,振地使用CoolEdit将MP3等音频文件转为单声道的8位PCM编码的WAV文件,采样率为8KHz(即产生两个电压之间的时间间隔约为125us,可以通过51的传统定时器T0或T1来精确控制,但是这里使用的是STC PCA的定时器功能)。 最终将WAV文件的数据再转为C语言数组方式,固化在单片机的ROM之中。 关于音频数据的制作,请详见《振南单片机基础外设9日通》视频教程 之 DAC专辑。 振南的视频教程专区http://v.znmcu.cn 实验代码: #include "STC15Fxxxx.H" #include "wav_code.h" unsigned short value=0,index=0; void PCA_Isr() interrupt 7 using 1 //PCA定时中断服务程序 { CCF0=0; CCAP0L=value;CCAP0H=value>>8; value+=700; CCAP1H=wav[index++];index%=WAV_LEN; //更新PWM比较值,即脉宽 } void main(void) { PCA_USE_P12P11P10P37(); PCA_CLK_1T(); PWM1_NORMAL(); PCA1_PWM(8); CCAP1L=0;CCAP1H=0; //PCA0作16位定时器 CCON=0x00; CL=0;CH=0; value=700; CCAP0L=value;CCAP0H=value>>8; value+=700; CCAPM0=0x49; CR=1; EA=1; while(1); }
注:上面程序中的宏来自于STC15头文件,详见头文件源代码 |
实验效果:
代码下载:
|