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