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

📄 fsk.c

📁 本代码是用单片机控制DDS芯片输出DDS信号 。该信号包括FSK调制信号和线性调频信号
💻 C
字号:
#include <c8051f060.h> 
#include <intrins.h>
#include "func.h"
typedef unsigned int uint;
typedef unsigned char uchar; 
 
sbit      FSYNC    = P0^7;    //片选
sbit      SDATA    = P0^5;    //串行数据
sbit      SCLK     = P0^4;    //串行时钟
/*-----------------------------------------------------------------------------
    AD9833数据传输格式:
	对于单个16位数据来说,高位在前,低位在后。
	对于频率寄存器和相位寄存器来说,先是控制字,再是数据低字节,最后是数据高字节。
 -----------------------------------------------------------------------------*/

//定义AD9833的时钟
#define  FMCLK  10000000	//AD9833的主晶振为10MHz 

 

void PORT_init (void);                 
void sysclk_init(void);                
void T0_init(void);                   
void Delay(unsigned char times);
void Delay_1ms(unsigned int time);  
void Write_word(unsigned int datas);
void init_ad9833(void);
void output0(unsigned long freq_value0);
void output1(unsigned long freq_value1);
void lfm(void);

void Delay(unsigned char times)
{
	unsigned int i;
	for(i=0;i<times;i++)_nop_();
}

void Delay_1ms(uint time)     //延时1ms程序

 { uint i,j;
    	for(i=0;i<time;i++)
		  {for(j=0;j<2640;j++);  //延时1ms,
	       }     
	 
  }

void sysclk_init(void)
{
     int n;
	 WDTCN=0xDE;  
     WDTCN=0xAD;
     SFRPAGE = 0x0f;
	 OSCXCN=0x67;                             //配置为外部石英晶振模式
     for (n=0;n<256;n++);                     //等待1ms
     while ((OSCXCN&0x80)==0);     //查询外部时钟是否稳定,若稳定,切换到外部时钟
	 CLKSEL=0x01;                              //选用外部晶振
    
}
void PORT_init (void)
{
     SFRPAGE = CONFIG_PAGE;              
     XBR0    = 0x04;                    
     XBR1    = 0x00;
     XBR2    = 0x40;            //交叉开关使能,:UART1的TX和RX不能连到两个端口引脚。          
     P0MDOUT|= 0xff;                   
     P1MDOUT|= 0xff;
     P2MDOUT|= 0xff;
     P3MDOUT|= 0xff;    
     P4MDOUT|= 0xff;            // 所有的 EMIF管脚都配置成推挽方式
     P5MDOUT|= 0xff;                    
     P6MDOUT|= 0xff;
     P7MDOUT|= 0xff;
                   
}

void T0_init(void)           //定时器初始化,用来测定延时的时间
{
     SFRPAGE =0x00;
	 TMOD=0X21;             //方式1 65536
	 CKCON=0X18;
	 TF0=0;
	 TH0=0X00;      //定时器0高字节
	 TL0=0X00;      //定时器0低字节
	 IE|=0X02;      //IE是中断允许寄存器  ,允许定时器0中断
	 IP|=0X02;      //IP是中断优先级寄存器  ,定时器0中断为高优先级
}
void T0_ISR() interrupt 1
{      uint ch;
     
       TF0=0;                              //该位可以用软件清0,但当CPU 转向定时器0中断服务程序时该位被自动清0。
       ch++;
}
//-----------------------------------------------------------------------
//Write_word    : 写16位数据到I/O接口,软件模拟片选,时钟信号。
// 
//输入参数:	datas:	数据(16位)
//-----------------------------------------------------------------------
void Write_word(unsigned int datas)
{
    unsigned char i;
 
    //unsigned int datas_l,datas_h;
    
	// datas_l=datas&0x00FF;
    // datas_h=datas>>8;
    SCLK =1; 
     
   	FSYNC=1;

	Delay(100) ;
	
	FSYNC=0;        //片选有效
 
	
	for(i=0;i<16;i++)
	{
        
	    SDATA=datas&0x8000;   
	   		   	   
		SCLK=0;             //时钟信号下降沿数据送入I/O口。
	    Delay(50) ;
		SCLK=1;
		
		datas=datas<<1;     //16位数据从高位到低位送入
	}
	
 	Delay(50) ;
	FSYNC=1;
	SCLK=0;

	Delay(10) ;

}

void init_ad9833(void)
{
      
    Write_word(0x2100);	//28位连续,选择频率0,相位0,RESET=1  ; 配置控制寄存器
    Write_word(0x4000);	//写频率0寄存器的低字节LSB
	Write_word(0x4000);	//写频率0寄存器的高字节MSB
	Write_word(0x2900);	//28位连续,选择频率1,相位0,RESET=1
	Write_word(0x8000);	//写频率1寄存器的低字节LSB
	Write_word(0x8000);	//写频率1寄存器的高字节MSB
	Write_word(0x2000);	//28位连续,选择频率0,相位0,RESET=0	
 
}  

void output0(unsigned long freq_value0)
{    
    unsigned long dds,M;
	unsigned int dds_l,dds_ll,dds_h,dds_hh;
    
    M=268435456;
    // dds=freq_value0*M/FMCLK;
     dds=freq_value0*26.8435456 ;  //dds是频率控制字
    
    dds_h=dds>>14;                 // 高字节
    dds_hh =dds_h | 0x4000;        // 写到频率0寄存器
     
    
	dds_l=dds & 0x7FFF;            //低字节
    dds_ll= dds_l | 0x4000;        // 写到频率0寄存器
	
 
 
 	Write_word(0x2000);	//28位连续,选择频率0,相位0,RESET=0  控制字
    Write_word(dds_ll); //数据低字节
 	Write_word(dds_hh); //数据高字节
	 
}  

void output1(unsigned long freq_value1)
{    
    unsigned long dds,M;
	unsigned int dds_l,dds_ll,dds_h,dds_hh;
    
    M=268435456;
    // dds=freq_value0*M/FMCLK;
     dds=freq_value1*26.8435456 ;    //dds是频率控制字 268435456/ FMCLK
    
    dds_h=dds>>14;                   // 高字节
    dds_hh =dds_h | 0x8000;          // 写到频率1寄存器
     
    
	dds_l=dds & 0x3FFF;              //低字节
    dds_ll= dds_l | 0x8000;          // 写到频率1寄存器
	
 
 
  	 Write_word(0x2800);	//28位连续,选择频率1,相位0,RESET=0,控制字
     Write_word(dds_ll);    //数据低字节
  	 Write_word(dds_hh);    //数据高字节
	 
}  

void lfm(void)                //线性调频信号
{ unsigned int j;
  for(j=6800;j<=7300;j++)
    { output0(j);
	  Delay_1ms(1) ;  //延时1ms
     }
}
 

void main(void)
{ uint i;
     
  sysclk_init();
  PORT_init (); 
  init_ad9833();
   while(1)
  {  //输出七位巴克码1110010 ,每个码元是100ms.
     output1(7230);
	 Delay_1ms(300) ;        //  延时300ms
     
	 output0(6830);
   	 Delay_1ms(200) ;         //延时200ms
     
	 output1(7230);
     Delay_1ms(100) ;         //延时100ms
     
	 output0(6830);
     Delay_1ms(100) ;         //延时100ms 
	  
	  //输出线性调频信号
	  lfm();  
      //输出16位信息码1010101010101010
	    for(i=0;i<8;i++)
	 {
	    output1(7230);   //延时100ms
        Delay_1ms(100) ;  
	    
		output0(6830);   //延时100ms
        Delay_1ms(100) ;  
     } 
         
   }
   
}

⌨️ 快捷键说明

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