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

📄 main.c

📁 430单片机控制DDS芯片AD9850
💻 C
字号:
#include"msp430x14x.h"


#define DDS_CONTROL P4OUT 
#define S_SDIO BIT7//控制字值 p4.7
#define S_WCLK BIT6//控制字时钟p4.6
#define S_RESET BIT4//Sin复位高有效p4.4

#define C_SDIO BIT3 //p4.3 
#define C_WCLK BIT2//p4.2
#define FQ_UP BIT1//p4.1寄存器写入,信号上升沿写入(与sin的FQ_UP相接)
#define C_RESET BIT0//Cos复位信号高有效

#define CLK_EN BIT0//门控时钟控制晶振开启p5.0
 unsigned char   Cos_W_buffer[5],Sin_W_buffer[5];
int aaa=0,count=0;
void set_Sfrequency(unsigned char *p,unsigned char *q); 
void DDSInit();
void InitSys();
void ClkInit();
void UartInit();
void delay(int n); 
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;  
  unsigned char  i;
  InitSys();
   P5OUT=0x05; 
     
           Cos_W_buffer[0]=0x00; 
           Cos_W_buffer[1]=0x00;  
           Cos_W_buffer[2]=0x00;
           Cos_W_buffer[3]=0x00;
           Cos_W_buffer[4]=0x00; 
        //   Cos_W_buffer[4]&=0x40;//cos
           
           Sin_W_buffer[0]=0x00; 
           Sin_W_buffer[1]=0x00;  
           Sin_W_buffer[2]=0x00;
           Sin_W_buffer[3]=0x00;
           Sin_W_buffer[4]=0x00; 
          // Sin_W_buffer[4]&=0x00;//sin
           for(i=0;i<2;i++)
 //          {  set_Sfrequency(Sin_W_buffer,Cos_W_buffer);}
                    
           Sin_W_buffer[0]=0xff; 
           Sin_W_buffer[1]=0xff;  
           Sin_W_buffer[2]=0x76;
           Sin_W_buffer[3]=0x00;
           Sin_W_buffer[4]=0x40; 
           Sin_W_buffer[4]&=0x00;//sin
           
           
           Cos_W_buffer[0]=0xff; 
           Cos_W_buffer[1]=0xff;  
           Cos_W_buffer[2]=0x76;
           Cos_W_buffer[3]=0x00;
           Cos_W_buffer[4]=0x00; 
           Cos_W_buffer[4]&=0x40;//cos
           
           
//   set_Sfrequency(Sin_W_buffer,Cos_W_buffer);        
           
        
            

  
  while(1)
  {
    
   
  }
}



void InitSys()
{
  P4DIR|=0XFF;
  P5DIR|=0XFF; 
  ClkInit();
  DDSInit(); 
  UartInit();  
  _EINT();	//开全局中断  
}

void DDSInit()
{
  unsigned char i;
  P5OUT|=CLK_EN;//开启晶振
  DDS_CONTROL|=S_RESET+C_RESET; //复位DDS  
  for(i=0;i<0x0f;i++);
  DDS_CONTROL&=~(S_RESET+C_RESET);    
  
    DDS_CONTROL&=~(S_WCLK+C_WCLK);
    DDS_CONTROL&=~FQ_UP;
    delay(5);
    DDS_CONTROL|=S_WCLK+C_WCLK;
    delay(5);
    DDS_CONTROL&=~(S_WCLK+C_WCLK);
    delay(5);
    DDS_CONTROL|=FQ_UP;
    delay(5);
    DDS_CONTROL&=~FQ_UP;
}

void ClkInit()
{
      unsigned int iq0;
     BCSCTL1&=~XT2OFF;     						//打开XT2振荡器
     do
       {
 		IFG1 &= ~OFIFG;							// 清除振荡器失效标志
 		for (iq0 = 0xFF; iq0 > 0; iq0--);	// 延时,等待XT2起振
 	}
 	while ((IFG1 & OFIFG) != 0);				// 判断XT2是否起振
	BCSCTL2 =SELM_2+SELS;//MCLK与SMCLK都为XT2(8M)
      
}
 void delay(int n)
   {
      int j,k=0;
      for(j=0;j<n;j++)
        {
         for(k=0;k<n;k++);
        } 
     
   }
#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define USART_IN  P3IN
#define USART_OUT P3OUT
#define UTXD0 BIT4
#define URXD0 BIT5
#define UTXD1 BIT6
#define URXD1 BIT7
void UartInit()
   {  
     USART_SEL |= UTXD0 +URXD0;
      UCTL0 = CHAR+SWRST;//8位数据,1位停止位,SWRST=1开始设置串口
      UTCTL0 = SSEL1;               //选择UCLK = SMCLK=8M
      UBR00 =0x41;                  //9600波特率
      UBR10=0x03;
      UMCTL0=0x00;
      UCTL0 &= ~SWRST;              //SWRST=0结束设置串口
      ME1 |= UTXE0 + URXE0;     	//打开模块USART0     
      IE1 |= URXIE0 ;			//打开USART0接收中断
   }


void set_Sfrequency(unsigned char *p,unsigned char *q)
{  
   unsigned char cnts=0,indexs=0x01,is,js;
   unsigned char cntc=0,indexc=0x01,ic,jc;
 //     DDS_CONTROL&=~S_WCLK; //  M_SCLK=0;
      //DDS_CONTROL&=~C_WCLK;  // M_SCLK=0;
      DDS_CONTROL&=~(S_WCLK+C_WCLK);
      DDS_CONTROL&=~FQ_UP; // FQ_UP=0
      
      
      
   for( js=0;js<5;js++)
    {   
	 for( is=0;is<8;is++)
           {
             if((p[cnts]&indexs)==0)
                DDS_CONTROL&=~S_SDIO;//   M_SDIO=0;              
             else 
                DDS_CONTROL|=S_SDIO;//   M_SDIO=1;     
                
                  delay(5);
                         
                DDS_CONTROL|= S_WCLK;//  M_SCLK=1;            	       
	        DDS_CONTROL&=~S_WCLK; //    M_SCLK=0;
		     indexs<<=1;
           }
        cnts++;
        indexs=0x01;
    }
   
   
    for( jc=0;jc<5;jc++)
    {   
	 for( ic=0;ic<8;ic++)
           {
             if((q[cntc]&indexc)==0)
                DDS_CONTROL&=~C_SDIO;//   M_SDIO=0;              
             else 
                DDS_CONTROL|=C_SDIO;//   M_SDIO=1;     
                
                
                      delay(5);     
                DDS_CONTROL|= C_WCLK;//  M_SCLK=1;            	       
	        DDS_CONTROL&=~C_WCLK; //    M_SCLK=0;
		     indexc<<=1;
           }
        cntc++;
        indexc=0x01;
    }
 
	   DDS_CONTROL|= FQ_UP  ;// FQ_UP = 1;	   
           delay(15);
            DDS_CONTROL&=~(S_WCLK+C_WCLK);
	   DDS_CONTROL&=~FQ_UP  ;//  FQ_UP = 0;
 
       
} 
#pragma vector=UART0RX_VECTOR
__interrupt void receive_0(void)
  {
   static unsigned char rbuffer1,rbuffer2;  
/*   if(count==1)
   {
      Cos_W_buffer[2]=RXBUF0;
      Sin_W_buffer[2]=RXBUF0;
      count=0;
   }
   rbuffer2=RXBUF0;
   if( rbuffer2==0xff)
   {
   aaa=0xff;
   count=1;
   }
   else
   {*/
rbuffer1=RXBUF0;
count++;
 //  rbuffer1|=BIT0;
//   P5OUT= rbuffer1;
if(count==1)
{
  rbuffer1|=BIT0;
  P5OUT= rbuffer1; 
}
if(count==2)
{
Cos_W_buffer[2]=rbuffer1; 
Sin_W_buffer[2]=rbuffer1;  

}
if(count==3)
{
Sin_W_buffer[4]=rbuffer1; 
//rbuffer1|=40; 
//Cos_W_buffer[4]=rbuffer1;
//count=0;
}
if(count==4)
{
Cos_W_buffer[4]=rbuffer1; 
count=0;

}

  set_Sfrequency(Sin_W_buffer,Cos_W_buffer);
   TXBUF0=RXBUF0; 
// TXBUF0=count;
  while((UTCTL0&0x01)==0);
  }

⌨️ 快捷键说明

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