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

📄 9850.c.c

📁 基于AD9850的正弦波发生器的源码
💻 C
字号:
/****************定义头文件*****************/
#include<reg52.h>
#include<absacc.h>
#include<math.h>
#include<intrins.h>
/****************宏定义*********************/
#define uchar unsigned char
#define uint unsigned int
#define BOOL bit
#define DDS_date P1
/***************定义所使用的引脚************/
sbit rs = P3^2;
sbit rw = P3^3;
sbit ep = P3^4;
sbit  W_CLK= P3^7 ;
sbit  FQ_UD= P3^6 ;
#define DDS_date P1
/**************定义全局变量*****************/
uchar  KbHit,ucKey;
uchar  Key,key_value;
uchar  flag_ready;
//lcd_wdat(ucKey);



uchar code DDS_word_1MHz[10][4]={
    0x00,0x00,0x00,0x00,           //0
    0x19,0x99,0x99,0x9A,           //1
    0x33,0x33,0x33,0x33,           //2
    0x4C,0xCC,0xCC,0xCD,           //3
    0x66,0x66,0x66,0x66,           //4
    0x80,0x00,0x00,0x00,           //5
    0x99,0x99,0x99,0x9A,           //6
    0xB3,0x33,0x33,0x33,           //7
    0xCC,0xCC,0xCC,0xCD,           //8
    0xE6,0x66,0x66,0x66            //9
    };
uchar  code DDS_word_100KHz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x02,0x8F,0x5C,0x29,        //1
    0x05,0x1E,0xB9,0x52,        //2
    0x07,0xAE,0x14,0x7B,        //3
    0x0A,0x3D,0x70,0xA4,        //4
    0x0C,0xCC,0xCC,0xCD,        //5
    0x0F,0x5C,0x28,0xF6,        //6
    0x11,0xEB,0x85,0x1F,        //7
    0x14,0x7A,0xE1,0x48,        //8
    0x17,0x0A,0x3D,0x71         //9
    };
uchar  code DDS_word_10KHz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x00,0x41,0x89,0x37,        //1
    0x00,0x83,0x12,0x6F,        //2
    0x00,0xC4,0x9B,0xA6,        //3
    0x01,0x06,0x24,0xDD,        //4
    0x01,0x47,0xAE,0x14,        //5
    0x01,0x89,0x37,0x4C,        //6
    0x01,0xCA,0xC0,0x83,        //7
    0x02,0x0C,0x49,0xBA,        //8
    0x02,0x4D,0xD2,0xF2         //9
    };
uchar  code DDS_word_1KHz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x00,0x06,0x8D,0xB9,        //1
    0x00,0x0D,0x1B,0x71,        //2
    0x00,0x13,0xA9,0x2A,        //3
    0x00,0x1A,0x36,0xE3,        //4
    0x00,0x20,0xC4,0x9C,        //5
    0x00,0x27,0x52,0x54,        //6
    0x00,0x2D,0xE0,0x0D,        //7
    0x00,0x34,0x6D,0xC6,        //8
    0x00,0x3A,0xFB,0x7F         //9
    };
uchar code DDS_word_100Hz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x00,0x00,0xA7,0xC6,        //1
    0x00,0x01,0x4F,0x8B,        //2
    0x00,0x01,0xF7,0x51,        //3
    0x00,0x02,0x9F,0x17,        //4
    0x00,0x03,0x46,0xDC,        //5
    0x00,0x03,0xEE,0xA2,        //6
    0x00,0x04,0x96,0x68,        //7
    0x00,0x05,0x3E,0x2D,        //8
    0x00,0x05,0xE5,0xF3         //9
    };
uchar  code DDS_word_10Hz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x00,0x00,0x10,0xC7,        //1
    0x00,0x00,0x21,0x8E,        //2
    0x00,0x00,0x32,0x55,        //3
    0x00,0x00,0x43,0x1C,        //4
    0x00,0x00,0x53,0xE3,        //5
    0x00,0x00,0x64,0xAA,        //6
    0x00,0x00,0x75,0x71,        //7
    0x00,0x00,0x86,0x38,        //8
    0x00,0x00,0x97,0x00         //9
    };
uchar  code DDS_word_1Hz[10][4]={
    0x00,0x00,0x00,0x00,        //0
    0x00,0x00,0x01,0xAD,        //1
    0x00,0x00,0x03,0x5B,        //2
    0x00,0x00,0x05,0x08,        //3
    0x00,0x00,0x06,0xB6,        //4
    0x00,0x00,0x08,0x63,        //5
    0x00,0x00,0x0A,0x11,        //6
    0x00,0x00,0x0B,0xBE,        //7
    0x00,0x00,0x0D,0x6C,        //8
    0x00,0x00,0x0F,0x19         //9
    };



void delay(uchar ms)        //延时子程序,单位:ms
 
{
    uchar i;
    while(ms--)
    {
        for(i=0; i<250; i++)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
    }
}
 
BOOL lcd_bz()  // 测试LCD忙碌状态
 
{               
    uchar result;
    uchar k;
    rs = 0;
    rw = 1;
    ep = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();    
    k=P2;
    ep = 0;
    result = k & 0x80;  
    if(result!=0)
        return 1;
    else
        return 0;
}
 

lcd_wcmd(uchar cmd)  // 写入指令数据到LCD
 
{                   		
    while(lcd_bz());
    rs = 0;
    rw = 0;
    ep = 0;
    _nop_();
    _nop_();
    P2 = cmd;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ep = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ep = 0;
}
 

lcd_pos(uchar pos)
{                       //设定显示位置
    lcd_wcmd(pos | 0x80);
}

lcd_wdat(uchar dat) //写入字符显示数据到LCD
 
{               
while(lcd_bz());
    rs = 1;
    rw = 0;
    ep = 0;
    P2 = dat;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ep = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ep = 0;
}
 
void lcd_init(void)   //LCD初始化设定
{
    lcd_wcmd(0x38);     //设置显示模式:4位总线,双行显示
    delay(1);
    lcd_wcmd(0x0f);     //开光标以及光标设置
    delay(1);
    lcd_wcmd(0x06);     //设置光标右移,已显示文字不动
    delay(1);
    lcd_wcmd(0x01);     //清除LCD的显示内容
    delay(1);
}

void keyscan(void)
 
{
    uchar t1;
    uchar t2;       //列扫描值
    P0  = 0xff;
    t1  = P0;
    if(t1!=0xff)
    {
        delay(40);  //延时ms,去抖动
        t2  = P0;
        if(t2==t1)
        {
            KbHit = 1;
            Key = P0;   //取得键值
        }
        else
            Key = 0x00;
    }
}

void key_pro(void)      // 键盘处理子函数
{                       //调用键盘扫描函数,返回的键值送变量key
    switch(Key)         //把从P0口读入的键特征码转化为键值
     
   {
    case 0x7e:ucKey='0';key_value=0;break;
    case 0xbe:ucKey='4';key_value=4;break;
    case 0xde:ucKey='8';key_value=8;break;
    case 0xee:ucKey='c';break;
    case 0x7d:ucKey='1';key_value=1;break;
    case 0xbd:ucKey='5';key_value=5;break;
    case 0xdd:ucKey='9';key_value=9;break;
    case 0xed:ucKey='d';break;
    case 0x7b:ucKey='2';key_value=2;break;
    case 0xbb:ucKey='6';key_value=6;break;
    case 0xdb:ucKey='a';break;
    case 0xeb:ucKey='e';break;  
    case 0x77:ucKey='3';key_value=3;break;  
    case 0xb7:ucKey='7';key_value=7;break;
    case 0xd7:ucKey='b';break;
    case 0xe7:ucKey='f';break; 
    default:  ucKey='z';
    } 

    KbHit=0;    
}

void disp_sig(uchar num)
{
  //  lcd_pos(pos);
	lcd_wdat(num);
}

void   Display(uchar x,uchar y,char *p)      //显示字符串,x为列,y为行显示

{
    lcd_wcmd(0x80+(y-1)*0x40+x-1);       //发送字符串开始显示地址
    while(*p)   
    {
        lcd_wdat(*p);
        p++;
    }
}



void  load_DDS(uchar freq[])
{  
    uchar key[7]={0,0,0,0,0,0,0};
	int i;
	uint temp1,temp2;
    uchar 	DDS_W0,DDS_W1,DDS_W2,DDS_W3;
 	for(i=0;i<7;i++)
	   { 
	   key[i]=freq[i];
	   }
	
	 temp1=DDS_word_1Hz[key[6]][3]+DDS_word_10Hz[key[5]][3]+DDS_word_100Hz[key[4]][3]+DDS_word_1KHz[key[3]][3]+DDS_word_10KHz[key[2]][3]+DDS_word_100KHz[key[1]][3]+DDS_word_1MHz[key[0]][3];
	    DDS_W3=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
	 
	 temp1=DDS_word_1Hz[key[6]][2]+DDS_word_10Hz[key[5]][2]+DDS_word_100Hz[key[4]][2]+DDS_word_1KHz[key[3]][2]+DDS_word_10KHz[key[2]][2]+DDS_word_100KHz[key[1]][2]+DDS_word_1MHz[key[0]][2]+temp2;
		DDS_W2=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
	
	 temp1=DDS_word_1Hz[key[6]][1]+DDS_word_10Hz[key[5]][1]+DDS_word_100Hz[key[4]][1]+DDS_word_1KHz[key[3]][1]+DDS_word_10KHz[key[2]][1]+DDS_word_100KHz[key[1]][1]+DDS_word_1MHz[key[0]][1]+temp2;
	    DDS_W1=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
	 
	 temp1=DDS_word_1Hz[key[6]][0]+DDS_word_10Hz[key[5]][0]+DDS_word_100Hz[key[4]][0]+DDS_word_1KHz[key[3]][0]+DDS_word_10KHz[key[2]][0]+DDS_word_100KHz[key[1]][0]+DDS_word_1MHz[key[0]][0]+temp2;
	    DDS_W0=(uchar)(temp1);
	  
	  
  DDS_date=0x00;	
  W_CLK = 0;
  W_CLK = 1;
  
  DDS_date=DDS_W0;
  W_CLK=0;
  W_CLK=1;
  
  DDS_date=DDS_W1;
  W_CLK=0;
  W_CLK=1;
  
  DDS_date=DDS_W2;
  W_CLK=0;
  W_CLK=1;
  
  DDS_date=DDS_W3;
  W_CLK=0;
  W_CLK=1;

 
  FQ_UD=0;
  FQ_UD=1;

}
/*uchar value(uchar ucKey)
   { static int i=0;
     freq0[i]=ucKey;
	 i++;
	 lcd_wdat(ucKey);
	 return; 
	 
  }	 */

void main()     //主函数
{
    uchar i=6,j=0,k=6;
	uchar freq[7]={0,0,0,0,0,0,0}; //控制DDS的频率
//	uchar freq_display[7];	//存放显示对应的输入频率
	
	lcd_init();
    Display(4,1,"WELCOME DDS");
	delay(10000);
	delay(10000);
	delay(10000);
	delay(10000);
    delay(10000);

    Display(4,1,"            ");
  
  
  lcd_pos(0x04);
    Display(1,1,"SET:");
	while(1)
    {
		keyscan();
		if(KbHit!=0)
        {	key_pro();
			if(ucKey=='c')	  //c代表清除一个数字
			{	for(j=6;j>=k;j--)	 //该程序实现数组右伊
				freq[j]=freq[j-1];	  
				lcd_wcmd(0x04);     //光标左移一位,已显示文字不动
    			delay(1);
				lcd_wdat(0x20);       //清除当前最后一个字符
				i++;

			}  
			else if(ucKey=='f')	  //f代表确认频率输入
				{	i=6;		  //为下次重新输入做准备
					load_DDS(freq);//把输入的频率值给DDS
				}
			else                //该分支实现输入 
				{//	for( ;i>=0;i--)
					{	for(j=i;j<6;j++)  //该循环实现数组左移
						freq[j]=freq[j+1];
					}
				
					freq[j]=key_value;
//					freq_display[i]=ucKey;
            		lcd_wcmd(0x06);     //光标右移一位,已显示文字不动
					lcd_wdat(ucKey);
					i--;
					k=i;
				}

         }         
    }	
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -