⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm_chirp.c

📁 最近作的AD9852的FM扫频模式
💻 C
字号:
#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();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -