📄 main.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 + -