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