标签:模拟电子技术基础,模拟电子电路,http://www.5idzw.com
基于DDS芯片AD9833的音源发生器设计,http://www.5idzw.com
mov a,light_o1
mov r1,#08h
call out_SPI
setb CS
clr SCK
ret
out_SPI:
RLC A
mov SO,c
clr SCK
setb SCK
djnz r1,out_SPI
ret
程序主体部分中,根据表1将音阶数据定义成一个一维数组:
code unsigned int music_table[ ]={0x5268,0x5c80,
0x67d3,0x6e00,0x7b78,0x8a97,0x92d5,0xa4d5,0xb8ff,0xcfa7,0xdc00,0xf6f0,};
主程序的编程框图如图5所示。对AD9833芯片通过写入控制字的方式进行初始化。程序在主循环中运行。主循环对有效按键进行处理,对于有效琴键,调用音阶函数即可。音阶函数如下:
void play_music(unsigned char nn)
{
light_o = 0x20;
light_o1 = 0x00; //设控制字
to_9833();
v_3.cm_int =music_table[nn]; //查音阶表
light_o = 0x40 | (v_3.cm.cm_0 & 0x3f);
light_o1 = v_3.cm.cm_1;
to_9833(); //设频率字
light_o = 0x40;
light_o1 = v_3.cm.cm_0 / 0x40;
to_9833();
}
如有音阶2的琴键被按下有效,C语言对调用函数描述为:
play_music(2);
mov a,light_o1
mov r1,#08h
call out_SPI
setb CS
clr SCK
ret
out_SPI:
RLC A
mov SO,c
clr SCK
setb SCK
djnz r1,out_SPI
ret
程序主体部分中,根据表1将音阶数据定义成一个一维数组:
code unsigned int music_table[ ]={0x5268,0x5c80,
0x67d3,0x6e00,0x7b78,0x8a97,0x92d5,0xa4d5,0xb8ff,0xcfa7,0xdc00,0xf6f0,};
主程序的编程框图如图5所示。对AD9833芯片通过写入控制字的方式进行初始化。程序在主循环中运行。主循环对有效按键进行处理,对于有效琴键,调用音阶函数即可。音阶函数如下:
void play_music(unsigned char nn)
{
light_o = 0x20;
light_o1 = 0x00; //设控制字
to_9833();
v_3.cm_int =music_table[nn]; //查音阶表
light_o = 0x40 | (v_3.cm.cm_0 & 0x3f);
light_o1 = v_3.cm.cm_1;
to_9833(); //设频率字
light_o = 0x40;
light_o1 = v_3.cm.cm_0 / 0x40;
to_9833();
}
如有音阶2的琴键被按下有效,C语言对调用函数描述为:
play_music(2);
程序中还包含按键处理、显示、存储控制等部分,限于篇幅,不再赘述。经实测,本音源发生器产生的各音阶频率与表1设计值一致,频率误差<0.02%,波形则是“纯净”的正弦波。通过功率放大,驱动扬声器发声。
通常不同乐器发音时,均有不同特征的谐波。常规乐器难以实现只有主音、无谐波成分的音阶,而通过本文DDS芯片设计的音源器,实现了精准的无谐波成分的音阶,有独特的听觉效果。可作为基准音阶,用于各类乐器的校音。