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

📄 fasong.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						//输出
//********************************905-SPI指令********************************
#define WC	0x00
#define RRC	0x10
#define WTP	0x20
#define RTP	0x21
#define WTA	0x22
#define RTA	0x23
#define RRP	0x24
//********************************函数初始化********************************
void Delay(uchar x);
void Spi_initial(void);
uchar SpiReadSpiWrite(uchar DATA);
void system_Init(void);
void Config905(void);
void TxPacket(void);
void SetTxMode(void);
unsigned char CheckCD(void);
void TX(void);
void StartUART(void);
void R_S_Byte(uchar R_Byte);
//*****************************待发发送的32字节数据************************
uchar TxRxBuf[32]=			     //发送数据
{
'Y','i','n',' ','l','i','x','i',
'n','g',' ','i','s',' ','a',' ',
'g','o','o','d',' ','m','a','n',
'.',' ','L','o','v','e',' ','S',
};
//********************************接收端地址********************************
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc };    //接收地址
//********************************初始化nRF905********************************
uchar RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在430MHZ
  0x2C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//********************************延时**************************************
void Delay(uchar x)               //设置延时
{
	uchar i;
	while(x--)
	for(i=0;i<80;i++);
}
//********************************SPI模式初始化********************************
void Spi_initial(void)
{ 
	INTCON=0x00;		//关闭所有中断
	PIR1=0x00;		
	SSPCON=0x20;		//写入时没有冲突发生,接收时没有溢出,开启SPI功能,空闲时处于低电平,fosc/4
	SSPSTAT=0xc0;		//上升沿时发送,
	ADCON1=0x07;
	SSPIF=0;		   //PIR1=PIR1|0x08 ;
}
//********************************SPI数据读写**************************************	
uchar SpiReadSpiWrite(uchar DATA)//r
{
	uchar b;
	Spi_initial();
	SSPBUF=DATA;	 	//写入要发送数据发送的同时也得到数据
	do
	{
	;
	}
	while(SSPIF==0);
	SSPIF=0;	
	b=SSPBUF;		//把得到数据保存
	return b;
	}
//********************************系统初始化**************************************
void system_Init(void)			//r
{
	TRISA=0x00;
	TRISB=0x0D;
	TRISC=0x90;
	TRISD=0x00;
	TRISE=0x00;	
	ADCON1=0x07;		//
   	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
}
//********************************初始化寄存器********************************
void Config905(void)
{
	uchar i;
	CSN=0;	
	Delay(1);				// Spi enable for write a spi command
	//SpiWrite(WC);				// Write config command写放配置命令
	for (i=0;i<11;i++)			// Write configration words  写放配置字
	{
	 SpiReadSpiWrite(RFConf[i]);
	}
	CSN=1;					// Disable Spi
}
//********************************待发数据打包********************************
void TxPacket(void)
{
	uchar i;
	CSN=0;
	Delay(1);
	SpiReadSpiWrite(WTP);			    //向nrf905加载32字节待发数据
	for (i=0;i<32;i++)
	{
	SpiReadSpiWrite(TxRxBuf[i]);		// Write 32 bytes Tx data
	}							
	CSN=1;								// Spi disable
	Delay(1);					
	CSN=0;						    	// Spi enable for write a spi command
	SpiReadSpiWrite(WTA);				// Write address command
	for (i=0;i<4;i++)		         	// 加载4字节地址
	{
	(TxAddress[i]);
	}
	CSN=1;						       	// 关闭SPI
	TRX_CE=1;						  	// 激发数据无线发送
	Delay(1);			              	// while (DR!=1);
	TRX_CE=0;				         	// Set TRX_CE low
}
//*******************************************************************************
void SetTxMode(void)				  	//发送模式初始化状态设置
{
	TRX_CE=0;			    			//
	TX_EN=1;			    			//发送使能
	Delay(1); 				   			// delay for mode change(>=650us)
}
//********************************************************************************
void TX(void)
{
    SetTxMode();			// Set nRF905 in Tx mode
	TxPacket();		    	// Send data by nRF905
}
//********************************USART串口初始化********************************
void StartUART(void)
{
	TXSTA=0x04;						//设定TXSTA寄存器。同步从模式,8位数据,数据发送禁止,
	SPBRG=51; 						//16MHZ, BRGH=1.92kbps.
	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;  
}
//********************************主函数*************************************
main()
{
	PORTE=0xff;				//关闭蜂明器
	PORTD=0xbf;          
	StartUART();			//串口初始化
	system_Init();			//系统初始化
	Config905();			//写入配置字
	W1=0;	W2=0;	W3=0; W4=0;
	TX();					//数据发送
}

⌨️ 快捷键说明

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