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

📄 main.c

📁 基于mx589ACPEGMSK调制解调代码
💻 C
字号:
#include<reg51.h>
#include<stdio.h>

#define PLLacq  P2_1
//#define TxData  P2_2
#define RxDCacq P2_4
#define RxData  P2_5
#define RXCLK   P3_3 
//#define TXCLK   P3_2 


#define LOAD  P1_1
#define load  P1_2
#define ControlDataInput  P1_0


sbit    P2_1=P2^1;
sbit    P2_3=P2^3;
sbit    P2_4=P2^4;
sbit    P2_5=P2^5;
sbit    P3_3=P3^3;


//set FX019


sbit   P1_0=P1^0;
sbit   P1_1=P1^1;
sbit   P1_2=P1^2;



#define PREAMBLE_LENGTH	 0x02	 // Number of bytes of preamble to send
#define SYNSEQUENCE_LENGTH 0x02  //Number of bytes of synsequence to receive

#define TX_BUFFER_SIZE	0x0A		// Size (in bytes) of transmit buffer
#define RX_BUFFER_SIZE	0X0A		// Size (in bytes) of receive ring-buffer

#define PREAMBLE_BYTE	0xCC




void  Init_SerialPortandExternInterrupt(void);
void  Send_Char_Com(unsigned char);  
void  Send_String_Com(unsigned char *,unsigned int );
void  Delay_uS(unsigned long );

enum StateType {Idle_STATE,SYNJudge_STATE,DataTransmission_STATE};


volatile enum StateType State;

unsigned char Preamble[PREAMBLE_LENGTH]={PREAMBLE_BYTE,PREAMBLE_BYTE};
unsigned char Synsequence[SYNSEQUENCE_LENGTH];
unsigned char TXBuffer[TX_BUFFER_SIZE];
unsigned char RXBuffer[RX_BUFFER_SIZE];

unsigned char TxFlag,RxFlag,SerialSendFlag,SerialReadFlag;
unsigned char ShiftREG;
unsigned char TxByteCounter,RxByteCounter;
unsigned char TxBitCounter,RxBitCounter;
unsigned char TMP;



void main()
{
	P2_5=1;
	LOAD=0;
	load=1;
	//RxDCacq=0;
	//PLLacq=0;
	RxDCacq=1;
	PLLacq=1;
	SBUF=0;
	//TMP=0xA9;
	
	

	State=SYNJudge_STATE;
	//State=Idle_STATE;   
	Init_SerialPortandExternInterrupt();

		while(1);
	{
	}
}

void  ReceiveClk_INT(void) interrupt 2 using 1//using INT1 for receiving clock interrupt
{
	switch(State)
	{
/*		case Idle_STATE:

			if(TMP&0x80)
				ControlDataInput=1;
			else
				ControlDataInput=0;
			TMP<<=1;
			TxBitCounter++;
			if(TxBitCounter==8)
			{
				//TxBitCounter=0;
				LOAD=1;
				load=0;
				State=SYNJudge_STATE;	
			}


*/
	
		case SYNJudge_STATE:

			ShiftREG<<=1;
			if(!RxData)		
				ShiftREG=ShiftREG|0x01;
			else			
				ShiftREG=ShiftREG&0xFE;
			//if(!RxData)		
			//	ShiftREG=ShiftREG&0xFE;
			//else			
			//	ShiftREG=ShiftREG|0x01;		
			
			RxBitCounter++;
				
			if(RxBitCounter==8)
			{
				switch(RxByteCounter)
				{
					case 0:
						if(ShiftREG!=PREAMBLE_BYTE)
						{
							RxBitCounter=7;
						}
						else
						{
							Synsequence[RxByteCounter++]=ShiftREG;
							RxBitCounter=0;
							ShiftREG=0;
						}
						break;
							
					case 1:
						if(ShiftREG!=PREAMBLE_BYTE)
						{
							RxByteCounter=0;
						}
						else
						{
							//State=DataTransmission_STATE;
							Synsequence[RxByteCounter++]=ShiftREG;
							RxByteCounter=0;
							RxBitCounter=0;
							ShiftREG=0;
							//RxDCacq=0;
						    PLLacq=0;
							State=DataTransmission_STATE;
						}
						break;
						
					default:
						break;
				}		
			}
			break;

		case DataTransmission_STATE:
			
			
			if(RxByteCounter<RX_BUFFER_SIZE)
			{
				ShiftREG<<=1;
				
				if(!RxData)
        			ShiftREG=ShiftREG|0x01;
				else
					ShiftREG=ShiftREG&0xFE;
				//if(RxData)		
				//	ShiftREG=ShiftREG&0xFE;
				//else			
				//	ShiftREG=ShiftREG|0x01;	

				RxBitCounter++;
				if(RxBitCounter==8)
				{
					RxBitCounter=0;
					RXBuffer[RxByteCounter++]=ShiftREG;
				}
			}
			if(RxByteCounter==RX_BUFFER_SIZE)
			{
				RxByteCounter=0;
				State=SYNJudge_STATE;
				Send_String_Com(RXBuffer,RX_BUFFER_SIZE);
				PLLacq=1;
				//RxDCacq=1;
			}
			break;	
		
		default:
			break;
		}
}


/*void SerialSend_INT(void) interrupt 4 using 3
{
	if(TI)
	{
		if(SerialSendFlag)
		{
			SerialSendFlag=0;
			//ACC=ShiftREG;
			//SBUF=ACC;
		}
	TI=0;
	}
}
*/
/*void Receive_INT(void) interrupt 4 using 3
{
	unsigned char n;
	RI=0;
	TXBuffer[n++]=SBUF;
		
	if(n==TX_BUFFER_SIZE)
	{
		SerialSendFlag=1;
		n = 0;
	}
}
*/

void  Init_SerialPortandExternInterrupt(void)
{
	//initial serial port
	IP    = 0x01;   //    INT1'S priority is highest
	SCON  = 0x50;   // MODE 1
	PCON  = 0x00;
	TMOD  = 0x20;   //  T1 time mode 2
	TH1   = 0xFD;   //baud:9600 b/s
	TL1   = 0xFD;
	ES=1;    //     allow is serial port interrupt 
	EA=1;     //   start interrupt
	TR1=1;    //   start t1 time

	//initial extern interrupt
	EX1=1;    //allow INT1
	EX0=1;    //allow INT0
	IT0=1;    // downedge trigger
	IT1=1;    // downedge trigger
}

//向串口发送一个字符 
void  Send_Char_Com(unsigned char ch) 
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

void Send_String_Com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do 
    {
        Send_Char_Com(*(str + k));
        k++;
    } while(k < RX_BUFFER_SIZE);
}

void Delay_uS(unsigned long nValue)//豪秒为单位,11.0592MHz为主时钟
{
    while(--nValue); 
	return;
}


⌨️ 快捷键说明

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