简明易懂易上手! 通常,利用单片机的内部定时器0,工作在方式一下,改变计数初始值TH0和TL0来产生不同的率。 例如,若单片机采用12MHzs晶振,要产生频率为587Hzs的音频脉冲时,其音频信号的脉冲周期T=1/587=1703.5775us,半周期时间为852us,因此总要令计时器计数=852us/1us=852,在每计数852时将I/O口反相,就得到C大调的中调Re。 由于定时器0的在方式一计数方式为16位计数器,最多只能装载的数为2的16次方即65536个,也就是说定时器计数到65536就会进入中断函数,而在中断函数中将输出脉冲的I/O口反相即可,故只需设置好定时器0的初值就可以了发出特定的音频了。初值与音频的对应关系见下表所示:
#include"STC12C5A.h" int tab[]={64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65282}; //网上找到的音符与定时器初值对照表中的数据,用来设定时器0初值 sbit bell=P1^3;//位定义蜂鸣器 int i; //用于赋定时器0初值 /*延时函数*/ void delay_ms(unsigned int time) { unsigned int t; for(;time>0;time--) { t=1500; while(t--); } } /*定时器0初始化函数*/ void Timer0_init() { TMOD=0x01;//选择定时器0方式1 ET0=1; //开启定时器0中断 EA=1; TR0=1; TL0=tab; TH0=tab>>8; } void Timer0_Isp() interrupt 1 { TL0=tab; TH0=tab>>8; bell=!bell; } //放音符的数组前面记得加个code,延迟时间凭乐感吧!要关掉蜂鸣器貌似蜂鸣器跟定时器都要关哦,歌曲暂停与播放,强烈推荐用外部中断! void main() { int s; code int song[]={6,5,6,8,9,10,7,6,5,3,5,9,8}; code int song1[]={2,3,5,6,5,3,2,1} ; code song2[]={10,9,8,5,9,3,5,9,5}; code int song3[]={8,9,10,12,13,10,9}; code int song4[]={9,8,9,10,12,10};
/*心中有江山的人岂能快意潇洒*/ } } } } } |
|
来自: carl_xie12 > 《音响》