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

📄 main.c

📁 菜鸟,详细NRF24E1运用,程序,电路
💻 C
字号:
/******************
/
/源代码部分
/
******************/

#include "reg24le1.h"    /* 头文件包含部分   */

/******************
/
/宏定义低功耗模式
/
******************/
#define  DeepSleep   0x00
#define  Mem_Ret_On  0x01
#define  Mem_Ret_Off 0x02
#define  Reg_Ret_On  0x03
#define  Reg_Ret_Off 0x04
#define  Standby     0x05

/******************
/
/宏定义定时器中断号
/
******************/
#define  TF0         0x01  

/******************
/
/定义布尔逻辑常量
/
*******************/
#define  true        0x01
#define  false       0x00
/******************
/
/定义一个LED指示灯
/
******************/
#define  LED         P07

/******************
/
/中断开关宏定义
/
*******************/
#define Disableint() {EA=0;}
#define Enableint()  {EA=1;}

/******************
/
/定义全局变量seconds用于计秒数
/
******************/
static unsigned char seconds=0;
/******************
/
/函数原型声明方便别的函数调用
/
******************/
void getlastpowerdownmode(void);
/******************
/
/延时函数,通过修改延时参数实现延时的不同
/
*******************/
void  delay(int x)
{
int i,j;
 for(i=x;i>0;i--)
   for(j=120;j>0;j--)
     {
	 ;
	 }

}

/*****************
/
/nRF24LE1的uart的初始化,通过修改输入的参数可以初始化化不同的串口传输速率
/
******************/
void baudrate(int rate)
{

 	P0DIR &= 0xF7;				// P0.3 (TxD) 
  	P0DIR |= 0x10;     			// P0.4 (RxD) 	 
		
	S0CON  = 0x50;  
   	PCON  |= 0x80; 				// 倍增
  	WDCON |= 0x80;   			// 选用内部波特率发生器

 switch(rate)
  {
	case 38400:
			   {
			   	S0RELL = 0xF3; 	
             	S0RELH = 0x03; 	 
			   }
			   break;
	case 19200:
	           {
			   	S0RELL =0xE6; 	
             	S0RELH =0x03; 			  
			   }
			   break;
	case 14400:
               {
			   	S0RELL =0xDE; 	
             	S0RELH =0x03; 	 
			   }
			   break;
	case 9600 :
	           {
			   	S0RELL =0xCC; 	
             	S0RELH =0x03; 	 
			   }
			   break;
	case 4800 :
	           {
			   	S0RELL =0x98; 	
             	S0RELH =0x03; 	 
			   }
			   break;
	case 2400 :
	           {
			   	S0RELL =0x30; 	
             	S0RELH =0x03; 	 
			   }
			   break;
    default   :
	           {
			   	S0RELL =0xCC; 	
             	S0RELH =0x03; 	 
			   }
			   break;

    }

	return ;
}

/****************
/
/定时器初始函数
/
****************/
void timer0init(void)
{

TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}

/****************
/
/nRF24LE1工作时钟配置函数
/
*****************/
void workclkset(void)
{
    CLKCTRL   = 0x28;			   // 使用 XCOSC16M  	
	CLKLFCTRL = 0x01; 
}

/****************
/
/nRF24LE1的低功耗模式设置
/
****************/
void powrdownmodeset(unsigned char mode)
{
  char low_power=0;
  switch(mode)
  {
   case DeepSleep  :low_power=0x01;break;
   case Mem_Ret_On :low_power=0x03;break;
   case Mem_Ret_Off:low_power=0x02;break;
   case Reg_Ret_On :low_power=0x04;break;
   case Reg_Ret_Off:low_power=0x04;break;
   case Standby    :low_power=0x07;break;
   default         :low_power=0x07;break;
  }
 
  CLKCTRL=0x10; 	                     /*进入到睡眠前一定要启用RC时钟源*/
  OPMCON|=0x02;
  PWRDWN|=low_power;

}

/****************
/
/引脚唤醒模式设置
/
****************/
void retentionpinset(void)
{
 WUOPC0=0x00;
 OPMCON=0x00;               /*  开锁                          */ 
 WUOPC1=0x00;               /*唤醒的引脚设置无                */
 WUOPC0=0x01;               /*唤醒的引脚设置为P0.0            */ 
 P0DIR|=0x01;               /*P0.0初始化为输入I/O口           */
 P00   =0x00;               /*P0.0初始化为高电平              */ 	             
}

/***************
/
/串口发送一个字符
/
****************/
void putch(char ch)
{
S0BUF=ch;
while(!TI0);
TI0=0;
}

/***************
/
/串口发送一个字符串
/
***************/
void prints(char * str)
{
while(*str!='\0')
 {
  putch(*str++);
  }
}

/***************
/
/换行函数nextline()
/
****************/
void nextline(void)
{
 putch('\n');
}

/***************
/
/获得上一次低功耗模式
/
****************/
void getlastpowerdownmode(void)
{
 char tmp=0;
 tmp=PWRDWN&0x03;
 nextline();
 switch(tmp)
 {
  case 0x00:prints("Power Off!"); break;
  case 0x01:prints("Deep Sleep!");break;
  case 0x02:prints("Memory Retention, Timer Off!");break;
  case 0x03:prints("Memory Retention, Timer On!") ;break;
  case 0x04:prints("Register Retention!");break;
  case 0x07:prints("Standby!");break;
  default  :prints("Error Or Reserved!");break;
  }
}

/**************
/
/获取上一次复位的原因
/
**************/
void getlastresetinf(void)
{
 char tmp=0;
 tmp=RSTREAS&0x07;
 nextline();
 prints("Reset Reason:");
 if(0==tmp)
   {
   prints("On-chip reset generator!");
   }
 else if(0x01==tmp)
   {
   prints("RST pin!");
   }
 else if(0x02==tmp)
   {
   prints("Watchdog!");
   }
 else if(0x04==tmp)
   {
   prints("Reset from on-chip hardware debugger!");
   }
 else if(0x06==tmp)
   {
   prints(" a reset from the debugger followed by a watchdog reset!");
   }

}

/*************
/
/串口显示程序调试信息
/
**************/
void programdebug(char * bugs)
{
 nextline();
 prints("Debug Information:");
 prints((char *)bugs);  

}

/*************
/
/定时器0中断服务函数
/
**************/
void timer0isr() interrupt TF0
{
 static char times=0;
 TR0=0;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 times++;
 if(20==times)
  {
  LED=!LED;
  times=0;
  seconds++;
  nextline();
  programdebug("Time Left:");
  putch(((5-seconds)+'0'))  ;
  if(5==seconds)
    {
	delay(100);
    programdebug("Sleeping..!");
	powrdownmodeset(DeepSleep);
	 }
  if(60==seconds)
    {seconds=0;}
  }
 TR0=1;
}

/*************
/
/nRF24LE1的I/O口初始化配置函数
/
*************/
void chipiocfg(void)
{
P0DIR&=0X78;
P07=0;
}

/*************
/
/主函数部分
/
**************/
void main(void)
{
  char flag=1;
  Disableint()      ;
  workclkset()      ;                /*初始化工作时钟          */
  baudrate(9600)    ;                /*波特率初始化9600        */
  chipiocfg()       ;				 /*nRF24LE1的I/O口配置函数 */
  timer0init()      ;                /*定时器初始化函数        */
  delay(100)	    ;                /*延时函数                */
  getlastresetinf() ;                /*获取上一次系统复位的原因*/
  nextline();
  getlastpowerdownmode();            /*获取上一次低功耗模式    */
  retentionpinset() ;                /*设置唤醒引脚            */
  delay(100)        ;
  Enableint()       ;
  while(1)
  {
   if(flag)
    {
	 flag=0;
	 delay(100);
     getlastpowerdownmode();
    }
  }

}



⌨️ 快捷键说明

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