⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dds.c

📁 使用keil C51编译的DDS的LED显示源码
💻 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 + -