导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[推荐]睡眠定时器的使用[fengjian99]

 *第27168篇: [推荐]睡眠定时器的使用

  
楼 主:fengjian99 2009年2月25日17:20
 [推荐]睡眠定时器的使用
/*****************************************************************************
在使用本文件请定义以下数据类型:typedef enum TimeUnit{MILLISECOND,SECOND,MINUTE,HOUR} TimeUnit_def;声明以下函数:extern void halInitSleepTimer(void);extern BYTE setSleepTimerPeriod(WORD time,TimeUnit_def uint);extern void halResetSleepTimerAndEnterPM2(void);
******************************************************************************/
/**********************************头文件***********************************/

#include "hal.h"
#ifndef SLEEPTIMER_ENABLE#define SLEEPTIMER_ENABLE TRUEtypedef enum TimeUnit{MILLISECOND,SECOND,MINUTE,HOUR} TimeUnit_def;
#endif//-----------------------------------------------------------------------------
//功能: 用来初始化睡眠定时器
//       启用了全局中断,并打开了ST的中断//输入:无
//输出:无
//说明:在使用ST唤醒系统时,请先调用本函数
//-----------------------------------------------------------------------------

void halInitSleepTimer(void)
{  
//SET_MAIN_CLOCK_SOURCE(CRYSTAL);//设主时钟为晶振,可不设  INT_GLOBAL_ENABLE(INT_OFF);      //关中断  
SLEEP_TIMER_INIT();  
INT_SETFLAG(INUM_ST,INT_CLR);  
INT_ENABLE(INUM_ST,INT_ON);  
SLEEP_TIMER_ENABLE_EVENT0_INT(INT_ON);  
INT_GLOBAL_ENABLE(INT_ON);}

//-----------------------------------------------------------------------------
//功能:设置睡眠定时器的唤醒时间
//输入:time,时间   uint,单位
//输出:设置的状态,0代表成功,其他数代表失败
//说明:使用低速RC时,最长可以定时17.2H,最小11.08MS (Tmin = 750/Fref * 384)
//      使用低速晶振时,最长可以定时18.2小时,最小11.72MS
//      调用本函数之前必须先调用halInitSleepTimer()。
//-----------------------------------------------------------------------------
BYTE setSleepTimerPeriod(WORD time,TimeUnit_def uint)
{  
UINT32 temp = 0;  
BYTE wor_res = 0;  
float temp2;  
if( (uint == MILLISECOND) && (time   < 12) )return 3;  //3代表设置时间过短  
if(CLKCON & 0x80)           //使用RC  
{   
 if( (uint == HOUR) && (time >   17) )return 2;     //2代表设置的时间过长    
temp2 = time * 104000 / 3;                       //  104,000/3 = 26,000,000/750  }  else  
{    if( (uint == HOUR) && (time >   18) )return 2;     //2代表设置的时间过长    temp2 = time * 32768;  }  
if(uint == MILLISECOND)  
{    temp2 /= 1000;  }  
else  {    while(uint >   SECOND)                  //将时,分为单位的数划为秒   
{      
temp2 *= 60;      
uint --;    }  
}  temp = (UINT32)temp2;
  while(temp >   0xffff)  
{    temp >  >  = 5;    wor_res ++;  
}  
WORCTL &= ~0X03;  
WOREVT1 = (BYTE)((WORD)temp>  >  8);  
WOREVT0 = (BYTE)((WORD)temp);  
WORCTL |= wor_res;  return 0;                                          
 //设置成功 返回0}//-----------------------------------------------------------------------------
//功能:复位ST后进入PM2//输入:无//输出:无//说明:复位ST后,必须等待两个时钟沿
//-----------------------------------------------------------------------------
void halResetSleepTimerAndEnterPM2(void)
{  BYTE temp;
  SLEEP_TIMER_RESET();  
WORIRQ &= ~0X01;  
temp = WORTIME0;  
while(temp == WORTIME0);  
temp = WORTIME0;  
while(temp == WORTIME0);                            //等待两上时钟沿  
INT_SETFLAG(INUM_ST,INT_CLR);  
SET_POWER_MODE(POWER_MODE_2);
}

MCS51系统扩展技术1

MCS51系统扩展技术2

MCS51系统扩展技术3

MCS51单片机系统扩展技术4

MCS51单片机系统扩展技术5


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:Keil c51 C程序延时时间[推荐]

[下一篇主题]:fdfd