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

📄 code.txt

📁 用单片机控制dds进行实时采样 并通过反馈保证相位无突变。。!! 将输出的波形 进行周期放大
💻 TXT
字号:

/*
程序中的所用端口
;P1    进行单片机DDS的数据传输
;P2.0  连接DDS中的W_CLK信号
;P2.1  连接DDS中的FQ_UD信号
;P2.2  连接DDS中的RST信号 
;P2.3  控制四种模式的选择
;P2.4  控制四种模式的选择
(0:主轴频率的三倍正弦波输出1:主轴频率的24倍输出的方波,2:主轴频率的36倍输出的方波,3:主轴频率的48倍输出的方波)
;P3.2  连接反馈的中断信号进行放大,相位控制的作用
;P3.5  连接24个脉冲的输入信号。
;P3.7  控制方波的放大  
*/
#include <reg51.h>
#include "stdio.h" 
      sbit MODEONE=P2^3;         //倍频选项
      sbit MODETWO=P2^4 ;       //分频选项				
      sbit control_big=P3^7;   //控制放大信号
      sbit RESET=P2^2 ;      //9851复位信号
      sbit W_CLK=P2^0 ;     //9851 时钟脉冲
      sbit FQ_UD=P2^1 ;    //9851 数据输入标志

                  //另外 9851的RESET 连接单片机的 RESET

 int count_time=0,count_plus=0,flag=0,break_flage=0,MODE=0,temp=0;
 //count_time用来计算四个脉冲的时间,count_plus用来计算脉冲的个数 flag是否进行了转换的标志位,break_flage是否达到最高点相位的标记
 //mode 根据用户要求所选用的几种模式,temp 传递定时2ms的个数
 char th0=0,tl0=0; //传递定时未到2ms时走过的时间
 void delay(int num); //延时函数



void main() 
{       
      	float  fre=0;                               //主轴的频率
		float  everytime=0,maintime=0;              //everytime每四个小脉冲的时间,maintime主轴的一周的时间
        long int fh=0;                              //四种模式下的的频率控制字
		int i=4,j=0,l=0,first=1,former_mode=0;      //i,j计数参数 ,first第一次进入函数的时候的标记,form_mode纪录每一次的mode的状态
		unsigned char word[5]={0};                  //dds的频率控制字

		//初始化设定
		MODEONE=0;     
		MODETWO=1;           //默认输出模式为1
		control_big=0;       //控制放大的变量
        TMOD=0X51;           //定时器的控制模式:T0定时 T1计数
    	TH0=0XF8;      
        TL0=0X30;           //定时器0 2ms产生一次中断
        ET0=1;              //开定时器0,1的中断
		ET1=1;
        TH1=0XFF;          //定时1每四个脉冲采样一次
        TL1=0XFC;          
		PT1=1;              //设置T1的中断优先级高于T0
		IT0=1;             //设置外部中断的触发方式为边沿触发
        EA=1;              //开中断
        TR1=1;             //T1开始计数
        RESET=0;           //DDS的复位信号
          

     while(1)              
{   former_mode=MODE;      
/*  进行模式的判断默认模式1即原频率输出0:主轴的三倍频正弦波1:主轴的24倍频方波2:主轴的36倍方波3:主轴的48倍方波*/  
    if((MODEONE&MODETWO)==1)
	{ 
	MODE=1;EX0=1;
	}
	else if ((MODEONE|MODETWO)==0)
	{
	MODE=2;EX0=1;
	}
	else if(MODEONE==1)
	{
	MODE=3;EX0=1;
	}
	else 
	{MODE=0;}


/*模式的初始化设定*/
    	 if(former_mode!=MODE)
	{
     count_plus=0;
	 former_mode=MODE;
	}
	  
	if(first==1)
	{
	 EX0=1;
	}
	/*如果进行了转换则重新写频率控制字从而改变输出频率*/
	   if(flag==1|first==1)              
     {  
	 /*通过计时算出来所得到的主轴频率*/
	   everytime=(temp*0.002)+(((th0-0xf7)*256+(tl0-0x50))*0.000001);    
	   maintime=everytime*6;
	   fre=1/maintime;
	   fh=(long int)(143.16557*fre);
                                    
     /*根据所选用的模式来计算输出的频率*/
        if(MODE==0)
		{	
          fh=fh*3;
		}
        if(MODE==1)
		 {
            fh=fh*24;
		 }
		  if (MODE==2)
		 {
		    fh=fh*36;
		 }
		 if(MODE==3) 
		 {
		   fh=fh*48;
		 }
        
       /* 完成32位数字到8位数字的转换从而实现频率控制字的输出*/
		 i=4;
      while(fh>0&&i>0)
       {
	    if(fh>0)
		{word[i]=fh%256;
	     fh=fh/256;
		 i--;
		 }
		}
		for(j=i;j>0;j--)
		{
         word[i]=0;
		}
		word[0]=0x00;
		if(MODE==0)
		{
	      word[0]=0x40;
		}

      /*将所得到的频率字写入DDS中去*/
     
      //初始化信号脚 启动芯片工作	
        FQ_UD=1;  
	    delay(1);
        FQ_UD=0;  	
	//进行控制字的传输
        P1=0x00;
	    W_CLK=0;
		for(i=0;i<=4;i++)
        {
		P1=word[i];
        W_CLK=1;
        delay(1);
	    W_CLK=0;
		}
	   
      /* 该处接反馈信号用来实现三倍频的稳定输出判断上升沿*/ 
            EX0=1;
        if(first!=1&&MODE==0)
	{     
	    while(1)
		{
		 if (break_flage==1)
		  break;
		}       
	}
	   FQ_UD=1;          //DDS的控制字写入DDS中
	   
	   /*处理标志位*/ 
       break_flage=0;        
       flag=0;     
       first=0;
	}
  }
}
/*输入脉冲的接入端P3.5为T1的外部中断计数端口,用计数中断来实现对输入脉冲的采样*/      
void T1_INTERUPT(void) interrupt 3 using 0
{        ET0=0;
         TR1=0;
		 th0=TH0;
		 tl0=TL0;
    	 TH0=0xF8;       //每次中断对定时器T0重新赋初值
         TL0=0x30; 
         TR0=1;         
         flag=1;         
	 	 temp=count_time;//计时参数的传递
		 count_time=0;
		  ET0=1;
         TH1=0xFF;       
         TL1=0xFC;
		 TR1=1;             
  
}
/*T0用来实现2ms的定时中断*/
void T0_FIXTIME(void) interrupt 1 using 0
{      
       TR0=0;
	   ET1=0;	
       count_time++;                      
       TH0=0xF8;       
       TL0=0x30; 
       TR0=1;
	    ET1=1;
}
/*用来实现三倍频相位的纠正和其他方波信号的周期放大功能*/
void EX0_correctphase(void) interrupt 0 using 0
{
         EX0=0;
		 ET0=0;
		 ET1=0;
		 if(count_plus==0)
        { control_big=0;
		}
         count_plus++;
        
        if(MODE==1&&count_plus==24)
		{
		 control_big=1;
		 count_plus=0;		 
		}
	    
		if(MODE==2&&count_plus==36)
		{		
		control_big=1;
		count_plus=0;

		}
		if(MODE==3&&count_plus==48)
		{
		 control_big=1;
		 count_plus=0;
		}
        EX0=1; 
        ET0=1;
		ET1=1;
		if(MODE==0)
		{
		break_flage=1;
	    EX0=0;
		}
}
/*一个延时的时间是8us的子程序*/
void delay(int num)  

{ unsigned int i=0;
 for(i=0;i<num;i++)
{;}
}

  

    









 

⌨️ 快捷键说明

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