📄 dds.c
字号:
#include <absacc.h>
#include <reg51.h>
#include <stdlib.h>
#include <math.h>
#include <intrins.h>
#include <lcdhead.h>
#define uchar unsigned char
#define uint unsigned int
sbit LOAD=P2^4; //送M值至寄存器
sbit FQ_UP=P2^6; //DDS显示
sbit RESET_PHASEREG=P2^5; //复位相位累加器
/*P1口用作LED显示线*/
sbit LED_CLK=P1^0; //LED时钟线
sbit LED_DAT=P1^1; //LED数据线
uchar count=0; //已经显示的位数
bit flag=0; //是否按了ENTER,为0表示没有按
uchar idata value[6]={0,0,0,0,0,0}; //存储显示的数值
uchar mh_data=0; //送给CPLD的频率步进值高位
uchar ml_data=0; //送给CPLD的频率步进值低位
uchar phase=0; //送给CPLD相位控制字
void display(uchar i);
/*数字'1','2','3','4','5','6','7','8','9','0'的七段码字库*/
const uchar code LED_FONT[11]={ //
0xFC, //0
0x60, //1
0xDA, //2
0xF2, //3
0x66, //4
0xB6, //5
0xBE, //6
0xE0, //7
0xFE, //8
0xF6, //9
0x00, //不显示
};
void init_IO()//初始化输入输出端口
{
uchar i;
P0 = 0xFF;
P1 = 0xFF;
RESET_PHASEREG=1; //禁止相位累加器工作
LOAD=0; //回送M控制线初始为低电平
P3 = 0xFF;
for(i=0;i<6;i++)
display(10);
}
void init_int()//初始化中断
{
IE=0x81; //开外部中断0
IE0=0;
IT0=1; //外部中断0为跳变触发方式
EA=1; //CPU开中断
}
void display(uchar i)
{
uchar j,mask;
mask=0x01;
for(j=0;j<8;j++){
LED_CLK=0;
LED_DAT=( (LED_FONT[i]) & mask);
mask<<=1;
LED_CLK=1; //上升沿移位
}
displaynum(i,3,14+10*count);//在液晶屏显示数据i。
}
void clear_dds()
{
uchar i,j;
for(i=0;i<7;i++)
display(10);
if(count>0){
count-=1;
value[count]=0;
for(j=0;j<count;j++)
display(value[j]); //除最后一位外,重新显示
}
displaynum(10,3,14+10*count);
}
void reset_dds()
{
uchar i;
init_port();
init_interrupt();
count=0;
flag=0;
for(i=0;i<6;i++)
value[i]=0; //各标志位和显示数据存储区清零
for(i=0;i<7;i++) //清空数码管显示
display(10);
for(i=0;i<6;i++)
displaynum(10,3,14+10*i);
}
void enter_dds()
{
uchar i;
float temp;
uint sum=0;
uint m_data=0;
uchar phase;
flag=1;
for(i=0;i<count;i++)
sum=sum+value[i]*pow(10,count-i-1); //显示数据按权相加
temp=sum/0.964; //实际的分辨率为0.964
m_data=floor(temp);
if((temp-m_data)>=0.5){
m_data+=1;
}
LOAD=0;
ml_data=m_data; //频率步进值低位
mh_data=((m_data&0xFF00)>>8); //频率步进值高位
P0=mh_data;
LOAD=1; //上升沿送高位
_nop_();
_nop_();
_nop_();
LOAD=0;
P0=ml_data;
LOAD=1; //上升沿送低位
FQ_UP=0;
_nop_();
_nop_();
_nop_();
phase=sum%10;
FQ_UP=1; //dds输出新频率对应的波形
RESET_PHASEREG=0; //相位累加器读取增量寄存器中的值开始工作
}
main()
{
init_IO();
init_int();
clearscan();
huanying();//欢迎动画
please();//进入工作界面
_nop_();
_nop_();
_nop_();
while(1){} //等待中断
}
void interrupt_handle() interrupt 0
{
uchar disdata;
EA=0; //CPU关中断
disdata=P2&0x0F; //读取P2口的低四位显示数据编码
if(flag==0){ //没按确定键时
if(count<5){
switch(disdata){
case(0): display(0);
value[count]=0;
count+=1;
break;
case(1): display(1);
value[count]=1;
count+=1;
break;
case(2): display(2);
value[count]=2;
count+=1;
break;
case(3): display(3);
value[count]=3;
count+=1;
break;
case(4): display(4);
value[count]=4;
count+=1;
break;
case(5): display(5);
value[count]=5;
count+=1;
break;
case(6): display(6);
value[count]=6;
count+=1;
break;
case(7): display(7);
value[count]=7;
count+=1;
break;
case(8): display(8);
value[count]=8;
count+=1;
break;
case(9): display(9);
value[count]=9;
count+=1;
break;
case(10): clear_dds();
break;
case(11): reset_dds();
break;
case(12): enter_dds();
break;
}
}
else{ //当显示了6位数据后数码管和液晶屏不再显示数据,只有功能键有效
switch(disdata){
case(10): clear_dds();
break;
case(11): reset_dds();
break;
case(12): enter_dds();
break;
}
}
}
else{ //按了确定键时,只有复位键有效
if(disdata==11)
reset_dds();
}
EA=1; //CPU开中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -