单片机 > 单片机程序设计 > 详情

2440裸机篇之4 RTC实时时钟

发布时间:2025-07-25 发布时间:
|

//***************************************************************
//manymany-2440裸机篇之4  RTC实时时钟
//***************************************************************
//目的:掌握RTC实时时钟功能,每秒显示实时时钟
//            实现实时闹钟功能,掌握控制RTC各个寄存器
//***************************************************************
//功能:每秒显示实时时钟,能读取年,月,日,星期,时,分,秒
//            实现闹钟功能,控制蜂鸣器响灭。 
//*************************************************************** 
//***************************************************************
//这是一个很实用的模块,现在先用串口显示,等过段时间写到液晶显示再
//改换液晶显示,那样更直观明了。
//***************************************************************
// 共两个c文件 这个为rtc.c,另一个为rtcalarm.c
//***************************************************************   
#include "2440lib.h"
#include "2440addr.h"

extern void setRTCtime(U8,U8,U8,U8,U8,U8,U8);
extern void setRTCalm(U8,U8,U8,U8,U8,U8);
extern void OpenAlarm(void);
extern void OpenAlarm(void);
extern void OpenRtc(void);
extern void alarm(void);

//******************************************************************
void xmain(void)          //主函数   在这里主要讨论RTC寄存器的使用,其他的不深究
{
  ChangeClockDivider(3,1);    
  ChangeMPllValue(127,2,1);   //405MHZ
 
  rGPBCON="0x155555";
 
  Isr_Init(); //中断初始化
  Uart_Init(0, 115200);   //串口初始化
  Uart_Select(0);   //串口选择
  Uart_Printf("the main is running\n");  //打印显示
     
       //以下这两个函数用来设置系统开始时间和闹钟时间
       //注意BCDYAER寄存器的8和9不能用08和09代替
  setRTCalm(9,05,17,11,50,30); //年、月、日、时、分、秒  
  setRTCtime(9,05,16,5,12,35,01); //年、月、日、星期、时、分、秒
   
  OpenAlarm();    //开闹钟功能
  OpenRtc();      //开RTC时钟
 
  alarm();      //判断闹钟是否到时间,蜂鸣器的响与停
  while(1); 
}
//**************************************************************
//以下为rtcalarm.c
//**************************************************************
#include "2440lib.h"
#include "2440addr.h"

char *week[8] = { "","SUN","MON", "TUES", "WED",

                                   "THURS","FRI", "SAT" } ;  //星期的数组
int year, month,date,weekday,hour,min,sec;
int beep = 1;       //闹钟用的蜂鸣器的标志位,初始化为1,不响
extern void Buzzer_PWM_Run(void);
extern char *week[8];
void CloseAlarm(void);
//********************************************************************
void Get_Rtc(void)  //读出当前的时间函数
{
        rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位

     if (rBCDYEAR == 0x99)   //判断具体年份,因为8位寄存器只能保存0-255
     year = 0x1999;
     else    
     year = 0x2000 + rBCDYEAR;  
     month="rBCDMON";     //读取年,月,日,时,分,秒各个寄存器的数据。
     date="rBCDDATE";
     weekday="rBCDDAY";
     hour="rBCDHOUR";
     min="rBCDMIN";
     sec="rBCDSEC";


   rRTCCON = 0x0;   

                 //RTC读写禁止,选择BCD时钟、计数器,无复位
}
//******************************************************************************
// 利用中断,进行实时时钟RTC和闹钟的进行
//***************************************************************************
void __irq TICKINT_Handler(void)   //RTC中断服务函数
{
    Get_Rtc();       //读出当前的时间函数
                           //串口打印,显示当前时间,在这里我们先用串口显示,

                           //等做到液晶的时候,我们再用液晶代替串口,可能直观点。
    Uart_Printf("RTC TIME : %4x-%02x-%02x - %s - %02x:%02x:% 

    02x\n",year,month,date,week[weekday],hour,min,sec);
   ClearPending(BIT_TICK);   //清除TICK中断函数。即分别往rSRCPND,

                                               //  rINTPND的TICK位置1即可。
 
}

void __irq IsrAlarm(void)    //利用中断,闹钟实时进行中断函数
{
     ClearPending(BIT_RTC);   //SRCPND,INTPND分别置1.
     Uart_Printf("mini2440 RTCALM  oucer \n");  
     beep = 0;  // 蜂鸣器标志位清0
     CloseAlarm();   //关闹钟,即如果要开闹钟的先要把它关了,再开。
}
//******************************************************************************

             //设置RTC ALARM 时间
void setRTCalm(U8 almyear,U8 almmon,U8 almdate,
               U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒
{   rRTCCON="0x0001";      //RTCCON实时时钟控制寄存器,
                                           //【0】位RTC使能信号控制位,0为禁止,1为允许
                                           //对RTC模块进行读写操作前应对其最低位至1
    rALMYEAR = almyear;
    rALMMON  = almmon;
    rALMDATE = almdate;
    rALMHOUR = almhour;
    rALMMIN  = almmin;
    rALMSEC  = almsec;
 
     rRTCCON = 0;    //读取数据完后禁止使能信号,以防误操作,
                                  //整个文件的设置都一样,不重覆
}

         //置时钟定时时间
void setRTCtime(U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,
                          U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec)

             //年、月、日、星期、时、分、秒
{
 rRTCCON=0x01;
 
 rBCDYEAR = wRTCyear;
 rBCDMON  = wRTCmon;
 rBCDDATE = wRTCdate;
 rBCDDAY  = wRTCday;
 rBCDHOUR = wRTChour;
 rBCDMIN  = wRTCmon;
 rBCDSEC  = wRTCsec;
 
    rRTCCON = 0x00; 

//****************************************************************************
//时钟和闹钟的开关操作函数:
//OpenRtc(); //RTC开函数        CloseRtc(); //RTC关函数
//OpenAlarm():开闹钟功能函数    CloseAlarm():关闹钟功能函数
//****************************************************************************
//RTC开
void OpenRtc(void)
{
    pISR_TICK=(unsigned)TICKINT_Handler;   //执行RTC中断服务函数
    rTICNT="0xFF";  //TICNT该寄存器用于是否允许时间滴答中断和时间中断的计数值。
               //TICNT[7]为0,禁止,为1,使能。
              //TICNT[6:0]时间滴答计数值,1-127,自动递减,不能读取其实时数值。
    EnableIrq(BIT_TICK);  //开RTC中断服务
}

      //RTC关
void CloseRtc(void)
{
    rTICNT &= ~(1<<7);   //禁止TICNT 
    DisableIrq(BIT_TICK);  //关RTC中断服务

}
     //开闹钟功能函数
void OpenAlarm()    
{
   pISR_RTC = (unsigned)IsrAlarm;    //中断寄存器ISR中的RTC中断位
   ClearPending(BIT_RTC); 
   rRTCALM = (0x7f); //RTCALM闹钟控制寄存器,

                                   //【0-7】分别对应秒到年的闹钟 使能,      
                                   //相应位0表示禁止,1表示允许
 EnableIrq(BIT_RTC);   //开中断
  
}

      //关闹钟功能函数
void CloseAlarm(void)     
{
   rRTCALM = 0; //RTCALM闹钟控制寄存器所有位禁止
   DisableIrq(BIT_RTC);    //关中断
}
//****************************************************************************
void alarm()      //判断闹钟是否到时间,蜂鸣器的响与停
{
  if(beep)     //如果标志位为1,则没有到时间
   {
     rGPBDAT &=~(1<<0); //蜂鸣器不响
     Delay(1000);
   }
   else        //如果标志位为0,则到时间
   {
     rGPBDAT |=(1<<0);   //蜂鸣器响
     Delay(1000);
   }
}


关键字:2440  RTC  实时时钟 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR学习 --74HC164应用