?? rtc_ds12887.lib
字號:
/*
****************************************************************************************
源程序文件名: RTC_DS12887.C
源程序名稱: 實(shí)時(shí)時(shí)鐘芯片 DS12887 接口驅(qū)動的源程序文件
程序版本: 1.0
程序功能:
本程序是用 ATmega16 控制實(shí)時(shí)時(shí)鐘芯片 DS12887 接口驅(qū)動的源程序文件。
程序說明:
函數(shù)入口參數(shù):
函數(shù)出口參數(shù):
編譯工具軟件: CodeVision AVR C 版本:1.24.6 以上
鏈接子程序文件:
編作者: 磊元
編作者 E-Mail: PTZSW@163.COM
編制日期: 2005年5月22日
------------------------------------------------------------------------------
適用器件芯片類型: Atmel 公司生產(chǎn)的8位 RISC 單片機(jī)
器件芯片時(shí)鐘頻率:
存儲器模式: 小存儲器模式
外部擴(kuò)展存儲器大小:0 【字節(jié)】
數(shù)據(jù)堆棧大小: 256 【字節(jié)】
------------------------------------------------------------------------------
源程序版本歷史:
2005年5月22日 -------- 版本 1.0 :發(fā)行版本
****************************************************************************************
*/
/*======================================================================================
本源程序包括的頭部文件
======================================================================================*/
#include "RTC_DS12887.h" /* 本程序的頭部文件 */
/*======================================================================================
程序指令代碼清單
======================================================================================*/
/*----------------------------------------------------------------------------
全局靜態(tài)變量定義:
----------------------------------------------------------------------------*/
static volatile Uchar8 tasks_time=0; /* 時(shí)間消息的任務(wù)變量 */
/* 時(shí)間消息的任務(wù)變量的各位定義如下:
┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓
┃ BIT7 ┃ BIT6 ┃ BIT5 ┃ BIT4 ┃ BIT3 ┃ BIT2 ┃ BIT1 ┃ BIT0 ┃
┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫
┃ 保留 ┃ 保留 ┃ 保留 ┃ 保留 ┃ 保留 ┃蜂鳴聲響┃鬧鐘告警┃時(shí)間更新┃
┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛
*/
static volatile Uint16 buzzer_alarm_counter=0; /* 蜂鳴器發(fā)出聲響次數(shù) */
static volatile BCD_TIME time=BCD_TIME_defaults; /* 系統(tǒng)時(shí)間結(jié)構(gòu)變量 */
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于控制蜂鳴器發(fā)出聲響告警的操作,設(shè)定蜂鳴器頻率為 2000Hz 。
備注: 蜂鳴器設(shè)置為相應(yīng)的控制引腳高電平時(shí),蜂鳴器發(fā)出聲響。
----------------------------------------------------------------------------*/
void Buzzer(void)
{
Buzzer_DDR |= Buzzer_PINNum; /* 設(shè)置蜂鳴器控制端口為輸出引腳 */
Buzzer_PORT |= Buzzer_PINNum; /* 打開蜂鳴器 */
delay_us(500); /* 延時(shí) 500us */
Buzzer_PORT &= ~Buzzer_PINNum; /* 關(guān)閉蜂鳴器 */
}
#ifdef MCU_No_ExtendedParallelBus /* 無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯 */
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于虛擬擴(kuò)展并行總線結(jié)構(gòu)的向外圍器件寫入數(shù)據(jù)操作。
函數(shù)入口參數(shù):AccessAddress ------ 訪問的外圍器件地址。
WriteData ---------- 寫入的數(shù)據(jù)。
備注: 本函數(shù)僅可訪問外圍器件的地址數(shù)不超過256個(gè)。
----------------------------------------------------------------------------*/
void VEPB_WriteData(volatile Uchar8 AccessAddress, volatile Uchar8 WriteData)
{
VEPB_AD_DDR = 0xFF; /* 設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向?yàn)檩敵?*/
VEPB_AD_PORT = AccessAddress; /* 寫入訪問的外圍器件地址到總線上 */
VEPB_ALE_PORT |= VEPB_ALE_PINNum; /* 地址鎖存到外圍器件 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_AD_PORT = WriteData; /* 寫入數(shù)據(jù) */
VEPB_WR_PORT &= ~VEPB_WR_PINNum; /* 使能寫入數(shù)據(jù) */
VEPB_WR_PORT |= VEPB_WR_PINNum;
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于虛擬擴(kuò)展并行總線結(jié)構(gòu)的從外圍器件讀取數(shù)據(jù)操作。
函數(shù)入口參數(shù):AccessAddress ------ 訪問的外圍器件地址。
函數(shù)出口參數(shù):讀取的數(shù)據(jù)。
備注: 本函數(shù)僅可訪問外圍器件的地址數(shù)不超過256個(gè)。
----------------------------------------------------------------------------*/
Uchar8 VEPB_ReadData(volatile Uchar8 AccessAddress)
{
volatile Uchar8 temp; /* 出口參數(shù)寄存器變量 */
VEPB_AD_DDR = 0xFF; /* 設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向?yàn)檩敵?*/
VEPB_AD_PORT = AccessAddress; /* 寫入訪問的外圍器件地址到總線上 */
VEPB_ALE_PORT |= VEPB_ALE_PINNum; /* 地址鎖存到外圍器件 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_AD_DDR = 0x00; /* 設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向?yàn)檩斎?*/
VEPB_AD_PORT = 0xFF; /* 使能虛擬總線地址/數(shù)據(jù)總線的上拉電阻 */
VEPB_RD_PORT &= ~VEPB_RD_PINNum; /* 使能讀取數(shù)據(jù) */
temp = VEPB_AD_PIN; /* 讀取數(shù)據(jù) */
temp = VEPB_AD_PIN; /* 加大讀取數(shù)據(jù)脈沖信號的寬度 */
VEPB_RD_PORT |= VEPB_RD_PINNum;
return (temp);
}
#endif /* "MCU_No_ExtendedParallelBus" 條件編譯結(jié)束 */
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于外部中斷請求0中斷向量的初始化操作。
備注: ①.本函數(shù)僅在主函數(shù)中調(diào)用一次即可。
②.要使能中斷還必須在主程序中打開全局中斷使能功能,推薦其指令如下:
SREG |= BIT7; / * 使能全局中斷 * /
----------------------------------------------------------------------------*/
void external_INT0_initialization(void)
{
#ifdef _MEGA16_INCLUDED_ /* 目標(biāo)器件芯片為 ATMega16 的條件編譯 */
MCUCR &= ~BIT0; /* 設(shè)置外部中斷請求0的觸發(fā)方式為:下降沿觸發(fā) */
MCUCR |= BIT1;
GICR |= BIT6; /* 使能外部中斷請求0 */
GIFR |= BIT6; /* 外部中斷請求0標(biāo)志位清零 */
#endif /* "_MEGA16_INCLUDED_" 條件編譯結(jié)束 */
#ifdef _MEGA128_INCLUDED_ /* 目標(biāo)器件芯片為 ATMega128 的條件編譯 */
EICRA &= ~BIT0; /* 設(shè)置外部中斷請求0的觸發(fā)方式為:下降沿觸發(fā) */
EICRA |= BIT1;
EIMSK |= BIT0; /* 使能外部中斷請求0 */
EIFR |= BIT6; /* 外部中斷請求0標(biāo)志位清零 */
#endif /* "_MEGA128_INCLUDED_" 條件編譯結(jié)束 */
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于 DS12887 鬧鐘中斷請求和更新周期結(jié)束中斷請求處理的中斷服務(wù)程序。
備注: ①.注意:由于本函數(shù)為中斷函數(shù),故在調(diào)用和返回時(shí)無法進(jìn)行明式數(shù)值傳遞,
因此將在函數(shù)體中隱式修改下面這幾個(gè)全局靜態(tài)變量數(shù)值。
⑴.時(shí)間消息的任務(wù)變量(tasks_time),用以通知系統(tǒng)執(zhí)行相應(yīng)的處理操作。
⑵.系統(tǒng)時(shí)間結(jié)構(gòu)變量(time),從 DS12887 中讀取更新的系統(tǒng)時(shí)間數(shù)值。
②.本函數(shù)需在設(shè)置的 DS12887 中斷請求的中斷向量函數(shù)中調(diào)用。在調(diào)用之前
需對該中斷向量進(jìn)行初始化,以使能該中斷。例:如使用外部中斷請求0,
可使用上面提供的 external_INT0_initialization() 函數(shù)進(jìn)行初始化,
而將本本函數(shù)放在外部中斷請求0服務(wù)程序中。
----------------------------------------------------------------------------*/
void DS12887_INT_ISR(void)
{
register Uchar8 temp; /* 臨時(shí)寄存器變量 */
register Uchar8 temp2; /* 臨時(shí)寄存器變量2 */
DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片選控制引腳為L */
#ifdef MCU_No_ExtendedParallelBus /* 無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯 */
/* 讀取 DS12887 寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,訪問該寄存器后將自動清零所有
標(biāo)志位,否則芯片將無法產(chǎn)生下一次中斷請求。其次可對讀取的中斷標(biāo)志位進(jìn)行判斷。 */
temp = VEPB_ReadData(DS12887_REG_C);
#else
temp = DS12887_REG_C;
#endif /* "MCU_No_ExtendedParallelBus" 條件編譯結(jié)束 */
temp2 = temp;
/* 檢查是否為鬧鐘中斷?是,則通知系統(tǒng)對鬧鐘請求執(zhí)行相應(yīng)的處理 */
if ((temp&BIT5)==BIT5)
{
tasks_time |= BIT1; /* 鬧鐘告警消息任務(wù)位置位 */
}
/* 檢查是否為更新周期結(jié)束中斷?是,則通知系統(tǒng)對更新周期結(jié)束請求執(zhí)行相應(yīng)的處理 */
if ((temp2&BIT4)==BIT4)
{
/* 讀取 DS12887 中更新的系統(tǒng)時(shí)間數(shù)值 */
#ifdef MCU_No_ExtendedParallelBus /* 無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯 */
time.BCD_Second = VEPB_ReadData(DS12887_Second);
time.BCD_Minute = VEPB_ReadData(DS12887_Minute);
time.BCD_Hour = VEPB_ReadData(DS12887_Hour);
time.BCD_Date = VEPB_ReadData(DS12887_Date);
time.BCD_Month = VEPB_ReadData(DS12887_Month);
time.BCD_Year = VEPB_ReadData(DS12887_Year);
time.BCD_Year_H = VEPB_ReadData(DS12887_Year_H);
time.BCD_Week = VEPB_ReadData(DS12887_Week);
#else
time.BCD_Second = DS12887_Second;
time.BCD_Minute = DS12887_Minute;
time.BCD_Hour = DS12887_Hour;
time.BCD_Date = DS12887_Date;
time.BCD_Month = DS12887_Month;
time.BCD_Year = DS12887_Year;
time.BCD_Year_H = DS12887_Year_H;
time.BCD_Week = DS12887_Week;
#endif /* "MCU_No_ExtendedParallelBus" 條件編譯結(jié)束 */
tasks_time |= BIT0; /* 時(shí)間更新消息任務(wù)位置位 */
}
DS12887_CS_PORT |= DS12887_CS_PINNum;/* 置 DS12887 片選控制引腳為H */
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于 DS12887 的各控制輸入/輸出引腳定義和初始狀態(tài)設(shè)置的初始化操作。
備注: 本函數(shù)僅在主函數(shù)中調(diào)用一次即可。
----------------------------------------------------------------------------*/
void RTC_DS12887_initialization(void)
{
register Uchar8 temp; /* 臨時(shí)寄存器變量 */
/* 下面這些語句用于設(shè)置 DS12887 的各控制引腳與MCU的連接定義和初始狀態(tài) */
DS12887_CS_DDR |= DS12887_CS_PINNum; /* 設(shè)置 DS12887 片選控制為輸出引腳 */
DS12887_CS_PORT |= DS12887_CS_PINNum; /* 置 DS12887 片選控制引腳為H */
DS12887_IRQ_DDR &= ~DS12887_IRQ_PINNum;/* 設(shè)置 DS12887 中斷請求為輸入引腳 */
DS12887_IRQ_PORT |= DS12887_IRQ_PINNum;/* 使能 DS12887 中斷請求引腳的上拉電阻 */
#ifdef MCU_No_ExtendedParallelBus /* 無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯 */
VEPB_ALE_DDR |= VEPB_ALE_PINNum; /* 設(shè)置虛擬總線控制線地址鎖存使能為輸出引腳 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_WR_DDR |= VEPB_WR_PINNum; /* 設(shè)置虛擬總線控制線寫使能信號為輸出引腳 */
VEPB_WR_PORT |= VEPB_WR_PINNum;
VEPB_RD_DDR |= VEPB_RD_PINNum; /* 設(shè)置虛擬總線控制線讀鎖存信號為輸出引腳 */
VEPB_RD_PORT |= VEPB_RD_PINNum;
VEPB_AD_DDR = 0x00; /* 設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向?yàn)檩斎?*/
VEPB_AD_PORT = 0xFF; /* 使能虛擬總線地址/數(shù)據(jù)總線的上拉電阻 */
#else
MCUCR |= BIT7; /* 使能外部存儲器接口 */
#endif /* "MCU_No_ExtendedParallelBus" 條件編譯結(jié)束 */
/* 下面這些語句用于 DS12887 初始化操作 */
DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片選控制引腳為L */
#ifdef MCU_No_ExtendedParallelBus /* 無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯 */
/* 啟動晶體振蕩器,關(guān)閉周期中斷方波輸出 */
VEPB_WriteData(DS12887_REG_A, 0x20);
/* 芯片處于正常工作狀態(tài)、允許更新周期結(jié)束中斷、鬧鐘中斷保持原設(shè)置狀態(tài)、
關(guān)閉周期中斷、關(guān)閉方波輸出、采用 BCD 碼數(shù)據(jù)格式和 24 小時(shí)制模式 */
temp = VEPB_ReadData(DS12887_REG_B);
temp &= 0x32;
temp |= 0x12;
VEPB_WriteData(DS12887_REG_B, temp);
/* 檢查內(nèi)置電池能量狀態(tài)?如果電池耗盡,系統(tǒng)將進(jìn)行告警 */
temp = VEPB_ReadData(DS12887_REG_D);
if ((temp&BIT7)==0)
{
Buzzer();
}
/* 寫入年前兩位數(shù)據(jù)為 20 */
VEPB_WriteData(DS12887_Year_H, 0x20);
/* 讀取 DS12887 寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,使該寄存器清零所有標(biāo)志位 */
temp = VEPB_ReadData(DS12887_REG_C);
#else
/* 啟動晶體振蕩器,關(guān)閉周期中斷方波輸出 */
DS12887_REG_A = 0x20;
/* 芯片處于正常工作狀態(tài)、允許更新周期結(jié)束中斷、關(guān)閉周期中斷和鬧鐘中斷、
關(guān)閉方波輸出、采用 BCD 碼數(shù)據(jù)格式和 24 小時(shí)制模式 */
temp = DS12887_REG_B;
temp &= 0x32;
temp |= 0x12;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -