📄 slave.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 + -