📄 dds_main.c
字号:
#include <absacc.h>
#include <AT89x051.H>
#include <INTRINS.H>
#include "DDS.h"
//晶体为12MHZ
uchar mucTime5ms;
uchar mucTime100ms;
uchar mucTime1s;
//uchar mucTime60s;
uchar muc1msDelay;
uchar muc100msDelay;
uchar muc1sDelay;
uchar muc60sDelay;
uchar mucFlashBit;
ulong mulFreq;
uchar mucInputNumber[MAX_INPUT_NUMBERS];
bit mbDispUpdateFlag;
bit mbFreqUpdateFlag;
//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)
{
//晶体为12MHZ
//定时器0工作在方式1,作为16位定时器
TMOD=0x01;
TL0=-(5000%256);//5ms中断一次
TH0=-(5000/256);
TR0=1; //启动定时器0
ET0=1; //允许定时器0中断
EA=1;
mucTime5ms=0; //5毫秒计数器
mucTime100ms=0; //100毫秒计数器
mucTime1s=0; //秒计数器
}
//晶体为11.0592MHZ
void time0(void) interrupt 1 using 1
{
//TL0=0x00; //定时器0时常数为50mS
//TH0=0x4C;
TL0=-(4608%256);//5ms中断一次
TH0=-(4608/256);
mucTime5ms++;
muc1msDelay+=5;
if(mucTime5ms>=20)
{
mucTime5ms=0;
mucTime100ms++;
muc100msDelay++;
if(mucTime100ms>=10)
{
mucTime100ms=0;
//mucTime1s++;
muc1sDelay++;
/*if(mucTime1s>=60)
{
mucTime1s=0;
mucTime60s++;
}*/
}
}
}
/*
void write_freq(void)
{
uchar i;
ulong ulDDSWord;
ulong ulTemp;
uchar ucTemp;
ulDDSWord=(float)mulFreq*65536/DDS_CLK_IN*65536;
DDS_UPDATE=0;
for(i=0;i<32;i++)
{
DDS_CLK=0;
ulTemp=ulDDSWord>>i;
ucTemp=(uchar)(ulTemp&0x1);
if(ulTemp) DDS_DATA=1;
else DDS_DATA=0;
DDS_CLK=1;
}
for(i=0;i<8;i++)
{
DDS_CLK=0;
DDS_DATA=0;
DDS_CLK=1;
}
DDS_UPDATE=1;
DDS_CLK=0;
DDS_UPDATE=0;
}
*/
void DDS_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 init_dds(void)
{
DDS_RESET=0;
delay_3add_2i_us(2);
DDS_RESET=1;
delay_3add_2i_us(2);
DDS_RESET=0;
DDS_DATA=0;
DDS_CLK=0;
DDS_UPDATE=0;
DDS_UPDATE=1;
DDS_UPDATE=0;
DDS_CLK=1;
DDS_CLK=0;
DDS_UPDATE=1;
DDS_UPDATE=0;
mulFreq=0;
DDS_set_freq();
}
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(7,mucInputNumber[7]);
disp_Led(6,mucInputNumber[6]);
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;
mbDispUpdateFlag=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;
mbDispUpdateFlag=TRUE;
ucTemp=mucInputNumber[mucFlashBit];
if(ucTemp==0)
{
if(mucFlashBit==0) ucTemp=2;
else ucTemp=9;
}
else ucTemp--;
mucInputNumber[mucFlashBit]=ucTemp;
get_freq();
}
uchar key_scan(void)
{
uchar ucKey;
//按键接在P3.2,P3.3,P3.4,P3.5
P3=0x3c;
ucKey=P3&0x3c;
if(ucKey!=0x3c)
{
delay_ms(20);
ucKey=P3&0x3c;
}
if(ucKey==0x3c) ucKey=KEY_NULL;
return ucKey;
}
void key_process(uchar ucKey)
{
mbDispUpdateFlag=FALSE;
mbFreqUpdateFlag=FALSE;
switch(ucKey)
{
case KEY_LEFT:
if(mucFlashBit==MAX_INPUT_NUMBERS) mucFlashBit=0;
else mucFlashBit++;
flash_led(mucFlashBit);
//mbDispUpdateFlag=TRUE;
break;
case KEY_RIGHT:
if(mucFlashBit==0) mucFlashBit=MAX_INPUT_NUMBERS;
else mucFlashBit--;
flash_led(mucFlashBit);
//mbDispUpdateFlag=TRUE;
break;
case KEY_UP:
if(mucFlashBit!=MAX_INPUT_NUMBERS) number_add();
break;
case KEY_DOWN:
if(mucFlashBit!=MAX_INPUT_NUMBERS) number_dec();
break;
}
if(mbDispUpdateFlag==TRUE) disp_freq();
if(mbFreqUpdateFlag==TRUE)
{
//write_freq();
DDS_set_freq();
}
delay_100ms(3);
}
void main(void)
{
uchar ucKey;
//SP=0x60;
init_device();
delay_100ms(20);
init_dds();
init_disp();
mulFreq=5000000;//20KHz
value_to_bcd();
mucFlashBit=3;
//flash_led(mucFlashBit);
disp_freq();
//write_freq();
DDS_set_freq();
while(1)
{
ucKey=key_scan();
if(ucKey!=KEY_NULL) key_process(ucKey);
}
}
/*1
void main(void)
{
init_device();
delay_100ms(20);
while(1)
{
//P3_0=1;P3_1=1;P3_2=1;P3_3=1;P3_4=1;P3_5=1;P3_7=1;
//P3_0=0;P3_1=0;P3_2=0;P3_3=0;P3_4=0;P3_5=0;P3_7=0;
P1_0=1;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;
P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=0;P1_7=0;
//P1=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
//P3=0;
//P1=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
//delay_ms(2);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -