#include <absacc.h>
#include <regx51.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#define dds1 XBYTE [0x0404]
#define dds2 XBYTE [0x040A]
#define osk XBYTE[0x0420]
#define upclk XBYTE[0X041F]
#define pll XBYTE[0x041e]
#define out_multi XBYTE[0x0421]
#define delta XBYTE[0x0410]
#define ramp_rate XBYTE[0x041a]
#define u16 unsigned int
#define u8 unsigned char
#define coeff 281474976.710656
//以下为Ramped FSK中用到的特殊量
#define clear 0x80 //清累加器1
#define resume 0x7f //恢复累加器1
sbit REST=P1^0;
sbit up_clk=P1^1;
sbit FBH=P1^2;
sbit SHIPKING=P1^4;
u8 ftw1[6];
u8 ftw2[6];
bit out_flag;
u8 pwm_val;
void delayUs(long t)
{
t = t / 3;
while(t --);
}
#define nop(t) delayUs(t)
void upclk_out(u16 pwm_d)
{
if(out_flag)
{
if(pwm_val<pwm_d) {up_clk=1;}else {up_clk=0;}
if(pwm_val>=5) {pwm_val=0;out_flag=0;}
}
else up_clk=0;
}
static void timer1_work(void) interrupt TF1_VECTOR using 2
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
pwm_val++;
out_flag=1;
upclk_out(2);
}
void init_interrupt(void) //
{
IE=0X89;TCON=0X71; //TIME0定时器初始化程序
TMOD=0x10;
TH1=(65536-10)/256;
TL1=(65536-10)%256;
EA=0;
EA=1;
IT0=1;IT1=1;
}
void set_freq(float x,float y)
{
u8 k;
float ftw,temp;
ftw=(x*coeff)/100;
for(k=9;k>3;k--)//计算频率1的控制字
{
temp=floor(ftw/256);//取商
temp=ftw-temp*256;//取余
ftw1[k-4]=(u8)temp;//转换成十六进制,单片机寄存器最高位对应频率控制字最低位
ftw/=256;
}
ftw=(y*coeff)/100;
for(k=9;k>3;k--)//计算频率2的控制字
{
temp=floor(ftw/256);//取商
temp=ftw-temp*256;//取余
ftw2[k-4]=(u8)temp;//转换成十六进制,单片机寄存器最高位对应频率控制字最低位
ftw/=256;
}
for(k=0;k<6;k++) //写频率控制字1
*( (&dds1) +k)=ftw1[k];
for(k=0x00;k<0x06;k++)//写频率控制字2
*( (&dds2) +k)=ftw2[k];
//取最终的地址的内容 取地址 地址加i
}
void Updata_Deltaword(void)
{
u8 k;
unsigned char deltaword[6]={0x00,0x80,0x00,0x00,0x00,0x00}; //40bit = 585.9khz
for(k=0;k<6;k++) //写频率控制字1
*( (&delta) +k)=deltaword[k];
}
void Updata_Ramprateword(void)
{
u8 k;
unsigned char ramprateword[3]={0x00,0x75,0x30}; // 时间步进 现取100us 最大6990.506us
for(k=0;k<4;k++) //写频率控制字1
*( (&ramp_rate) +k)=ramprateword[k];
}
void fmchirp(void)
{
u8 rate_n[3]={0,0xff,3};//Ramp Rate 为0.1us
u8 dfw[6]={0xc0,0x5a,0x7c,0x0a,0,0};//斜率25HZ D 1B 71 75 8E
set_freq(10000,11000);
pll=0x0a;//系统时钟设置为100M
osk=0x40;//关闭反辛格函数滤波
XBYTE[0x0421]=0x00;
XBYTE[0x0422]=0;//幅度字为0
upclk=0x86;
while(1)
{
set_freq(1000,0); //更新频率字
Updata_Deltaword(); //更新频率步进字
Updata_Ramprateword(); //更新时间步进字
up_clk=1;
nop(1000);
up_clk=0;
FBH=1;
nop(1);
FBH=0;
}
}
void main()
{
init_interrupt();
fmchirp();
}
评论0