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

📄 slave.c

📁 通过按键控制数字电位器x9312和dds芯片9835
💻 C
字号:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

//-----------------------------------------------------------------------------------------------
sbit key_1=P3^7;
sbit key_2=P3^6;
sbit key_3=P3^5;
sbit key_4=P3^4;	
sbit led_1=P1^0;      //测试用
sbit D_CS=P2^4;       //dds片选
sbit FSET=P2^5;       //dds预设置频率,当改变电平时候,可以切换两个频率
sbit D_SDA=P2^6;      //dds输入数据口
sbit D_SCLK=P2^7;     //dds时钟信号
sbit cs_9312=P2^2;    //数字电位器9312片选
sbit up_9312=P2^1;    //9312方向控制
sbit step_9312=P2^0;  //9312步进控制
//-----------------------------------------------------------------------------------------------
//External Variables


//-----------------------------------------------------------------------------------------------
//Functions

void delay(uint x);
void init9835(void);
void send9835(float feq);
void SendData(unsigned int d);
void Control9312(uchar flag);
//-----------------------------------------------------------------------------------------------
//the main fuction
main()
{
 float feq;

 P0=0XFF;
 P1=0XFF;
 P2=0XFF;
 P3=0XFF;
 
 key_1=1;
 led_1=1;
 D_CS=1;
 FSET=1;
 D_SDA=1;
 D_SCLK=1;
 feq=300;          //初始频率30hz
 init9835();      //初始化dds
 send9835(30);    //开始输出频率3hz        
 while(1)
 {
  delay(10000);
  if(!key_1)//如果按下按键1幅度增加
  Control9312(1);
  else if(!key_2)//如果按下按键2幅度减小
  Control9312(0);
  else if(!key_3)//如果按下按键3频率减小
  {
   if(feq>30)
   {
    feq=feq-1;
	send9835(feq);
   }
  }
  else if(!key_4)//如果按下按键4频率加大
  {
   if(feq<10000)//实际最大只有300hz 左右,可以修改dds子程序扩大频率范围。
   {
    feq=feq+1;
	send9835(feq);
   }
  }
 }
}


void delay(uint x)//这里的延时具体没有算过,应该查看汇编代码,然后根据时钟计算。
{
	uint j;
 	for(j=0;j<x;j++);
   
}

void init9835(void)//dds初始化,具体可以查看ddsdatasheet
{
   
    SendData(0xf800);
    SendData(0xa000);
                          
    SendData(0x3000+0);      
    SendData(0x2100+0);
    SendData(0x3200);
    SendData(0x2300);

    SendData(0x3400+0);      
    SendData(0x2500+0);
    SendData(0x3600);
    SendData(0x2700);
	
	
    SendData(0x1800); //写相位
    SendData(0x0900);
    SendData(0x1a00);
    SendData(0x0b00);
    SendData(0x1c00);
    SendData(0x0d00);
    SendData(0x1e00);
    SendData(0x0f00);
	
    SendData(0xC000);

}
void send9835(float feq)           //写dds数据
{    
    float feqnum;
	feqnum=feq*214.748;//20m系数    feqnum = feq/20*2^32
	feqnum=(feqnum+0.5);                         
    SendData(0x3000+(((uint)feqnum)%256));   //频率低位   
    SendData(0x2100+(((uint)feqnum)/256));
    SendData(0x3200);                       //我在这里把feqnum的高位强制设为零了,实际上可能feqnum不止65535?    SendData(0x2300);//频率最高位           //实际最高可以到1m

    SendData(0x3400+(((uint)feqnum)%256));   //这里保存的数据可以提供给当fset电平改变时候的输出频率数据。   
    SendData(0x2500+(((uint)feqnum)/256));
    SendData(0x3600);
    SendData(0x2700);
} 

void SendData(unsigned int d)//16位读写。
{
   unsigned char i;
   D_CS=0;
   for(i=0;i<16;i++)
   {
	  if((d&(1<<(15-i))))
      D_SDA=1;
	  else
	  D_SDA=0;
      D_SCLK=1;
      D_SCLK=0;
   }    
   D_CS=1;   
}

void Control9312(uchar flag)//控制9312
{
  cs_9312=0;
  if(flag)
  {
    up_9312=1;
	step_9312=1;
	step_9312=0;
	step_9312=1;
  }
  else
  {
    up_9312=0;
	step_9312=1;
	step_9312=0;
	step_9312=1;
  }
  cs_9312=1;
}

⌨️ 快捷键说明

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