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