|
楼主 |
发表于 2008-3-4 18:10:16
|
显示全部楼层
代码来了,用示波器看了,好像对了。
1
#define ENABLE_BIT_DEFINITIONS
#include <ioavr.h>
#include <intrinsics.h>
//[697,770,852,941,1209,1336,1477,1633]; % DTMF 信号频率表
unsigned int sigma_lo_step[] = {365,403,446,493}; // 高频率 累加器步长
unsigned int sigma_hi_step[] = {633,700,774,856}; // 低频率 累计步长
unsigned int sin_tab[32] = { // 正弦表
255,305,353,398,437,468,492,507,
511,507,492,468,437,398,353,305,
255,206,158,113,74,43,19,4,
0,4,19,43,74,113,158,206
};
unsigned char freq_lo = 0; // 高频率
unsigned char freq_hi = 3; // 低频率
#pragma vector=TIMER1_OVF_vect
__interrupt void T1_OVF_IRP(void)
{
static unsigned int sigma_lo = 0;
static unsigned int sigma_hi = 0;
unsigned int s;
sigma_lo += sigma_lo_step[freq_lo];
sigma_hi += sigma_hi_step[freq_hi];
s = sin_tab[(sigma_lo >> 8) & 0x1f];
s += sin_tab[(sigma_hi >> 8) & 0x1f];
OCR1A = s;
}
int main( void )
{
unsigned char i;
char tone = 0;
TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
TCCR1B = (1<<WGM12) | (1<<CS10);
TIMSK = (1<<TOIE1);
OCR1A = 0x1ff;
DDRD = (1<<5);
__enable_interrupt();
while(1)
{
for(i=0; i!=200; i++)
{
__delay_cycles(2000*16);
}
tone++;
if (tone == 16)
tone = 0;
__disable_interrupt();
freq_lo = tone % 4;
freq_hi = tone / 4;
__enable_interrupt();
}
}
附 滤波器电路
1 |
|