📄 filter.c
字号:
/***************************程控滤波函数***********************************************/
/* 使用程控滤波芯片Max261
用IO口方式
MCU --- MAX261
P0.3~P0.0--- A3~A0
P0.5~P0.4--- D1~D0
P1.0 --- WR
*/
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define nop _nop_()
#define uchar unsigned char
#define uint unsigned int
#define fclk 2 //2Mhz 即2000khz,和后面0.637恰好抵消小数部分
sbit WrMax261=P1^0;
void Filter(uchar way,float f,float q,uchar whichone);
void TransFilter(uchar ContrData);
uchar Fn(float f);
uchar Qn(float q);
/*---------控制方式way,中心频率f,品质因数q,滤波器选择whichone 0表示A,1表示B--------*/
void Filter(uchar way,float f,float q,uchar whichone)
{
uchar i;
uchar fn0;
uchar qn0;
uchar fn[3];
uchar qn[4];
fn0=Fn(f);
fn[0]=fn0&0x03;
fn[1]=(fn0&0x0c)>>2;
fn[2]=(fn0&0x30)>>4;
qn0=Qn(q);
qn[0]=qn0&0x03;
qn[1]=(qn0&0x0c)>>2;
qn[2]=(qn0&0x30)>>4;
qn[3]=(qn0&0x40)>>6;
way=way&0x03;
whichone=whichone&0x01;
TransFilter((way<<4)+(whichone<<3));
for(i=0;i<3;i++)
{
TransFilter((fn[i]<<4)+i+1+(whichone<<3));
}
for(i=0;i<4;i++)
{
TransFilter((qn[i]<<4)+i+4+(whichone<<3));
}
}
uchar Fn(float f) //频率关键字
{
uchar temp;
temp=fclk*637/f-64; //原本是*2/pi;即*0.637 fclk用M单位,f单位khz
return temp;
}
uchar Qn(float q) //品质因数关键字
{
uchar temp;
temp=128-64/q;
return temp;
}
void TransFilter(uchar ContrData) //送关键字函数
{
WrMax261=0;
P0=ContrData;
nop;
nop;
WrMax261=1;
}
void main()
{
Filter(1,11.9,32,0);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -