📄 signal_c.c
字号:
asm(".include hardware.inc");
unsigned long int Freq_Ctrl_Word=0x14f8c;//0x051eb851;//=0x19581062;//=0x051eb851;//32位的频率控制字
unsigned long int Volt_Ctrl=0;//=0xbb00; //内部DA输出控制
unsigned int Phase_Ctrl_Word=0x0000; //5位的相位控制字
float freq;//=20000; //(=Freq_Ctrl_Word*0.0002328306436539);//初始频率
float Volt_Show=0.0; //待显示的幅度电压
int Work_Mode=0x0000;//2位的电源工作方式 ,选择00
int W_Clk=1; //1位的字装入控制信号,将频率控制字,相位控制字,芯片工作方式等
//写入AD9851内部的40位内部寄存器 ,上升沿有效
int Freq_Ud=0; //频率更新控制字 ,上升沿有效
int w[40]; //将40位的数据分为5个字节存储在一个数组中
int Key_Val; //键值
int Am_Ctrl_Word=0x0000;//幅度控制字 ,初始化为0
int e_pre_set=0; //预置使能
int e_add=0; //自动步进使能
int flag=1; //预置时的位标志
//=============================================================================
//函数名称:void W_Load(void)
//函数功能:获取40位串行数据
//=============================================================================
void W_Load(void)
{int i;
for(i=0;i<40;i++)
{
Watchdog();
if(i>=0&&i<32)
{
w[i]=((Freq_Ctrl_Word>>i)<<31)>>31;
}
else if(i==32)
w[i]=0; //6倍频关闭
else if(i==33||i==34)
w[i]=Work_Mode; //工作模式置为00
else
w[i]=((Phase_Ctrl_Word>>(i-35))<<4)>>4;
}
}
//==============================================================================
//函数名称:void Write_Ad9851(int n)
//函数功能:向AD9851写数据
//参数说明:n 第n位串行数据
//==============================================================================
void Write_Ad9851(int n)
{
int data;
data=((W_Clk<<1)+(Freq_Ud<<2)+w[n])<<4;
asm("[P_IOA_Data]=%0"::"r"(data));
}
//========================================================================
//函数名称:void Sin_Ctrl(void)
//函数功能:正弦信号的产生
//===============================================================================
void Sin_Ctrl(void) //采用IOA0输入串行数据AD9851,IOA1 W_Clk IOA2 Fq_Uq
{
int j;
W_Load();
Freq_Ud=0;
asm("[P_IOA_Data]=%0"::"r"(0x0020));
for(j=0;j<40;j++)
{
Watchdog();
W_Clk=0;
Write_Ad9851(j);
delay(50);
W_Clk=1;
Write_Ad9851(j);
delay(50);
}
Freq_Ud=1;
delay(50);
asm("[P_IOA_Data]=%0"::"r"(0x0060));
delay(500);
delay(500);
delay(500);
}
//===========================================================================
//函数名称:void Key_Ctrl(void)
//函数功能:键盘控制
//===============================================================================
void Key_Ctrl(void)
{
switch(Key_Val)
{
case 0xee00:{ Freq_Adjust(); break;} //频率步进
case 0xde00:{ e_add=1; Auto_Add(); break;}//频率自动步进
case 0xbe00:{e_pre_set=1;break;} //进入预置模式
case 0x7e00:{e_pre_set=0;break;} //退出预置模式
case 0xb700:{ Am_Adjust(); break;} //调幅
case 0x7700:{Zhan_Kong_Bi();break;} //调占空比
}
if(e_pre_set==1)
{
switch(Key_Val)
{
case 0xed00: {flag++;if(flag==6) {flag=1;set(5,1);}else set(flag-1,1);break;}
case 0xdd00: {flag++;if(flag==6) {flag=1;set(5,2);}else set(flag-1,2);break;}
case 0xbd00: {flag++;if(flag==6) {flag=1;set(5,3);}else set(flag-1,3);break;}
case 0x7d00: {flag++;if(flag==6) {flag=1;set(5,4);}else set(flag-1,4);break;}
case 0xeb00: {flag++;if(flag==6) {flag=1;set(5,5);}else set(flag-1,5);break;}
case 0xdb00: {flag++;if(flag==6) {flag=1;set(5,6);}else set(flag-1,6);break;}
case 0xbb00: {flag++;if(flag==6) {flag=1;set(5,7);}else set(flag-1,7);break;}
case 0x7b00: {flag++;if(flag==6) {flag=1;set(5,8);}else set(flag-1,8);break;}
case 0xe700: {flag++;if(flag==6) {flag=1;set(5,9);}else set(flag-1,9);break;}
case 0xd700: {flag++;if(flag==6) {flag=1;set(5,0);}else set(flag-1,0);break;}
}
}
}
//=================================================================================
//函数名称:void set(int m,int n)
//函数功能:位预置函数
//参数说明:m 预置的当前位 n 预置的数
//=================================================================================
void set(int m,int n) //五位数从左到右分别位第一位到第五位
{
if(m==1) {freq=freq-(((int)freq)/10000%10)*10000+n*10000;} //将第一位预置为n
if(m==2) {freq=freq-(int)freq/1000%10*1000+n*1000;} //将第二位预置为n
if(m==3) {freq=freq-(int)freq/100%10*100+n*100;} //将第三位预置为n
if(m==4) {freq=freq-(int)freq/10%10*10+n*10;} //将第四位预置为n
if(m==5) {freq=freq-(int)freq%10+n;} //将第五位预置为n
Freq_Ctrl_Word=freq*4294.967296;
Sin_Ctrl();
display();
}
//================================================================================
//函数名称: void Auto_Add(void)
//函数功能:自动步进
//================================================================================
void Auto_Add(void)
{
while( e_add==1)
{
Freq_Ctrl_Word+=0x00fd6;
Sin_Ctrl();
Watchdog();
display();
Key_Val=Get_Key();
if(Key_Val==0xde00) e_add=0;
}
}
//================================================================================
//函数名称:void delay(int m)
//函数功能:延时
//参数说明:m 决定延时时间长短
//================================================================================
void delay(int m)
{
int i;
for(i=0;i<m;i++)
Watchdog();
}
//================================================================================
//函数名称:void Freq_Adjust(void)
//函数功能:调频
//================================================================================
void Freq_Adjust(void)
{
Freq_Ctrl_Word+=0x0000fd6;//频率步进1Hz
if(Freq_Ctrl_Word<0x000101d6)
{
Freq_Ctrl_Word=0x00000000;
}
Sin_Ctrl();
}
//=================================================================================
//函数名称:void display(void)
//函数功能:显示
//=================================================================================
void display(void)
{
float temp;
int data;
freq=Freq_Ctrl_Word*0.0002328306436539;
temp=freq/1000.0;
data=(int)temp/10;
Light_Led(8,data);
data=(int)(temp)%10;
Light_Led(7,data+128);
data=(int)(temp*10)%10;
Light_Led(6,data);
data=(int)(temp*100)%10;
Light_Led(5,data);
data=(int)(temp*1000)%10;
Light_Led(4,data);
if(e_pre_set==1)
Light_Led(3,flag);//在第3位显示当前预置的数的位置
else
Light_Led(3,0);
data=(int)Volt_Show;
Light_Led(2,data+128);
data=(int)(Volt_Show*10)%10;
Light_Led(1,data);
}
//===============================================================================
//函数名称:void Am_Adjust(void)
//函数功能:调幅
//=================================================================================
void Am_Adjust(void) //B口低8位控制外部DAC以实现调幅
{
Am_Ctrl_Word+=0x0003;
Volt_Show+=0.1;
if(Am_Ctrl_Word>0x00ff)Am_Ctrl_Word=0x00ff;
if(Volt_Show>=8.0) Volt_Show=8.0;
asm("[P_IOB_Data]=%0"::"r"(Am_Ctrl_Word));
}
//==================================================================================
//函数名称:void Zhan_Kong_Bi(void)
//函数功能:调占空比
//==================================================================================
void Zhan_Kong_Bi(void)
{
Volt_Ctrl+=0x00f0;
if(Volt_Ctrl>=0xffc0) Volt_Ctrl=0xffc0;
DA();
}
//==============================================================================
//函数名称:int main (void)
//函数功能:主函数
//=================================================================================
int main (void)
{
Init_Sys();
Sin_Ctrl();
while(1)
{
Sin_Ctrl();
Watchdog();
display();
Key_Val=Get_Key();
Key_Ctrl();
}
}
//====================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -