搜索
bottom↓
回复: 0

PIC单片机内部时钟闹钟配置

[复制链接]

出0入0汤圆

发表于 2014-3-26 11:49:33 | 显示全部楼层 |阅读模式
本帖最后由 853728579 于 2014-3-26 11:53 编辑

/*
* File:   clock.h
*         本人用的核心板是: PIC18F26J50,           XC8编译器
*        PIC单片机内部时钟闹钟配置
*  typedef unsigned char uchar;
*  typedef unsigned int uint;
*       
*  853728579@qq.com
*                         2014年3月
*/

#ifndef CLOCK_H
#define        CLOCK_H

#ifdef        __cplusplus
extern "C" {
#endif

# include <p18f26j50.h>
# include <plib/rtcc.h>
# include "type.h"

typedef enum WeekInformation
{
    Sum, Mon, Tue, Wed, Thurs, Fri, Sat
}EnuWeek;

typedef struct TimeInformation
{
    uchar hour;
    uchar min;
    uchar second;
}StrTime, * pStrTime;
typedef struct DateInformation
{
    uchar year;
    uchar month;
    uchar day;
}StrDate, * pStrDate;
typedef struct TimeDate
{
    StrTime TimeSet;
    StrDate DateSet;
    EnuWeek  week;
}StrTD, *pStrTD;

//update the repeat rate
# define  RTCC_AMASK_VALUE(x)                           (RtccSetAlarmRpt(x, TRUE))             //datasheet page  229
//update the repeat count value
# define  RTCC_ALRMRPT_VALUE(y)                         (RtccSetAlarmRptCount(y, TRUE))     //datasheet  page  230
//mRtccAlrmEnable
#define RTCC_ALRM_ON()                                  (ALRMCFGbits.ALRMEN=1)
//mRtccAlrmDisable
#define RTCC_ALRM_OFF()                                 (ALRMCFGbits.ALRMEN=0)

//RTCC function
void RTCC_Initialize(StrTD const * pTime);
void RTCC_CountTime(void);
void RTCC_TimeSet(void);
void RTCC_UpdateTime(void);
void RTCC_WriteAlarmTime(void);

#ifdef        __cplusplus
}
#endif

#endif        /* CLOCK_H */



/*************************************************************************
*                          clock.c
**************************************************************************/

//Real-time clock
# include "clock.h"
//---Global structures used in deep sleep library---
rtccTimeDate RtccTimeDate ,RtccAlrmTimeDate;
rtccTimeDate Rtcc_read_TimeDate;
StrTD ReadTime;
StrTD gSetTime;
StrTD gAlrmTime;
/*************************************************************************
*  Name:          ClearProgressBar
*  Parameters:    uchar num
*  Return Values: void
**************************************************************************/
void RTCC_Initialize(StrTD const * pTime)
{
    RtccInitClock();                                            //turn on clock source
    RtccWrOn();                                                 //write enable the rtcc registers

    RtccTimeDate.f.year = pTime->DateSet.year;                  //set year
    RtccTimeDate.f.mon  = pTime->DateSet.month;                 //Se month
    RtccTimeDate.f.mday = pTime->DateSet.day;                   //Set day
    RtccTimeDate.f.hour = pTime->TimeSet.hour;                  //Set Hour
    RtccTimeDate.f.min  = pTime->TimeSet.min;                   //Set minute
    RtccTimeDate.f.sec  = pTime->TimeSet.second;                //Set second
    RtccTimeDate.f.wday = pTime->week;                          //Set which day of the week forthe corrsponding date
    RtccWriteTimeDate(&RtccTimeDate,1);                         //write into registers
//Alrm config
    RTCC_WriteAlarmTime();
    PIE3bits.RTCCIE = 1;
    IPR3bits.RTCCIP = 0;
    INTCONbits.GIEL = 1;
    RTCCIF = 0;
    RTCC_AMASK_VALUE(RTCC_RPT_MON);                         //datasheet page  229
    RTCC_ALRMRPT_VALUE(0xff);                               //datasheet  page  230
    RtccSetChimeEnable(FALSE, TRUE);

    mRtccOn();                                              //enable the rtcc
    RTCC_ALRM_ON();
}
/*************************************************************************
*  Name:          RTCC_WriteAlarmTime
*  Parameters:    void
*  Return Values: void
**************************************************************************/
void RTCC_WriteAlarmTime(void)
{
    //RTCC config
# if 0
    gAlrmTime.DateSet.month     = 2;
    gAlrmTime.DateSet.day       = 2;
    gAlrmTime.TimeSet.hour      = 2;
    gAlrmTime.TimeSet.min       = 2;
    gAlrmTime.TimeSet.second    = 0;
    gAlrmTime.week = 3;
# endif
    RtccAlrmTimeDate.f.mon  = gAlrmTime.DateSet.month   /10*16  + gAlrmTime.DateSet.month   %10;       //Se month
    RtccAlrmTimeDate.f.mday = gAlrmTime.DateSet.day     /10*16  + gAlrmTime.DateSet.day     %10;       //Set day
    RtccAlrmTimeDate.f.hour = gAlrmTime.TimeSet.hour    /10*16  + gAlrmTime.TimeSet.hour    %10;       //Set Hour
    RtccAlrmTimeDate.f.min  = gAlrmTime.TimeSet.min     /10*16  + gAlrmTime.TimeSet.min     %10;        //Set minute
    RtccAlrmTimeDate.f.sec  = gAlrmTime.TimeSet.second  /10*16  + gAlrmTime.TimeSet.second  %10;        //Set second
    RtccAlrmTimeDate.f.wday = gAlrmTime.week            /10*16  + gAlrmTime.week            %10;
    RtccWriteAlrmTimeDate(&RtccAlrmTimeDate);
}
/*************************************************************************
*  Name:          RTCC_CountWeek
*  Parameters:    pStrDate pDate
*  Return Values: uchar
**************************************************************************/
static void RTCC_CountWeek(StrDate const * pDate)
{
    uint CountWeek = 0, CountYear = 0, CountDay = 0;
    uint YearTemp;

    YearTemp = pDate->year;
    if (YearTemp <= 12)
        CountYear = 0;
    else if ((YearTemp>12) && (YearTemp<=16))
        CountYear = YearTemp * 365 + 4;
    else if ((YearTemp>16) && (YearTemp<=20))
        CountYear = YearTemp * 365 + 5;
    switch (pDate->month)
    {
        case 1:  CountDay = pDate->day; break;
        case 2:  CountDay = 31 + pDate->day; break;
        case 3:  CountDay = 31 + 28 + pDate->day; break;
        case 4:  CountDay = 31 + 28 + 31 + pDate->day; break;
        case 5:  CountDay = 31 + 28 + 31 + 30 + pDate->day; break;
        case 6:  CountDay = 31 + 28 + 31 + 30 + 31 + pDate->day; break;
        case 7:  CountDay = 31 + 28 + 31 + 30 + 31 + 30 + pDate->day; break;
        case 8:  CountDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + pDate->day; break;
        case 9:  CountDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + pDate->day; break;
        case 10: CountDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + pDate->day; break;
        case 11: CountDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + pDate->day; break;
        case 12: CountDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + pDate->day; break;
        default: break;
    }
    if ((pDate->year%4==0) && (pDate->month>2))
        CountDay = CountDay + 1;
    else
        CountDay = CountDay;
    CountWeek = (CountYear+CountDay) % 7 + 5;
    if (CountWeek < 8)
        CountWeek = CountWeek;
    else
        CountWeek = CountWeek % 7;
    if (CountWeek == 7)
        CountWeek = 0;

    ReadTime.week = CountWeek;
}

/*************************************************************************
*  Name:          RTCC_CountTime
*  Parameters:    void
*  Return Values: void
**************************************************************************/
void RTCC_CountTime(void)
{
    RtccReadTimeDate(&Rtcc_read_TimeDate); //Rtcc_read_TimeDate will have latest time
    ReadTime.DateSet.year   = Rtcc_read_TimeDate.f.year /16*10  + Rtcc_read_TimeDate.f.year %16;
    ReadTime.DateSet.month  = Rtcc_read_TimeDate.f.mon  /16*10  + Rtcc_read_TimeDate.f.mon  %16;
    ReadTime.DateSet.day    = Rtcc_read_TimeDate.f.mday /16*10  + Rtcc_read_TimeDate.f.mday %16;
    ReadTime.TimeSet.hour   = Rtcc_read_TimeDate.f.hour /16*10  + Rtcc_read_TimeDate.f.hour %16;
    ReadTime.TimeSet.min    = Rtcc_read_TimeDate.f.min  /16*10  + Rtcc_read_TimeDate.f.min  %16;
    ReadTime.TimeSet.second = Rtcc_read_TimeDate.f.sec  /16*10  + Rtcc_read_TimeDate.f.sec  %16;
   
    RTCC_CountWeek(&ReadTime.DateSet);
}
/*************************************************************************
*  Name:          RTCC_UpdateTime
*  Parameters:    void
*  Return Values: void
**************************************************************************/
void RTCC_UpdateTime(void)
{
    gSetTime.DateSet.year    = gSetTime.DateSet.year  / 10 * 16 + gSetTime.DateSet.year     % 10;
    gSetTime.DateSet.month   = gSetTime.DateSet.month / 10 * 16 + gSetTime.DateSet.month    % 10;
    gSetTime.DateSet.day     = gSetTime.DateSet.day   / 10 * 16 + gSetTime.DateSet.day      % 10;
    gSetTime.TimeSet.hour    = gSetTime.TimeSet.hour  / 10 * 16 + gSetTime.TimeSet.hour     % 10;
    gSetTime.TimeSet.min     = gSetTime.TimeSet.min   / 10 * 16 + gSetTime.TimeSet.min      % 10;
    gSetTime.TimeSet.second  = gSetTime.TimeSet.second   / 10 * 16 + gSetTime.TimeSet.second% 10;
    RTCC_Initialize(&gSetTime);
}

/*************************************************************************
*                          main.c
**************************************************************************/
# include <p18f26j50.h>
# include "clock.h"

extern StrTD ReadTime;

void main(void)
{
    ReadTime.DateSet.year   = 2;
    ReadTime.DateSet.month  = 2;
    ReadTime.DateSet.day    = 2;
    ReadTime.TimeSet.hour   = 2;
    ReadTime.TimeSet.min    = 1;
    ReadTime.TimeSet.second = 30;
    ReadTime.week = 0;
    RTCC_Initialize(&ReadTime); //Configure RTCC using library APIs
    RTCC_CountTime();
        while (1)
        {
                RTCC_CountTime();                        //读取后的数据存放在ReadTime变量中
        }
}
void interrupt InterruptProgram(void)
{
        if (RTCCIF == 1)
    {
        RTCCIF = 0;
        //产生闹钟中断
    }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 21:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表