打印

睡眠定时器的使用

[复制链接]
1946|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangpx007|  楼主 | 2009-2-25 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*****************************************************************************在使用本文件请定义以下数据类型: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
http://bbs.huazhoucn.com/Temp/Temp3484_1.html

MCS51系统扩展技术2
http://bbs.huazhoucn.com/Temp/Temp3485_1.html

MCS51系统扩展技术3
http://bbs.huazhoucn.com/Temp/Temp3486_1.html

MCS51单片机系统扩展技术4
http://bbs.huazhoucn.com/Temp/Temp3487_1.html

MCS51单片机系统扩展技术5
http://bbs.huazhoucn.com/Temp/Temp3488_1.html


相关链接:http://bbs.huazhoucn.com/Temp/Temp4599_1.html

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

20

帖子

0

粉丝