?? main.c
字號(hào):
/******************
/
/源代碼部分
/
******************/
#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
/******************
/
/宏定義定時(shí)器中斷號(hào)
/
******************/
#define TF0 0x01
/******************
/
/定義布爾邏輯常量
/
*******************/
#define true 0x01
#define false 0x00
/******************
/
/定義一個(gè)LED指示燈
/
******************/
#define LED P07
/******************
/
/中斷開關(guān)宏定義
/
*******************/
#define Disableint() {EA=0;}
#define Enableint() {EA=1;}
/******************
/
/定義全局變量seconds用于計(jì)秒數(shù)
/
******************/
static unsigned char seconds=0;
/******************
/
/函數(shù)原型聲明方便別的函數(shù)調(diào)用
/
******************/
void getlastpowerdownmode(void);
/******************
/
/延時(shí)函數(shù),通過修改延時(shí)參數(shù)實(shí)現(xiàn)延時(shí)的不同
/
*******************/
void delay(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--)
{
;
}
}
/*****************
/
/nRF24LE1的uart的初始化,通過修改輸入的參數(shù)可以初始化化不同的串口傳輸速率
/
******************/
void baudrate(int rate)
{
P0DIR &= 0xF7; // P0.3 (TxD)
P0DIR |= 0x10; // P0.4 (RxD)
S0CON = 0x50;
PCON |= 0x80; // 倍增
WDCON |= 0x80; // 選用內(nèi)部波特率發(fā)生器
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 ;
}
/****************
/
/定時(shí)器初始函數(shù)
/
****************/
void timer0init(void)
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
/****************
/
/nRF24LE1工作時(shí)鐘配置函數(shù)
/
*****************/
void workclkset(void)
{
CLKCTRL = 0x28; // 使用 XCOSC16M
CLKLFCTRL = 0x01;
}
/****************
/
/nRF24LE1的低功耗模式設(shè)置
/
****************/
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; /*進(jìn)入到睡眠前一定要啟用RC時(shí)鐘源*/
OPMCON|=0x02;
PWRDWN|=low_power;
}
/****************
/
/引腳喚醒模式設(shè)置
/
****************/
void retentionpinset(void)
{
WUOPC0=0x00;
OPMCON=0x00; /* 開鎖 */
WUOPC1=0x00; /*喚醒的引腳設(shè)置無 */
WUOPC0=0x01; /*喚醒的引腳設(shè)置為P0.0 */
P0DIR|=0x01; /*P0.0初始化為輸入I/O口 */
P00 =0x00; /*P0.0初始化為高電平 */
}
/***************
/
/串口發(fā)送一個(gè)字符
/
****************/
void putch(char ch)
{
S0BUF=ch;
while(!TI0);
TI0=0;
}
/***************
/
/串口發(fā)送一個(gè)字符串
/
***************/
void prints(char * str)
{
while(*str!='\0')
{
putch(*str++);
}
}
/***************
/
/換行函數(shù)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;
}
}
/**************
/
/獲取上一次復(fù)位的原因
/
**************/
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!");
}
}
/*************
/
/串口顯示程序調(diào)試信息
/
**************/
void programdebug(char * bugs)
{
nextline();
prints("Debug Information:");
prints((char *)bugs);
}
/*************
/
/定時(shí)器0中斷服務(wù)函數(shù)
/
**************/
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口初始化配置函數(shù)
/
*************/
void chipiocfg(void)
{
P0DIR&=0X78;
P07=0;
}
/*************
/
/主函數(shù)部分
/
**************/
void main(void)
{
char flag=1;
Disableint() ;
workclkset() ; /*初始化工作時(shí)鐘 */
baudrate(9600) ; /*波特率初始化9600 */
chipiocfg() ; /*nRF24LE1的I/O口配置函數(shù) */
timer0init() ; /*定時(shí)器初始化函數(shù) */
delay(100) ; /*延時(shí)函數(shù) */
getlastresetinf() ; /*獲取上一次系統(tǒng)復(fù)位的原因*/
nextline();
getlastpowerdownmode(); /*獲取上一次低功耗模式 */
retentionpinset() ; /*設(shè)置喚醒引腳 */
delay(100) ;
Enableint() ;
while(1)
{
if(flag)
{
flag=0;
delay(100);
getlastpowerdownmode();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -