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