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

📄 9850 step+wave+ask+psk ok.c

📁 此为AD9850的驱动程序,经过实验,发现可行
💻 C
字号:
//*********************************************************
//File Name  :AD9850.c
//Author     :GHL
//Date       :2007/8/16
//Desciption :AD9850的控制字串行加载程序
//            加入键盘实现步进
//            方波序列10kpbs
//            加入ASK   
//            加入液晶显示方波序列的输出  
//            加入键盘选择ASK,PSK    
//*********************************************************

#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char 
#define uint  unsigned int 
#define key_bus P1
#define lcd_bus P2

//与9850有关的定义
sbit sclk=P0^0;   //W_CLK
sbit load=P0^1;   //FQUD
sbit sdata=P0^2;  //DATA
   
sbit sqwave=P3^0;   //输出方波

//与1602有关的定义
sbit rs=P0^5;         
sbit rw=P0^6;
sbit e=P0^7;
sbit busy=lcd_bus^7;

uchar aorp=0;

unsigned char code key_decode[]={'*',0,'#','D',7,8,9,'C',4,5,6,'B',1,2,3,'A'};

unsigned char code wave1[]={0,0,1,0,0,0,1,1,0,1,1,1,0,0,0,1};

uchar code str1[]="START F:1000HZ STEP 100HZ";
uchar code str2[]="ASK MODULE:";
uchar code str3[]="PSK MODULE:";

unsigned char m=0;
uchar k;

/*************************延时子程序********************************/

delay(uchar d)
{
        while(--d);
}



/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
        uchar bflag;     
        rs=0;
        rw=1;
        _nop_();
        e=1;
        _nop_();
        lcd_bus=0xff;
        bflag=lcd_bus;
        e=0;
        return(bit)(bflag&0x80);
}




void lcd_wrcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_bus=cmd;
        rs=0;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0; 
}




/************向液晶片写数据***************/

void lcd_wrdata( uchar lcddata)
{

        while(lcd_busy());
        lcd_bus=lcddata;
        rs=1;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0;
}

/*************************液晶初始化程序********************************/
void lcd_ini(void)
{

        lcd_wrcmd(0x38);
        delay(100);
        lcd_wrcmd(0x0f);
        delay(100);
        lcd_wrcmd(0x06);
        delay(100);
        lcd_wrcmd(0x01);
        delay(100);
}

//////////////////////////////////////////////
//
//    生成汉字子模函数
//    当lcd_wrdata(0);显示第一个汉字
//    当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
/*lcd_h()
{
    uchar i;
    lcd_wrcmd(0x40);
    for(i=0;i<24;i++) lcd_wrdata(hanzi[i]);
}


/*************************AD9850产生相位为0正弦波********************************/
AD9850_0(float freq)         
{
   float fw;
    uchar i,j,temp;
    uchar d[5];
   fw=freq*34.359738368;

   d[4]=0;
   d[0]=(unsigned long)fw;
   d[1]=(unsigned long)fw>>8;
   d[2]=(unsigned long)fw>>16;
   d[3]=(unsigned long)fw>>24;
  
   
    load=0; 
    sclk=0; 
    sclk=1;
    sclk=0;
    load=1;
    load=0;
    
    for(i=0;i<5;i++)
    {
        temp=d[i];
        for(j=0;j<8;j++)
        {
            sclk=0;
            if(temp&1) sdata=1;
            else sdata=0;
            sclk=1;
            temp=temp>>1;
         }
      }
      load=1;
      load=0;

}

/*************************AD9850产生相位为180正弦波********************************/
AD9850_180(float freq)         
{
   float fw;
    uchar i,j,temp;
    uchar d[5];

   fw=freq*34.359738368;

   d[4]=0X80;
   d[0]=(unsigned long)fw;
   d[1]=(unsigned long)fw>>8;
   d[2]=(unsigned long)fw>>16;
   d[3]=(unsigned long)fw>>24;
  
   
    load=0; 
    sclk=0; 
    sclk=1;
    sclk=0;
    load=1;
    load=0;
    
    for(i=0;i<5;i++)
    {
        temp=d[i];
        for(j=0;j<8;j++)
        {
            sclk=0;
            if(temp&1) sdata=1;
            else sdata=0;
            sclk=1;
            temp=temp>>1;
         }
      }
      load=1;
      load=0;

}



/************矩阵键盘读键程序*******************/

unsigned char keytest()
{
    unsigned char keycode=0xff,temp,i;
    key_bus=0x0f;
    temp=key_bus&0x0f; 
    if(temp!=0x0f)              //有键按下
    {
        key_bus=0x7f;
        for(i=0;i<4;i++)
        {
            temp=key_bus&0x0f;
            if(temp==0x07)   //输出端口示数
            {    
                keycode=i*4;
                break;
            }
            else if(temp==0x0b)
            {
                keycode=i*4+1;
                break;                                                            
            }
            else if(temp==0x0d)
            {
                keycode=i*4+2;
                break;
            }
            else if(temp==0x0e)
            {
                keycode=i*4+3;
                break;
            }
            key_bus=(key_bus>>1)|0x80;
        }

         while((key_bus&0x0f)!=0x0f)   //等待释放
         {
             key_bus=0x0f; 
         }                                           
        
     }
     return keycode;
}

/*********定时器初始化程序******/
void Init_Timer ()
{
     TMOD=0x01;
     EA=1;
     ET0=1;
     TH0=~(100/256);
     TL0=~(100%256);
     TR0=0;

/************T0中断服务程序*****************/
void timer0 (void)  interrupt 1 using 1
{  
     uchar flag;
     //EA=0;
     TH0=~(100/256);
     TL0=~(100%256);

     flag=wave1[k];

    // sqwave=wave1[k];
     k=(k+1)%15; 
     
     if(aorp==0)
     {
        if(flag==1)
           {
             AD9850_0(100000);            
           }
         else if(flag==0)
           { 
             AD9850_0(0);              
           }
     }
     else if(aorp==1)
     {
         if(flag==1)
          {
            AD9850_0(100000);            
          }
        else if(flag==0)
          {
             AD9850_180(100000);              
          }
     }
     //EA=1;
 }


main()
{
    long freq=1000;
    unsigned char keycode;
    uchar *p,count,lcd[15];
    uchar i;

    lcd_ini();
    Init_Timer();
    while(1)
    {
      keycode=keytest();

        if(keycode==0xff)
        {
          delay(10000);
          continue;
        }

      if(key_decode[keycode]==1)
        {
            TR0=0;
             AD9850_180(1000);
             lcd_wrcmd(0x01);
            delay(100);
              lcd_wrcmd(0x80);
           for(i=0;i<15;i++) 
           {
               
              lcd_wrdata(str1[i]);
           }
           lcd_wrcmd(0xc0);
           for(i=15;i<25;i++) lcd_wrdata(str1[i]);



        }
              
                   
              
       else if(key_decode[keycode]==2)
                	   { 
                          TR0=0; 
                          freq=freq+100;
                           AD9850_0(freq);
                		
           
                	   }
       else if(key_decode[keycode]==3)
                	  { 
                         TR0=0;
                         freq=freq-100;
        
                         AD9850_0(freq);
    
                	  }
        	  
         
 
       else if(key_decode[keycode]==4)    //按4键选择ASK调制功能
         {    
              TR0=0;
              aorp=0;
              m=0;
              lcd_wrcmd(0x01);
            delay(100);
              lcd_wrcmd(0x80); 
              for(i=0;i<11;i++) 
                 {
                    
                    lcd_wrdata(str2[i]);
                  }
            
               while(m<15)
        		{
                     if(wave1[m]==1)lcd[m]='1';     //在液晶上显示方波序列
                     else if(wave1[m]==0)lcd[m]='0';
                	 m++;
        		}

                p=lcd;             
                lcd_wrcmd(0xc0);     //从第2行第0个位置开始写
                for(count=0;count<15;count++)
        			{
                         lcd_wrdata(*p++);
                          delay(100);
            		}
                    TR0=1;  

         }

         else if(key_decode[keycode]==5)    //按5键选择PSK调制功能
             {    
                 TR0=0;
                 aorp=1;
            	 m=0;
                 lcd_wrcmd(0x01);
                 delay(100);
                 lcd_wrcmd(0x80); 
                 for(i=0;i<11;i++) 
                 	{
                    	
                        lcd_wrdata(str3[i]);
                    }
            
                  while(m<15)
            		{
                        if(wave1[m]==1)lcd[m]='1';
                         else if(wave1[m]==0)lcd[m]='0';
                		 m++;
        			}

                p=lcd;             
                lcd_wrcmd(0xc0);
                for(count=0;count<15;count++)
        			{
                         lcd_wrdata(*p++);
                          delay(100);
            		}
              
                TR0=1;//Init_Timer();
             } 
       }
}
   
        


⌨️ 快捷键说明

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