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

📄 main.c

📁 RFID模块发射接收的C源代码
💻 C
字号:
/*********************************************************************
功能:
	RFID TARGET发射程序
说明:
	本程序采用定时2秒发射ID一次,发射完毕进入低功耗模式,低功耗电流3uA
	ID长度为6 byte
**********************************************************************/


#include <Nordic\reg24le1.h>
#include <stdint.h>
#include "API.h"

//#define	PIN24
#define	PIN32
//#define	PIN48

#ifdef 	PIN24
sbit S3	 = P0^6;                               	// 1/0=未按/按下
sbit S2  = P0^4;                               	// 1/0=未按/按下
sbit S1  = P0^3;                               	// 1/0=未按/按下

sbit LED3 = P0^2;                         		// 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir	0xd8
#define p1dir	0xff
#endif

#ifdef 	PIN32
sbit S3	 = P1^4;                               	// 1/0=未按/按下
sbit S2  = P1^3;                               	// 1/0=未按/按下
sbit S1  = P1^2;                               	// 1/0=未按/按下

sbit LED3 = P0^2;                               // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir	0xf0
#define p1dir	0xff
#endif

#ifdef 	PIN48
sbit S3	 = P0^7;                               	// 1/0=未按/按下
sbit S2  = P0^6;                               	// 1/0=未按/按下
sbit S1  = P0^5;                               	// 1/0=未按/按下

sbit LED3 = P0^2;                               // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir	0xf0
#define p1dir	0x02
#endif

#define INTERRUPT_RFIRQ	9
#define INTERRUPT_TICK 	13  

#define TX_ADR_WIDTH    6   					// RF收发地址共5 bytes 
#define TX_PLOAD_WIDTH  20  					// 数据包长度为20 bytes

uint8_t const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x56,0x78,0x90,0x12,0x26}; // 定义RF收发地址

uint8_t data id_buf[TX_PLOAD_WIDTH]={ 1,2, 3, 4, 5, 6,7};    //typedef unsigned int uint8_t	

uint8_t data rx_buf[TX_PLOAD_WIDTH];  

uint8_t bdata sta;
sbit	RX_DR	=sta^6;  //读取接收数据指令
sbit	TX_DS	=sta^5;   // 写待发数据指令
sbit	MAX_RT	=sta^4;

/**************************************************
功能:延时
**************************************************/
void delay(uint16_t x)
{
    uint16_t i,j;
    i=0;
    for(i=0;i<x;i++)
    {
       j=108;
       while(j--);
    }
}
/**************************************************
功能:硬件SPI读写
**************************************************/
uint8_t SPI_RW(uint8_t value)
{
  SPIRDAT = value;
  											       
  while(!(SPIRSTAT & 0x02));  					// 等待SPI传输完成

  return SPIRDAT;             					// 返回读出值
}
/**************************************************
功能:写RF寄存器,读RF状态值
**************************************************/
uint8_t SPI_RW_Reg(uint8_t reg, uint8_t value)
{
	uint8_t status;

  	RFCSN = 0;                   	
  	status = SPI_RW(reg);      					// 选择RF寄存器
  	SPI_RW(value);             					// 写入数据
  	RFCSN = 1;                   	

  	return(status);            					// 返回RF状态值
}
/**************************************************
功能:读RF寄存器
**************************************************/
uint8_t SPI_Read(uint8_t reg)
{
	uint8_t reg_val;

  	RFCSN = 0;                			
  	SPI_RW(reg);            					// 选择RF寄存器
  	reg_val = SPI_RW(0);    					// 读出数据
  	RFCSN = 1;                			

  	return(reg_val);        					// 返回RF状态值
}

/**************************************************
功能:读RF寄存器多字节数据到缓冲区
**************************************************/
uint8_t SPI_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{
	uint8_t status,byte_ctr;

  	RFCSN = 0;                    		
  	status = SPI_RW(reg);       				// 选择RF寄存器

  	for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
    	 pBuf[byte_ctr] = SPI_RW(0);    			// 连接读出数据

  	RFCSN = 1;                          

  	return(status);                    			// 返回RF状态值
}
/**************************************************
功能:把缓冲区的多字节数据写到RF寄存器
**************************************************/
uint8_t SPI_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{
	uint8_t status,byte_ctr;

  	RFCSN = 0;                   		
  	status = SPI_RW(reg);    					// 选择RF寄存器
  	for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 连接写入数据
		   SPI_RW(*pBuf++); 
  	RFCSN = 1;                 			
  	return(status);          					// 返回RF状态值
}
/**************************************************
功能:设置为掉电模式
**************************************************/
void PD_Mode(void)
{
	RFCE=0;
  	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0c);   	// PWR_UP=0
}
/**************************************************
功能:设置为发射模式
**************************************************/
void TX_Mode(void)
{
  	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     			// 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
  	SPI_Write_Buf(WR_TX_PLOAD, id_buf, TX_PLOAD_WIDTH); // 写数据到FIFO
	RFCE=1;												// 启动发射
	delay(10);											// 发射脉冲
	RFCE=0;												
}

/**************************************************
功能:设置为接收模式
**************************************************/
void RX_Mode(void)
{
	RFCE=0;
  	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);   	// 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
  	RFCE = 1; 									// 启动接收模式
}

/**************************************************
功能:RF初始化
**************************************************/
void rf_init(void)
{
  	RFCE = 0;                                   		// RF关闭
  	RFCKEN = 1;                                 		// 启动RF时钟
  	RF = 1;                                     		// 允许RF中断

	delay(1000);

  	SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    	// 设置发射地址长度
  	SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); 	// 设置接收地址长度

  	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      			// 启动自动应答功能
  	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  			// PIPE0接收数据
  	SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); 			// 自动重传10次
  	SPI_RW_Reg(WRITE_REG + RF_CH, 40);        			// RF频率2440MHz
  	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);   			// 发射功率0dBm, 传输速率2Mbps,
  	SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); 	// PIPE0 接收数据包长度			
}
/**************************************************
功能:RF中断服务程序
**************************************************/
void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
{
	sta=SPI_Read(STATUS);		// 读出状态值
	if(RX_DR)									
	{
		SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 读出FIFO的数据
		SPI_RW_Reg(FLUSH_RX,0);							// 清除RX的FIFO
	}							
	SPI_RW_Reg(WRITE_REG+STATUS,0x70);					// 清除所有中断标志 
}

/**************************************************
功能:RTC2初始化
**************************************************/
void rtc2_init(void)
{
	CLKLFCTRL=0x01;									   	// 使用RC 32KHz时钟
	RTC2CMP0=0xff;										// 定时2秒
	RTC2CMP1=0xff;
	RTC2CON=0x06;										// 比较模式
	WUIRQ=1;											// 允许TICK中断
}
/**************************************************
功能:启动RTC2
**************************************************/
void rtc2_on(void)
{
	RTC2CON |=0x01;									
}
/**************************************************
功能:关闭RTC2
**************************************************/
void rtc2_off(void)
{													  	
	RTC2CON &=~0x01;							   		
}
/**************************************************
功能:RTC2中断服务程序
**************************************************/
void RTC2_IRQ(void) interrupt INTERRUPT_TICK 
{
	LED2=!LED2;										   	
}
/**************************************************
功能:串口初始化子程序
说明:波特率19.2K,使用内部波特率发生器
**************************************************/
void uart_init(void)
{
    ES0 = 0;                      				// 关UART0中断
    REN0 = 1;                     				// 允许接收
    SM0 = 0;                      				// 串口模式1,8bit可变波特率
    SM1 = 1;                   
    PCON |= 0x80;                 				// SMOD = 1 ,PCON=1001000
    ADCON |= 0x80;                				// 选择内部波特率发生器,ADCON=10000000;

    S0RELL = 0xe6;                				// 波特率19.2K(十进制998=十六进制0x03e6)
    S0RELH = 0x03;
    TI0 = 0;					  				// 清发送完成标志
	S0BUF=0x99;					  				// 送初值
}              				
/**************************************************
功能:I/O口初始化
**************************************************/
void io_init(void)
{
	P0DIR = p0dir;							   	// 设定I/O口输入输出
  	P1DIR = p1dir;					

	LED1=LED2=LED3=0;							// 灯全亮
	delay(1000);
	LED1=LED2=LED3=1;							// 灯全灭                  
}  
/**************************************************
功能:主程序
**************************************************/
void main(void)
{
	io_init();									// I/O口初始化
	rf_init();									// RF初始化                            
  	EA=1;                                       // 允许中断	 
	rtc2_init();								 // RTC2初始化
												
	while(1)
	{
		rtc2_off();							   	// 关RTC2 
		TX_Mode();								// 发射数据
		while (!(TX_DS|MAX_RT));				// 等待发射结束
		sta = 0;
		PD_Mode();								// 关RF
		rtc2_on();								// 开RTC2
		PWRDWN = 0x04;							// 进入低功耗模式,等待RTC2唤醒
		delay(10);									// I/O口初始化
	    uart_init();                           		// 串口初始化 
     	rf_init();									// RF初始化                                                                 
		RX_Mode();
		delay(1000000000);
		if(!RX_DR)
		{
			io_init();									// I/O口初始化
			rf_init();									// RF初始化                            
  			EA=1;                                       // 允许中断	 
			rtc2_init();								 // RTC2初始化
			rtc2_off();							   	// 关RTC2 
			TX_Mode();								// 发射数据
			while (!(TX_DS|MAX_RT));				// 等待发射结束
			sta = 0;
			PD_Mode();								// 关RF
			rtc2_on();								// 开RTC2
			PWRDWN = 0x04;							 // 进入低功耗模式,等待RTC2唤醒	
										
		}
		else
		{while(RX_DR);}		
		LED2=0;
		delay(100000);
		LED2=1;

	}
}              				


⌨️ 快捷键说明

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