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

📄 main.c

📁 NRF2401 PIC16源码
💻 C
字号:
#include <pic.h>

#define PowerUp 	RB5
#define ChipCS  	RB0
#define ChipCE  	RB4
#define ChipDR2 	RB3
#define ChipClk2   	RB2
#define ChipDout2	RB1
#define ChipDR1		RC2
#define ClkIn		RC3
#define DataIn  	RC4
#define EnableReceiver() {PowerUp=1;ChipCE=1;ChipCS=0;}
#define nRF2401_ON()    {PowerUp=1;ChipCE=0;ChipCS=0;}
#define FromHead	0xAA
#define SendData	0x51
#define FromEnd		0x0D
#define MAXRXBUF	20
#define TRUE		1
#define FALSE		0
unsigned char DataLength; //数据长度
unsigned char RecBuff[MAXRXBUF]; //接受 buff
unsigned char TxBuff[MAXRXBUF]; //发送buff
unsigned char RevNum;
unsigned char TxNum;
unsigned char TXData[14];
bank1 unsigned char CardID[10];
bank1 unsigned char RFNum;
bank1 unsigned char InitData[15];

bit RxingFlag;
bit f_rx_evt;//串口接收数据结束标志

void Delay10US(void)
{
	unsigned char d=30;
	do{
		NOP(); 
	}while(--d);
}
void Delay100US(unsigned char num)
{
	unsigned int d=280;
	do{
		while(--d) NOP();  //延时1MS程序
		CLRWDT();
	}while(--num);
}
/*
	异步串口初始划。
异步	波特率:1、BRGH=0 SPBRG=fosc/(64*波特率)-1
		   		2、BRGH=1 SPBRG=fosc/(16*波特率)-1
*/
void UARTInit(void)
{
	TXSTA=0x04;	   	//异步高速传输,8位发送、发送器禁止
	RCSTA=0x80;	   	//串行口工作使能、接收8位数据、
	SPBRG=5;		//11m
	TRISC6=1;		//
	TRISC7=1;       //RC6 RC7 设为输入
	TXEN=1; 		//使能发送
	CREN=1; 		//允许接受
	RCIE=1; 		//使能接收中断
	TXIE=0; 		//禁止发送中断
	PEIE=1;
	GIE=1;
}
//UART中断
//数据结构:Head+SENDDATA+长度+数据(n)+CheckSum+End	
void interrupt UartINT(void)
{
	unsigned char temp;

	if(RCIF==1){ //接收中断
		temp=RCREG;
		if(!RxingFlag)
		{
			if(temp==FromHead)
			{
				RevNum=0;
				RxingFlag=TRUE;
			}
		}
		else 
		{
			if((temp==FromEnd)&&(RecBuff[1]==RevNum-3))
			{
				RxingFlag=FALSE;
				f_rx_evt=TRUE;
			}
			else
			{
				RecBuff[RevNum++]=temp;
				if((RevNum>MAXRXBUF)||(RevNum>RecBuff[1]+3))
				{
					RxingFlag=FALSE;
					RevNum=0;
				}
			}	
		}
	}
}
//写字节时序
void RF_write_byte(unsigned char WData)
{
	unsigned char i;
	static bit flag;

	TRISC3=0; 				//RC3 RC4 is output
	TRISC4=0;
	for(i=0;i<8;i++)
	{
		flag=WData&0x80;
		DataIn=0;
		if(flag) DataIn=1;
		WData<<=1;
		ClkIn=1;
		NOP();
		NOP();
		NOP();
		NOP();
		ClkIn=0;
	}
}
//读字节时序
unsigned char RF_read_byte(void)
{
	unsigned char i;
	unsigned char result=0;

	TRISC3=0; 				//RC3 is output
	TRISC4=1; 				//RC4 is input
	for(i=0;i<8;i++)
	{
		result<<=1;
		ClkIn=1;
		NOP();
		if(DataIn) result++;
		NOP();
		NOP();
		NOP();
		NOP();
		ClkIn=0;
	}
	TRISC4=0; 				//RC4 is output
	return result;
}
/*************************************BuildSPIWord START****************************/

void BuildInitByte(unsigned char mode)					//河南矿卡格式;
{
	InitData[0]=0x38;//0x50;		//RX receiver 2, Datalength 56/80bit(7/10 byte)
	InitData[1]=0x38;//0x50;		//RX receiver 1, Datalength 56/80bit(7/10 byte)
	InitData[2]=0x00;//0x00;
	InitData[3]=0x00;//0x33;
	InitData[4]=0x00;//0x33;
	InitData[5]=0x10;//0x22;		
	InitData[6]=0x10;//0x22;
	InitData[7]=0x00;//0x00;
	InitData[8]=0x00;//0x33; 		//RX receiver 1 address   High byte
	InitData[9]=0x00;//0x33;		//RX receiver 1 address   High byte
	InitData[10]=0x10;//0x22;		//RX receiver 1 address   Low byte
	InitData[11]=0x10;//0x22;		//RX receiver 1 address   Low byte
	InitData[12]=0x43;//0x83;		//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	InitData[13]=0x6f;//0x4f;		//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[14]=mode;		//0x21;////Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}

/*************************************BuildSPIWord START****************************/

void BuildInitWord(unsigned char mode)
{
	InitData[0]=0x50;		//0x28;//RX receiver 2, Datalength 80bit(10 byte)
	InitData[1]=0x50;		//0x28;//RX receiver 1, Datalength 80bit(10 byte)
	InitData[2]=0x00;		//0x00;//
	InitData[3]=0x33;		//0x00;//
	InitData[4]=0x33;		//0x00;//
	InitData[5]=0x22;		//0x10;//
	InitData[6]=0x22;		//0x10;//
	InitData[7]=0x00;		//0x00;//
	InitData[8]=0x33; 		//0x00;//RX receiver 1 address   High byte
	InitData[9]=0x33;		//0x00;//RX receiver 1 address   High byte
	InitData[10]=0x22;		//0x10;//RX receiver 1 address   Low byte
	InitData[11]=0x22;		//0x10;//RX receiver 1 address   Low byte
	InitData[12]=0x83;		//0x43;//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	InitData[13]=0x4f;		//0x6f;//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[14]=mode;		//0x21;////Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}

void InitnRF2401()
{
	unsigned char tempi;
	unsigned char	ByteCnt;
	unsigned char	BitCnt;
	unsigned char  databit;
	ChipCE=0;						//Disable CE
	ChipCS = 1;						//Enable CS--confige mode
	Delay100US(1);
	for (ByteCnt=0;ByteCnt<15;ByteCnt++)
	{
		tempi=InitData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
		{
			databit=tempi&0x80;
			if (databit==0x80) //Check if first bit is HIGH
				DataIn=1;		//Set Data high
			else DataIn=0;		//Set Data low
			tempi=tempi<<1;	//Left Shift to get next bit
			NOP();
			NOP();
			ClkIn=1;
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			ClkIn=0;	            //generate a clock pulse
		}
	}
	ChipCS = 0;						//Disable CS--standby mode	
}
void SetRxMode(void)
{
	ChipCE=0;		//Set CE LOW		
	ChipCS = 1;		//Set CS HIGH--confige mode
	//TRISC4=0; 	//RC4 is output
	Delay10US();
	DataIn=1;
	NOP(); 
	NOP();
	ClkIn= 1;
	NOP(); 
	NOP(); 
	NOP(); 
	NOP(); 
	ClkIn =0;
	ChipCS=0;		//Set CS LOW		
	ChipCE=1;		//Set CE HIGH--active mode
}
void SetTxMode(void)
{
	ChipCE=0;	//Set CE LOW		
	ChipCS = 1;	//Set CS HIGH--confige mode
	Delay10US();
	//TRISC4=0; //RC4 is output
	DataIn=0;
	NOP(); 
	NOP();
	ClkIn=1;
	NOP(); 
	NOP(); 
	NOP(); 
	NOP(); 
	ClkIn=0;
	ChipCS = 0;		//Set CS LOW		
	ChipCE=1;		//Set CE HIGH--active mode
}



void TXDataPacket(void)
{
	unsigned char tempi,i;
	unsigned char	ByteCnt;
	unsigned char	BitCnt;
	unsigned char databit;
	ChipCS=0;			//Pull CS low
	ChipCE=1; 			//Enable CE	active mode
						//Delay10US();
	Delay100US(1);
	for (ByteCnt=0;ByteCnt<14;ByteCnt++)
	{
		tempi=TXData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
		{
			databit=tempi&0x80;
			if (databit==0x80)	//Check if first bit is HIGH
				DataIn=1;		//Set Data high
			else
				DataIn=0;		//Set Data low
			tempi=tempi<<1;		//Left Shift to get next bit
			NOP();
			NOP();
			ClkIn=1;
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			NOP();
			ClkIn=0;			//generate a clock pulse
		}
	}
	ChipCE=0; 					//Disable CE (TX Starts!)--standby mode

}
void RXDataPacket(void)
{
	unsigned char temp;
	unsigned char	ByteCnt;
	unsigned char	BitCnt;

	temp=0;
	TRISC4=1; 					//RC4 is input
	for (ByteCnt=0;ByteCnt<10;ByteCnt++)
	{
		for(BitCnt=0;BitCnt<8;BitCnt++)
		{
			temp=temp<<1;		//shift left to receive next bit
			ClkIn=1;			//set clock high
			NOP();	
			NOP();				//wait one clk cycle
			NOP();
			NOP();
			if(DataIn==1)		//check if Data=high		
				temp|=0x01;		//yes - set bit high
			ClkIn=0;			//set clock low
			NOP();				//wait one clk cycle
			NOP();
			NOP();
			NOP();
		}
		NOP();
		CardID[ByteCnt]=temp;
		if(ChipDR1!=1)			//check if DR1 is not still high
		{		
			NOP();
			NOP();
		}
	 }
	TRISC4=0; 					//RC4 is output
    if (CardID[0]=0x00)&&(CardID[1]=0x00)&&(CardID[4]=0x05)&&(CardID[5]=0x06)&&(CardID[6]=0x07)&&(CardID[7]=0x08)	//接收数据是否合法
	{
		TxBuff[0]=FromHead;
		TxBuff[1]=SendData;
		TxBuff[2]=0x04; 		//长度
		for(temp=0;temp<4;temp++) TxBuff[temp+3]=CardID[temp];
		TxBuff[7]=0x00; 		//校验和
		TxBuff[8]=FromEnd;
		for(temp=0;temp<9;temp++)
		{
			TXREG=TxBuff[temp];
			NOP();
			while(1)
			{
				if(TXIF) break;
			}
		}
	}
}


void RXBytePacket(void)
{
	unsigned char temp;
	unsigned char	ByteCnt;
	unsigned char	BitCnt;

	temp=0;
	TRISC4=1; 					//RC4 is input
	for (ByteCnt=0;ByteCnt<7;ByteCnt++)
	{
		for(BitCnt=0;BitCnt<8;BitCnt++)
		{
			temp=temp<<1;		//shift left to receive next bit
			ClkIn=1;			//set clock high
			NOP();	
			NOP();				//wait one clk cycle
			NOP();
			NOP();
			if(DataIn==1)		//check if Data=high		
				temp|=0x01;		//yes - set bit high
			ClkIn=0;			//set clock low
			NOP();				//wait one clk cycle
			NOP();
			NOP();
			NOP();
		}
		NOP();
		CardID[ByteCnt]=temp;
		if(ChipDR1!=1)			//check if DR1 is not still high
		{		
			NOP();
			NOP();
		}
	 }
	TRISC4=0; //RC4 is output
    if (CardID[0]=0x00)&&(CardID[1]=0x00)&&(CardID[5]=0x55)		//接收数据是否合法
	{
		TxBuff[0]=FromHead;
		TxBuff[1]=SendData;
		TxBuff[2]=0x04; 										//长度
		for(temp=0;temp<2;temp++) TxBuff[temp+5]=CardID[temp];
		TxBuff[7]=0x00; 										//校验和
		TxBuff[8]=FromEnd;
		for(temp=0;temp<9;temp++)
		{
			TXREG=TxBuff[temp];
			NOP();
			while(1)
			{
				if(TXIF) break;
			}
		}
	}
}


//初始化变量
void Init(void)
{
	RBPU = 0;
	TRISB5=0; 													//RB5/RB4/RB2/RB1/RB0 is output
	TRISB4=0;
	TRISB3=1;													//RB3 is input
	TRISB2=0;
	TRISB1=0;
	TRISB0=0;
	TRISC2=1; 													//RC2 is input
	TRISC3=0; 													//RC3 RC4 is output
	TRISC4=0;

	RevNum=0;
	TxNum=0;
	RFNum=0;
	DataLength=0;
	RxingFlag=0;
 	f_rx_evt=0;
	PIE1=0x00;
	PIE2=0x00;
	PORTB=0x00;
	PORTC=0x00;
	__IDLOC(1235);
}
void main(void)
{
	unsigned int i;
	unsigned char temp;

	Init();
	UARTInit();
	nRF2401_ON();
	CLRWDT();
	Delay100US(30);
//	BuildInitWord(0x05);//配置成接收模式21
	BuildInitByte(0x21);//配置成接收模式21

	InitnRF2401();
	CLRWDT();
	Delay10US();
	EnableReceiver();
	while(1)
	{
		CLRWDT();
		if(ChipDR1){
			RXBytePacket();
		}
	/*	if(ChipDR2){
			NOP();
		}
		if(f_rx_evt){ //收到串口数据
			f_rx_evt=0;	
			i=0;
			for(temp=0;temp<8;temp++) TxBuff[temp]=temp+0x30;
			for(temp=0;temp<8;temp++){
				TXREG=TxBuff[temp];
				NOP();
				while(1){
					if(TXIF) break;
				}
			}

		}*/
	}
}

⌨️ 快捷键说明

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