📄 sig_main.c
字号:
//#include <absacc.h>
#include <AT89x051.H>
#include <INTRINS.H>
#include "SIGNAL.h"
//晶体为12MHZ
//extern unsigned int guiSweepCurrentFreqHigh;
extern unsigned long gulSweepCurrentFreqWord;
uchar mucTime5ms;
//uchar mucTime100ms;
//uchar mucTime1s;
//uchar mucTime60s;
uchar muc1msDelay;
uchar muc100msDelay;
//uchar muc1sDelay;
//uchar muc60sDelay;
uchar mucSweep100msDelay;
uchar mucFlashBit;
ulong mulFreq;
uchar gucKeyStatus;
uchar mucInputNumber[MAX_INPUT_NUMBERS];
uchar mucWaveMode;
bit mbDispWaveModeFlag;
bit mbDispFreqFlag;
bit mbFreqUpdateFlag;
uchar gucFunction;
//12MHz晶振
//i delay time/us
//1 5
//2 7
//3 9
/*
void delay_3add_2i_us(unsigned char i)
{
while(--i);
}
*/
//i delay time/us
//0 6+4
//1 12
//2 18
/*
void delay_6us(unsigned char i)
{
for(; i != 0; i--);
}
*/
//定时器0中断延时n*1ms,最大值为256ms
void delay_ms(uchar n)
{
for(muc1msDelay=0;muc1msDelay<n;);
}
//定时器0延时n*100ms,最大值为25600ms=25.6s
void delay_100ms(uchar n)
{
for(muc100msDelay=0;muc100msDelay<n;);
}
/*
//定时器0延时n*1s,最大值为256s=约4.27分钟
void delay_1s(uchar n)
{
for(muc1sDelay=0;muc1sDelay<n;);
}
*/
void init_device(void)
{
//晶体为24MHZ
//定时器0工作在方式1,作为16位定时器
TMOD=0x01;
TL0=-(10000%256);//5ms中断一次
TH0=-(10000/256);
TR0=1; //启动定时器0
ET0=1; //允许定时器0中断
EA=1;
mucTime5ms=0; //5毫秒计数器
//mucTime100ms=0; //100毫秒计数器
//mucTime1s=0; //秒计数器
}
//晶体为24MHZ
void time0(void) interrupt 1 using 1
{
TL0=-(10000%256);//5ms中断一次
TH0=-(10000/256);
mucTime5ms++;
muc1msDelay+=5;
if(mucTime5ms>=20)
{
mucTime5ms=0;
//mucTime100ms++;
muc100msDelay++;
mucSweep100msDelay++;
/*
if(mucTime100ms>=10)
{
mucTime100ms=0;
//mucTime1s++;
//muc1sDelay++;
/*if(mucTime1s>=60)
{
mucTime1s=0;
mucTime60s++;
}
}
*/
}
}
//晶体为24MHZ
void time1(void) interrupt 3 using 1
{
TL1=-(2000%256);//1ms中断一次
TH1=-(2000/256);
ET1=0; //允许定时器1中断
sweep_process_and_freq_ad9833_out();
ET1=1; //允许定时器1中断
}
/*
void DDS9833_set_freq (void)
{
unsigned char byte_temp;
unsigned long freq_word =0x0505AAFF ;//频率控制字
float fTemp;
fTemp=mulFreq;
fTemp=fTemp*65536/DDS_CLK_IN*65536;
freq_word =fTemp;
//freq_word =(float)mulFreq*65536/DDS_CLK_IN*65536;
_nop_(); _nop_(); _nop_(); _nop_();
DDS_UPDATE = 0;
_nop_(); _nop_(); _nop_(); _nop_();
DDS_CLK = 0;
_nop_(); _nop_(); _nop_(); _nop_();
for ( byte_temp = 0; byte_temp < 32; byte_temp++ )
{
freq_word = freq_word >> 1;
DDS_DATA = CY;
DDS_CLK = 1;
_nop_(); _nop_(); _nop_(); _nop_(); //实际应用应在延迟
DDS_CLK = 0;
}
for ( byte_temp = 0; byte_temp < 8; byte_temp++ )
{
DDS_DATA = 0;
DDS_CLK = 1;
_nop_(); _nop_(); _nop_(); _nop_();
DDS_CLK = 0;
}
DDS_UPDATE = 1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DDS_UPDATE = 0;
}
*/
void write_disp_command(uint uiWord)
{
uchar i;
//uchar ucTemp;
DISP_LOAD=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
for(i=0;i<12;i++)
{
DISP_CLK=0;
uiWord=uiWord>>1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_DATA=CY;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_CLK=1;//上升沿写入数据
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_LOAD=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_CLK=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_DATA=0;
}
void disp_Led(uchar ucLedNo,uchar ucDispNumberBCD)
{
uint uiDispCode;
uiDispCode=ucLedNo+8;
uiDispCode<<=8;
uiDispCode+=ucDispNumberBCD;
write_disp_command(uiDispCode);
}
void init_disp(void)
{
//使能串行接口
DISP_DATA=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_DATA=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
DISP_DATA=1;
//芯片内部复位
write_disp_command(0x201);
//只启用显示驱动
write_disp_command(0x401);
//设定显示参数:BCD
write_disp_command(0x58A);
//下面写数码管对应数据
//disp_Led(7,8);
disp_Led(6,8);
disp_Led(5,8);
disp_Led(4,8);
disp_Led(3,8);
disp_Led(2,8);
disp_Led(1,8);
disp_Led(0,8);
}
void flash_led(uchar ucLedNo)
{
uint uiDispCode;
uiDispCode=6;
uiDispCode<<=8;
if(ucLedNo<8) uiDispCode+=(1<<ucLedNo);
write_disp_command(uiDispCode);
}
void value_to_bcd(void)
{
uchar i;
ulong ulFreq;
ulFreq=mulFreq;
for(i=0;i<MAX_INPUT_NUMBERS;i++)
{
mucInputNumber[MAX_INPUT_NUMBERS-1-i]=ulFreq%10;
ulFreq/=10;
}
}
void disp_freq(void)
{
value_to_bcd();
disp_Led(5,mucInputNumber[5]);
disp_Led(4,mucInputNumber[4]);
disp_Led(3,mucInputNumber[3]);
disp_Led(2,mucInputNumber[2]);
disp_Led(1,mucInputNumber[1]);
disp_Led(0,mucInputNumber[0]);
}
void get_freq(void)
{
uchar i;
ulong ulFreq;
ulFreq=0;
for(i=0;i<MAX_INPUT_NUMBERS;i++)
{
ulFreq*=10;
ulFreq+=mucInputNumber[i];
}
mulFreq=ulFreq;
}
void number_add(void)
{
uchar ucTemp;
mbFreqUpdateFlag=TRUE;
mbDispFreqFlag=TRUE;
ucTemp=mucInputNumber[mucFlashBit];
if(ucTemp==9) ucTemp=0;
else ucTemp++;
//if(mucFlashBit==0 && ucTemp>2) ucTemp=0;
mucInputNumber[mucFlashBit]=ucTemp;
get_freq();
}
void number_dec(void)
{
uchar ucTemp;
mbFreqUpdateFlag=TRUE;
mbDispFreqFlag=TRUE;
ucTemp=mucInputNumber[mucFlashBit];
if(ucTemp==0)
{
ucTemp=9;
//if(mucFlashBit==0) ucTemp=2;
}
else ucTemp--;
mucInputNumber[mucFlashBit]=ucTemp;
get_freq();
}
void sweep_freq_disp_process(void)
{
mucSweep100msDelay=0;
mulFreq=gulSweepCurrentFreqWord&0x3FFFFFFF;
value_to_bcd();
disp_freq();
}
void dis_wave_mode(void)
{
disp_Led(6,mucWaveMode);
}
void wave_mode_process(void)
{
if(mucWaveMode==SWEEP)
{
sweep_start_process();
gucFunction=FUN_SWEEP;
}
else
{
gucFunction=FUN_SW;
sweep_stop_process();
//sweep_freq_disp_process();
//value_to_bcd();
get_freq();
disp_freq();
select_waveform(mucWaveMode);
}
}
void wave_mode_add(void)
{
mbDispWaveModeFlag=TRUE;
if(mucWaveMode<3) mucWaveMode++;
else mucWaveMode=1;
wave_mode_process();
}
void wave_mode_dec(void)
{
mbDispWaveModeFlag=TRUE;
if(mucWaveMode>1) mucWaveMode--;
else mucWaveMode=3;
wave_mode_process();
}
uchar key_scan(void)
{
uchar ucKey;
//ucKey=KEY_NULL;
//按键接在P3.2,P3.3,P3.4,P3.5
//P3=0x34;
ucKey=P3&KEY_NULL;
if(gucKeyStatus==KEY_HAS_BE_UP)
{
if(ucKey!=KEY_NULL)
{
delay_ms(40);
ucKey=P3&KEY_NULL;
}
if(ucKey!=KEY_NULL) gucKeyStatus=KEY_HAS_BE_DOWN;
}
else if(gucKeyStatus==KEY_HAS_BE_PROCESSED)
{
if(ucKey==KEY_NULL)
{
delay_ms(40);
ucKey=P3&KEY_NULL;
}
if(ucKey==KEY_NULL) gucKeyStatus=KEY_HAS_BE_UP;
}
return ucKey;
}
void key_process(uchar ucKey)
{
mbDispFreqFlag=FALSE;
mbFreqUpdateFlag=FALSE;
mbDispWaveModeFlag=FALSE;
switch(ucKey)
{
case KEY_LEFT:
//扫描时,只能改变输出信号模式
if(gucFunction!=FUN_SWEEP)
{
if(mucFlashBit==MAX_INPUT_LEDS) mucFlashBit=0;
else mucFlashBit++;
flash_led(mucFlashBit);
//mbDispFreqFlag=TRUE;
}
break;
/*
case KEY_RIGHT:
if(mucFlashBit==0) mucFlashBit=MAX_INPUT_LEDS;
else mucFlashBit--;
flash_led(mucFlashBit);
//mbDispFreqFlag=TRUE;
break;
*/
case KEY_UP:
if(mucFlashBit!=MAX_INPUT_NUMBERS) number_add();
else if(mucFlashBit==MAX_INPUT_NUMBERS) wave_mode_add();
break;
case KEY_DOWN:
if(mucFlashBit!=MAX_INPUT_NUMBERS) number_dec();
else if(mucFlashBit==MAX_INPUT_NUMBERS) wave_mode_dec();
break;
}
if(mbDispFreqFlag==TRUE) disp_freq();
else if(mbDispWaveModeFlag==TRUE) dis_wave_mode();
if(mbFreqUpdateFlag==TRUE)
{
freq_ad9833_out(mulFreq);
}
}
void main(void)
{
uchar ucKey;
init_device();
delay_100ms(20);
reset_ad9833(); //复位AD9833
sweep_init();
init_disp();
delay_100ms(20);
mucWaveMode=SINE;
mulFreq=500000;//500KHz
//mulFreq=5;//500KHz
value_to_bcd();
mucFlashBit=0;
flash_led(mucFlashBit);
disp_freq();
dis_wave_mode();
freq_ad9833_out(mulFreq);
gucKeyStatus=KEY_HAS_BE_UP;
while(1)
{
ucKey=key_scan();
if(gucKeyStatus==KEY_HAS_BE_DOWN)
{
key_process(ucKey);
gucKeyStatus=KEY_HAS_BE_PROCESSED;
}
if(gucFunction==FUN_SWEEP && mucSweep100msDelay>SWEEP_FREQ_DELAY_100mS) sweep_freq_disp_process();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -