求max262的程序 以及软件的用法
/***************************程控滤波函数***********************************************/
/* 使用程控滤波芯片Max262
用IO口方式
MCU --- MAX262
P0.3~P0.0--- A3~A0
P0.5~P0.4--- D1~D0
P1.0 --- WR
*/
#include<c8051f020.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 WrMax262=P1^0;
void Filter(uchar way,float f,float q,uchar whichone);
void TransFilter(uchar ContrData);
uchar Fn(float f);
sfr16 RCAP2 = 0xca;
sfr16 TMR2 = 0xcc;
#define SYSCLK 16000000
/*sbit max262wr = P3^7;
sbit max262a0 = P3^6;
sbit max262a1 = P3^5;
sbit max262a2 = P3^4;
sbit max262a3 = P3^3;
sbit max262d0 = P3^1;
sbit max262d1 = P3^0;*/
uchar Qn(float q) //品质因数关键字
{
uchar temp;
temp=128-64/q;
return temp;
}
/*---------控制方式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;
}
void TransFilter(uchar ContrData) //送关键字函数
{
WrMax262=0;
P0=ContrData;
nop;
nop;
WrMax262=1;
}
/****************************************
系统时钟初始化
*****************************************/
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 启动外部振荡器16MHz晶体
for (i=0; i < 256; i++) ; // 等待振荡器启动
while (!(OSCXCN & 0x80)) ; // 等待振荡器稳定
OSCICN = 0x88; // 选择外部振荡器为时钟源并使能丢失时钟检测器
}
/**************************************
端口引脚初始化
*************************************/
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; // 使能数据交叉开关和弱上拉
P2MDOUT |= 0xff;
P3MDOUT |=0xff;
//P74OUT |= 0xff; // 使能为推挽输出
}
/**************************************
定时延时函数
*************************************/
void Delay_MS(unsigned int ms) //延时mS
{
CKCON &= ~0x20; // use SYSCLK/12 as timebase
RCAP2 = -(SYSCLK/1000/12); // Timer 2 overflows at 1 kHz
TMR2 = RCAP2;
ET2 = 0; // Disable Timer 2 interrupts
TR2 = 1; // Start Timer 2
while(ms)
{
TF2 = 0; // Clear flag to initialize
while(!TF2); // Wait until timer overflows
ms--; // Decrement ms
}
TR2 = 0; // Stop Timer 2
}
void main()
{
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init (); //初始化时钟
PORT_Init (); //初始化IO口
Filter(1,11.9,32,0);
while(1);
}