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

📄 t1main.c.txt

📁 基于FPGA 的直接数字频率合成信号发生器(DDS)设计
💻 TXT
字号:
#include "AT51S_89C52.h"
#include "hd7279.h"
#include "DisplayControl.h"
#include "SPICommunication.h"
extern void KeilWordToBcd(unsigned char idata *pWord,unsigned char idata *pBcd);
extern void KeilLongToBcd(unsigned char idata *pLong,unsigned char idata *pBcd);

//Dog Line is for reset Watchdog chip.
sbit	DogLine = P1^7;
// define fsselct,psel0,psel1
sbit fselect = P3^6;
sbit PSEL0 = P2^3;
sbit PSEL1 = P2^4;

//-------------------------Use for keyboard and display----------------------------------------
unsigned char idata KeyCode;
bit       KeyMark;
bit       PSKKey=0;
bit       ASKKey=0;
bit 	  PSKFreflags=0;
bit 	  ASKFreflags=0;
unsigned long int fre;
unsigned char KeyTimer;
unsigned char idata BcdBuf[7];


unsigned char idata DisStatus;
//Macro Define for DisStatus


#define Working_DS  		0
#define SetupFrequency		1
#define PSKFrequency		2
#define ASKFrequency		3
#define DisStatusNUMs       4

//Macro Define for KeyCode
#define Status_KEYCODE  7
#define Shiftleft_KEYCODE  21
#define Shiftright_KEYCODE  14
#define Up_KEYCODE      28
#define Down_KEYCODE    35
#define Yes_KEYCODE    56
#define PSK_KEYCODE    42
#define ASK_KEYCODE    49

//-----------------------useful for Frequency --------------------------------
unsigned long frequency_AD9835;
unsigned char shiftBit; //0~7
unsigned char idata frequencyBCDCode[8];

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void ExInt0Rsp(void) interrupt 0 using 0 //INTO
{     
	EX0 = 0;           
}

void Timer0IntRsp(void) interrupt 1   using 1//T0
{   
//	ET0 = 0;
	if ((PSKFreflags==1))
		PSEL1 = ! PSEL1;
	else if((ASKFreflags==1))
		fselect = ! fselect;
}

void ExInt1Rsp(void) interrupt 2   using 2  
{   
    KeyMark = 1;
    EX1 = 0;
}
void Timer1IntRsp(void)  interrupt 3   using 2 
{
    TR1 = 0;
	TH1 = 0xDF;
	TL1 = 0x73;
	TR1 = 1;

	if( KeyTimer<100 )
	  KeyTimer++;
}
void SerialPortIntRsp(void) interrupt 4   using 2
{
	ES=0;
}
void Timer2IntRsp(void) interrupt 5   using 2
{
	ET2 = 0;
}


void updateFrequency(void)
{
	unsigned char i;
	unsigned long temFrequ = 0;
	for( i=0; i<8; i++ ){
		temFrequ = temFrequ*10 + frequencyBCDCode[i];
	}
	frequency_AD9835 = temFrequ;
	DisStatus = Working_DS;

	if( frequency_AD9835 >= 10000000 )
	 	frequency_AD9835 = 10000000;
	if( frequency_AD9835<= 100)
	 	frequency_AD9835 = 100;

	testAD9875(frequency_AD9835);
}
//喂狗函数
void FeedDog(void)
{
	DogLine=0;
	_nop_();
	_nop_();
	DogLine=1;
}
//Status键处理函数
void StatusKeyProc(void)
{
    DisStatus++;
    if( DisStatus>=DisStatusNUMs )
		DisStatus = 0;
	if( DisStatus==SetupFrequency )
	{      fre=frequency_AD9835;
	  	KeilLongToBcd((unsigned char *)&frequency_AD9835, &(BcdBuf[0]));
		frequencyBCDCode[0] = BcdBuf[1]>>4;
		frequencyBCDCode[1] = BcdBuf[1]&0x0f;
		frequencyBCDCode[2] = BcdBuf[2]>>4;
		frequencyBCDCode[3] = BcdBuf[2]&0x0f;
		frequencyBCDCode[4] = BcdBuf[3]>>4;
		frequencyBCDCode[5] = BcdBuf[3]&0x0f;
		frequencyBCDCode[6] = BcdBuf[4]>>4;
		frequencyBCDCode[7] = BcdBuf[4]&0x0f;
		shiftBit = 0;
	}
       
	if(DisStatus==PSKFrequency)
	{ PSKKey=1;
	testAD9875(100000);
   	TR0 = 1;
    ET0 = 1;
	PSKFreflags=1;
	ASKFreflags=0;
     }
	else if(DisStatus==ASKFrequency)
	{ //PSKKey=1;
	testAD9875(100000);
   	TR0 = 1;
    ET0 = 1;
	PSKFreflags=0;
	ASKFreflags=1;
     }
	else
	{   testAD9875(fre);   
		fselect = 0;
		PSEL0 = 0;
		PSEL1 = 0;
		PSKFreflags=0;
		ASKFreflags=0;
		ET0=0;
		TR0=0;
              
	 }
		
	 
         
   /* if(DisStatus==ASKFrequency)
	{;}*/
}


	   
//---------------------------------------------
//Shift键处理函数
void ShiftKeyleftProc(void)
{
	switch(DisStatus){
		case Working_DS:
			break;
		case SetupFrequency:
			shiftBit++;
			if( shiftBit >5 )
				shiftBit = 0;
			break;
		case PSKFrequency:
 	        break;
		case ASKFrequency:
 	        break;
		default:
			break;
	}
}
//----------------------------------------
void ShiftKeyrightProc(void)
{
	switch(DisStatus){
		case Working_DS:
			break;
		case SetupFrequency:
			
			if( shiftBit >0 )
			   shiftBit--;
			else
			   shiftBit = 5;
			  
			break;
		case PSKFrequency:
 	        break;
		case ASKFrequency:
 	        break;
		default:
			break;
	}
}
//----------------------------------------
void UpKeyProc(void)
{
	switch(DisStatus){
		case Working_DS:
		 	frequency_AD9835 += 100;
			if( frequency_AD9835 >= 10000000 )
			 	frequency_AD9835 = 10000000;
			testAD9875(frequency_AD9835);
			break;
		case SetupFrequency:
			frequencyBCDCode[shiftBit]++;
			if( frequencyBCDCode[shiftBit]>9 )
				frequencyBCDCode[shiftBit]=0;
			break;
		case PSKFrequency:
 	        break;
		case ASKFrequency:
 	        break;
		default:
			break;
	}
}  

//-----------------------------------------------
void DownKeyProc(void)
{
	switch(DisStatus){
		case Working_DS:
		 	if( frequency_AD9835 <= 1000 )
				frequency_AD9835 = 1000;
			else
			 	frequency_AD9835 -= 100;
			testAD9875(frequency_AD9835);
			break;
		case SetupFrequency:
			if( frequencyBCDCode[shiftBit]>0 )
				frequencyBCDCode[shiftBit]--;
			else
			frequencyBCDCode[shiftBit]=9;
		
			break;
	    case PSKFrequency:
 	        break;
		case ASKFrequency:
 	        break;
		default:
			break;
	}
}

//-------------------------------------------------------------------------------------
//Yes键处理函数
void YesKeyProc(void)
{
	switch(DisStatus){
		case Working_DS:
			break;
		case SetupFrequency:
			updateFrequency();
			break;
		case PSKFrequency:
		    
 	        break;
		case ASKFrequency:
 	        break;
		default:
			break;
	}
}      


// process psk wave



 //--------------------------------------------


//--------------按键处理函数------------------
void KeyProc(void)
{
     switch(KeyCode)
     {
         case Status_KEYCODE:
              StatusKeyProc();
              break;
         case Shiftleft_KEYCODE:
              ShiftKeyleftProc();
              break;
		 case Shiftright_KEYCODE:
              ShiftKeyrightProc();
              break;
         case Up_KEYCODE: 
              UpKeyProc();
              break; 
         case Down_KEYCODE:
              DownKeyProc();
              break;
         case Yes_KEYCODE:
              YesKeyProc();
              break;
    
         default:
              break;  
     }
}

//-------------------------------------------------------------------------------------------

//start:0~7,
//end:0~7, and start<=end
void ZeroProcess(unsigned char start, unsigned char end)
{
    unsigned char i;
	for( i=start;i<=end;i++ ){
	  if( ReturnLedBufData(i)==0 )
	    SetupHideBit(i, 1);
	  else
	    break;
	}
}

void LongTypeVarToDisBuf(unsigned long *pLong)
{
  	KeilLongToBcd((unsigned char *)pLong, &(BcdBuf[0]));
    //unsigned char SetupDisBuffer(unsigned char DisBit, unsigned char Dp, unsigned char Data, unsigned char transMode);
	//注意:long型值的最高位在BcdBuf[0]中,由于只有8为数码管,故没有显示.
	SetupDisBuffer(0, 0, BcdBuf[1]>>4, 0);
	SetupDisBuffer(1, 0, BcdBuf[1]&0x0f, 0);
	SetupDisBuffer(2, 0, BcdBuf[2]>>4, 0);
	SetupDisBuffer(3, 0, BcdBuf[2]&0x0f, 0);
	SetupDisBuffer(4, 0, BcdBuf[3]>>4, 0);
	SetupDisBuffer(5, 0, BcdBuf[3]&0x0f, 0);
	SetupDisBuffer(6, 0, BcdBuf[4]>>4, 0);
	SetupDisBuffer(7, 0, BcdBuf[4]&0x0f, 0);
}

//----------------------------------------
void UpdateDisplay(void)
{
    unsigned char i;
	GoOutAllLED();	
	SetupHideBit(0xFF, 0);
	SetupFlashBit(0xFF, 0);

	switch(DisStatus){
		case Working_DS:
			LongTypeVarToDisBuf(&frequency_AD9835);
			ZeroProcess(0, 6);
			break;
		case SetupFrequency:
			for( i=0; i<6; i++ ){
				SetupDisBuffer(i, 0, frequencyBCDCode[i], 0);
				SetupFlashBit(shiftBit, 1);
			}
			for( i=6; i<8; i++ ){
				SetupDisBuffer(i, 0, frequencyBCDCode[i], 0);
			
			}
			break;
		case PSKFrequency:
				SetupDisBuffer( 0, 0, 0x0E, 0);
				SetupDisBuffer( 1, 0, 5, 0);
 	         break;
		case ASKFrequency:
				SetupDisBuffer( 0, 0, 0x0A, 1);
				SetupDisBuffer( 1, 0, 5, 0);
 	         break;
		default:
			 break;
	      }
  		Display();
}
//-------------------------------------------------------------------------------------  					
//系统初始化函
void Sys_Init(void)
{   int i;
    EA=0;
    IE=0x00;                   /* inhibit all interrupt */
    IP=0x00;                   /* ;		    */
    TCON=0x00;
    SCON=0x00;
   
    TMOD = 0x12;//Timer 1 is used for TIME
                //Mode  1 (16bit),C/T=0(TIME),Gate=0
    TCON = 0x00;
    TH1 = 0xf8;
    TL1 = 0x30;
    TR1 = 0;
    ET1 = 1;
//  timer0 100us
    TH0 = 56;
    TL0 = 56;
    TR0 = 0;
    ET0 = 0;	
    //Initial显示和按键初始化
    //KeyTimer = 200;
    KeyCode = 0xF0;
    KeyMark = 0;
    DisStatus = Working_DS;

    //外中断0:int0
    IT1=0;//Pulse
    EX1=1;

    InitialDisplayControl();
    for( i=0;i<1000;i++ ){
       FeedDog();
    }

    Display();
    TR1=1;
    EA = 1;

	frequency_AD9835 = 1000000;
}
void KeyScan(void){
	if(KeyMark){
	  KeyCode = Read7279KeyCode();
	  KeyProc();
	  KeyTimer = 0;
	  KeyMark = 0;
	}
    if( KeyTimer>=60 ){
	  EX1 = 1;
	}
}

void main(void)
{
	fselect = 0;
	PSEL0 = 0;
	PSEL1 = 0;
	Sys_Init();
	testAD9875(frequency_AD9835);

    while( 1 )
    { 
      FeedDog();
      KeyScan();
	
      UpdateDisplay();
    }
}

⌨️ 快捷键说明

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