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

📄 jieshou.c

📁 pic16f877a下与nRF905的通讯程序
💻 C
字号:
#include "pic.h"
//****************************************************************************
#define uchar unsigned char
#define uint unsigned int
//********************************模式控制定义********************************
#define TX_EN	RC1 					//输出
#define TRX_CE  RC2						//输出
#define PWR     RB1						//输出
//********************************SPI口定义***********************************
#define  MISO	RC4   					//输入
#define  MOSI   RC5						//输出
#define  SCK    RC3						//输出
#define  CSN    RC0						//输出
//********************************状态输出口*********************************
#define  CD     RB2						//输入
#define  AM     RB3						//输入
#define  DR     RB0						//输入
//********************************数码管位选*********************************
#define  W1     RB7						//输出
#define  W2		RB6						//输出
#define  W3		RB5						//输出
#define  W4		RB4						//输出
//********************************nRF905控制指令******************************
#define WC	0x00
#define RRC	0x10
#define WTP	0x20
#define RTP	0x21
#define WTA	0x22
#define RTA	0x23
#define RRP	0x24
//*********************************函数申明***********************************
void Delay(uchar n);
void Spi_initial(void);
uchar SpiReadSpiWrite(uchar DATA);
void nRF905Init(void);
void Config905(void);
void SetRxMode(void);
uchar CheckDR(void);
void RxPacket(void);
void RX(void);
void StartUART( void );
void R_S_Byte(uchar R_Byte);
//*********************************RF寄存器配置***********************************
uchar RFConf[11]=
{
  0x00,                           	 //在初始化前必须先写配置命令----WC
  0x4c,								 //CH_NO,配置频段在430MHZ
  0x2c,								 //输出功率为10db,不重发,节电为正常模式
  0x44,				                 //地址宽度设置,为4字节
  0x20,0x20,						 //接收发送有效数据长度为32字节
  0xcc,0xcc,0xcc,0xcc,				 //接收地址
  0x58,                            	 //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//*********************************收发缓冲区**************************8*********
uchar TxRxBuffer[32];
//*********************************延时函数**************************************
void Delay(uchar n)
{
	uchar k;
	while(n--)
	for(k=0;k<80;k++);
}
//********************************SPI初始化*************************************
void Spi_initial(void)
{
	TRISC=TRISC&0xDF;		//r设置SDO(RC5)为输出**0*****
	TRISC=TRISC&0xF7;		//r设置SCK(RC3)为输出****0***
	TRISC=TRISC|0x10;		//r设置SDI(RC4)为输入***1****   
	INTCON=0x00;			//r关闭所有中断
	PIR1=0x00;			//r
	SSPCON=0x20;			//r写入时没有冲突发生,接收时没有溢出,开启SPI功能,空闲时处于低电平,fosc/4
	SSPSTAT=0xc0;			//r上升沿时发送,
	SSPIF=0;			//rPIR1=PIR1|0x08 ;
}
//*********************************SPI读写*************************************	
uchar SpiReadSpiWrite(uchar DATA)	//r
{
	uchar b;
	Spi_initial();
	SSPBUF=DATA;	 		//写入要发送数据发送的同时也得到数据
	
	while(SSPIF==0);
	SSPIF=0;	
	b=SSPBUF;			//把得到数据保存
	return b;
	}
//******************************初始化nRF905*********************************
void system_Init(void)			//r
{
  	TRISA=0x00;
	TRISB=0x0D;
	TRISC=0x90;
	TRISD=0x00;
	TRISE=0x00;	
	ADCON1=0x07;		//必须有,设置为数字I/0口
   	CSN=1;				// Spi 	disable
	SCK=0;				// Spi clock line init low
	DR=0;				// Init DR for input
	AM=0;				// Init AM for input
	CD=0;				// Init CD for input
	PWR=1;				// nRF905 power on
	TRX_CE=0;			// Set nRF905 in standby mode
	TX_EN=0;			// set radio in Rx mode
}
//*****************************初始化nRF905寄存器*********************************
void Config905(void)
{
	uchar i;
	CSN=0;				// Spi enable for write a spi command
	for (i=0;i<11;i++)	// Write configration words  写配置字
	{
	   SpiReadSpiWrite(RFConf[i]);
	}
	CSN=1;				// Disable Spi
}
//*****************************设置接收模式**********************************************
void SetRxMode(void)
{
	TX_EN=0;
	Delay(1); 
	TRX_CE=1;
	Delay(1); 			// delay for mode change(>=650us)
}
//*****************************读取接收数据**********************************************
void RxPacket(void)							//读数据
{
	uchar i;
   	Delay(1);
   	TRX_CE=0;
	CSN=0;					// Spi enable for write a spi command
   	Delay(1);
	SpiReadSpiWrite(RRP);
	for (i = 0 ;i < 32 ;i++)
	{
	TxRxBuffer[i]=SpiReadSpiWrite(0);	// Read data and save to buffer
   	}
	CSN=1 ;
    while (AM||DR);				//等待读完毕DR=0,AM=0
	TRX_CE=1;							
}
//*********************************数据接收*********************************************
void  RX(void)
{
    SetRxMode();		// Set nRF905 in Rx mode
    while(DR==0);		//等待接收数据
    Delay(1);			
	RxPacket();			// 提取接收到数据
	Delay(1);
}
//*********************************USART串口初始化*************************************
void StartUART(void)
{  	
	TXSTA=0x04;		 	//设定TXSTA寄存器。同步从模式,8位数据,数据发送禁止,
	SPBRG=103; 			//6MHZ, BR1GH=1, 4.8kbps.
	PIE1=0; 			//清除PIE1所有中断使能。
	RCSTA=0x80; 		//禁止接收,打开通讯端口
	TRISC=TRISC|0X80;  	//将RC7(RX)设置为输入方式 
	TRISC=TRISC&0XBF;  	// RC6(TX)设置为输出 
	TXEN=1;				//启动发送,TSR开始移位操作。
}
//*********************************串口输出数据*****************************************
void R_S_Byte(uchar R_Byte)
{	
     	TXREG= R_Byte;  
}
//*********************************主函数************************************************
void main(void)
{
   	char i,count;
	PORTE=0xff;             //关闭蜂明器
	PORTD=0xff;				//关闭数码管

    StartUART();			//串口初始化
	system_Init();			//系统初始化
	Delay(10);
	Config905();			//写入10字节控制字
	W1=0;W2=0;W3=0;W4=0;
	while(1)
	{
		RX();				//接收数据
		if(TxRxBuffer[0])
		{
			for(i=0;i<32;i++)	//将接收到数据发送给电脑,并通过串口助手软件检验收发数据是否一样
			{
				R_S_Byte(TxRxBuffer[i]);
				Delay(20);
			}
		}
		count++;
		if(count==4)
		{
		count=0;	
		}
		switch(count)
		{
		case 	0x01:	
		PORTD=	0xbf;
		break;	
		case 	0x02:	 
 	   
		PORTD=	0xf7;
		break;	
		case 	0x03:
		PORTD=	0xfe;
	  	break;	
		default:  break;
		}
	}
}

/*	可以用以下方式通过来读写配置字来检验是否读写配置是否成功
	CSN=0;                  	//SPI使能
	Delay(1);
	SpiReadSpiWrite(RRC);   	//写入控制字 	
	for(j=0;j<10;j++)		//读出配置字
	{
	temp[j]=SpiReadSpiWrite(0);
 	}
 	for(j=0;j<10;j++)
	{
 	R_S_Byte(temp[j]);		//串口显示
 	Delay(1000);
	}
	CSN=1;				//禁止SPI
*/


⌨️ 快捷键说明

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