實時時鐘芯片 DS12887 接口驅(qū)動程序
****************************************************************************************
源程序文件名:RTC_DS12887.C
源程序名稱:實時時鐘芯片DS12887接口驅(qū)動的源程序文件
程序版本: 1.0
程序功能:
本程序是用ATmega16控制實時時鐘芯片DS12887接口驅(qū)動的源程序文件。
程序說明:
函數(shù)入口參數(shù):
函數(shù)出口參數(shù):
編譯工具軟件:CodeVisionAVRC版本:1.24.6以上
鏈接子程序文件:
編作者:磊元
編作者E-Mail:PTZSW@163.COM
編制日期:2005年5月22日
------------------------------------------------------------------------------
適用器件芯片類型:Atmel公司生產(chǎn)的8位RISC單片機
器件芯片時鐘頻率:
存儲器模式:小存儲器模式
外部擴展存儲器大小:0【字節(jié)】
數(shù)據(jù)堆棧大?。?56【字節(jié)】
------------------------------------------------------------------------------
源程序版本歷史:
2005年5月22日--------版本1.0:發(fā)行版本
****************************************************************************************
*/
/*======================================================================================
本源程序包括的頭部文件
======================================================================================*/
#include"LCDM_Day_Time.h"/*包含在液晶上顯示日期和時間信息的頭部文件*/
#include"RTC_DS12887.h"/*本程序的頭部文件*/
/*======================================================================================
程序指令代碼清單
======================================================================================*/
/*----------------------------------------------------------------------------
全局靜態(tài)變量定義:
----------------------------------------------------------------------------*/
staticvolatileUchar8tasks_time=0;/*時間消息的任務(wù)變量*/
/*時間消息的任務(wù)變量的各位定義如下:
┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓
┃BIT7┃BIT6┃BIT5┃BIT4┃BIT3┃BIT2┃BIT1┃BIT0┃
┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫
┃保留┃保留┃保留┃保留┃保留┃蜂鳴聲響┃鬧鐘告警┃時間更新┃
┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛
*/
staticvolatileUint16buzzer_alarm_counter=0;/*蜂鳴器發(fā)出聲響次數(shù)*/
staticvolatileBCD_TIMEtime=BCD_TIME_defaults;/*系統(tǒng)時間結(jié)構(gòu)變量*/
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于控制蜂鳴器發(fā)出聲響告警的操作,設(shè)定蜂鳴器頻率為2000Hz。
備注:蜂鳴器設(shè)置為相應(yīng)的控制引腳高電平時,蜂鳴器發(fā)出聲響。
----------------------------------------------------------------------------*/
voidBuzzer(void)
{
Buzzer_DDR|=Buzzer_PINNum;/*設(shè)置蜂鳴器控制端口為輸出引腳*/
Buzzer_PORT|=Buzzer_PINNum;/*打開蜂鳴器*/
delay_us(500);/*延時500us*/
Buzzer_PORT&=~Buzzer_PINNum;/*關(guān)閉蜂鳴器*/
}
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于虛擬擴展并行總線結(jié)構(gòu)的向外圍器件寫入數(shù)據(jù)操作。
函數(shù)入口參數(shù):AccessAddress------訪問的外圍器件地址。
WriteData----------寫入的數(shù)據(jù)。
備注:本函數(shù)僅可訪問外圍器件的地址數(shù)不超過256個。
----------------------------------------------------------------------------*/
voidVEPB_WriteData(volatileUchar8AccessAddress,volatileUchar8WriteData)
{
VEPB_AD_DDR=0xFF;/*設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向為輸出*/
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ù)用于虛擬擴展并行總線結(jié)構(gòu)的從外圍器件讀取數(shù)據(jù)操作。
函數(shù)入口參數(shù):AccessAddress------訪問的外圍器件地址。
函數(shù)出口參數(shù):讀取的數(shù)據(jù)。
備注:本函數(shù)僅可訪問外圍器件的地址數(shù)不超過256個。
----------------------------------------------------------------------------*/
Uchar8VEPB_ReadData(volatileUchar8AccessAddress)
{
volatileUchar8temp;/*出口參數(shù)寄存器變量*/
VEPB_AD_DDR=0xFF;/*設(shè)置虛擬總線地址/數(shù)據(jù)總線的數(shù)據(jù)方向為輸出*/
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ù)方向為輸入*/
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;/*使能全局中斷*/
----------------------------------------------------------------------------*/
voidexternal_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ù)值傳遞,
因此將在函數(shù)體中隱式修改下面這幾個全局靜態(tài)變量數(shù)值。
⑴.時間消息的任務(wù)變量(tasks_time),用以通知系統(tǒng)執(zhí)行相應(yīng)的處理操作。
⑵.系統(tǒng)時間結(jié)構(gòu)變量(time),從DS12887中讀取更新的系統(tǒng)時間數(shù)值。
②.本函數(shù)需在設(shè)置的DS12887中斷請求的中斷向量函數(shù)中調(diào)用。在調(diào)用之前
需對該中斷向量進行初始化,以使能該中斷。例:如使用外部中斷請求0,
可使用上面提供的external_INT0_initialization()函數(shù)進行初始化,
而將本本函數(shù)放在外部中斷請求0服務(wù)程序中。
----------------------------------------------------------------------------*/
voidDS12887_INT_ISR(void)
{
registerUchar8temp;/*臨時寄存器變量*/
registerUchar8temp2;/*臨時寄存器變量2*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*讀取DS12887寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,訪問該寄存器后將自動清零所有
標(biāo)志位,否則芯片將無法產(chǎn)生下一次中斷請求。其次可對讀取的中斷標(biāo)志位進行判斷。*/
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ù)值*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
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;/*時間更新消息任務(wù)位置位*/
}
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于DS12887的各控制輸入/輸出引腳定義和初始狀態(tài)設(shè)置的初始化操作。
備注:本函數(shù)僅在主函數(shù)中調(diào)用一次即可。
----------------------------------------------------------------------------*/
voidRTC_DS12887_initialization(void)
{
registerUchar8temp;/*臨時寄存器變量*/
/*下面這些語句用于設(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中斷請求引腳的上拉電阻*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
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ù)方向為輸入*/
VEPB_AD_PORT=0xFF;/*使能虛擬總線地址/數(shù)據(jù)總線的上拉電阻*/
#else
MCUCR|=BIT7;/*使能外部存儲器接口*/
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
/*下面這些語句用于DS12887初始化操作*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*啟動晶體振蕩器,關(guān)閉周期中斷方波輸出*/
VEPB_WriteData(DS12887_REG_A,0x20);
/*芯片處于正常工作狀態(tài)、允許更新周期結(jié)束中斷、鬧鐘中斷保持原設(shè)置狀態(tài)、
關(guān)閉周期中斷、關(guān)閉方波輸出、采用BCD碼數(shù)據(jù)格式和24小時制模式*/
temp=VEPB_ReadData(DS12887_REG_B);
temp&=0x32;
temp|=0x12;
VEPB_WriteData(DS12887_REG_B,temp);
/*檢查內(nèi)置電池能量狀態(tài)?如果電池耗盡,系統(tǒng)將進行告警*/
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小時制模式*/
temp=DS12887_REG_B;
temp&=0x32;
temp|=0x12;
DS12887_REG_B=temp;
/*檢查內(nèi)置電池能量狀態(tài)?如果電池耗盡,系統(tǒng)將進行告警*/
temp=DS12887_REG_D;
if((temp&BIT7)==0)
{
Buzzer();
}
/*寫入年前兩位數(shù)據(jù)為20*/
DS12887_Year_H=0x20;
/*讀取DS12887寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,使該寄存器清零所有標(biāo)志位*/
temp=DS12887_REG_C;
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于修改設(shè)置DS12887各個時標(biāo)寄存器的時間數(shù)值(BCD碼)操作。
函數(shù)入口參數(shù):SET_BCD_Year_H------設(shè)置的年前兩位時間數(shù)值(BCD碼)。
SET_BCD_Year--------設(shè)置的年時間數(shù)值(BCD碼)。
SET_BCD_Month-------設(shè)置的月份時間數(shù)值(BCD碼)。
SET_BCD_Date--------設(shè)置的日期時間數(shù)值(BCD碼)。
SET_BCD_Hour--------設(shè)置的小時時間數(shù)值(BCD碼)。
SET_BCD_Minute------設(shè)置的分鐘時間數(shù)值(BCD碼)。
SET_BCD_Second------設(shè)置的秒時間數(shù)值(BCD碼)。
SET_BCD_Week--------設(shè)置的星期時間數(shù)值(BCD碼)。
備注:
----------------------------------------------------------------------------*/
voidSET_DS12887_TimeRegister(volatileUchar8SET_BCD_Year_H,/*年前兩位*/
volatileUchar8SET_BCD_Year,/*年*/
volatileUchar8SET_BCD_Month,/*月份*/
volatileUchar8SET_BCD_Date,/*日期*/
volatileUchar8SET_BCD_Hour,/*小時*/
volatileUchar8SET_BCD_Minute,/*分鐘*/
volatileUchar8SET_BCD_Second,/*秒*/
volatileUchar8SET_BCD_Week)/*星期*/
{
registerUchar8temp;/*臨時寄存器變量*/
registerUchar8temp2;/*臨時寄存器變量2*/
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*使芯片處于禁止更新狀態(tài)、其他設(shè)置保持原來狀態(tài)*/
temp2=VEPB_ReadData(DS12887_REG_B);
temp=VEPB_ReadData(DS12887_REG_B);
temp|=BIT7;
VEPB_WriteData(DS12887_REG_B,temp);
VEPB_WriteData(DS12887_Year_H,SET_BCD_Year_H);/*寫入年前兩位數(shù)據(jù)*/
VEPB_WriteData(DS12887_Year,SET_BCD_Year);/*寫入年數(shù)據(jù)*/
VEPB_WriteData(DS12887_Month,SET_BCD_Month);/*寫入月份數(shù)據(jù)*/
VEPB_WriteData(DS12887_Date,SET_BCD_Date);/*寫入日期數(shù)據(jù)*/
VEPB_WriteData(DS12887_Hour,SET_BCD_Hour);/*寫入小時數(shù)據(jù)*/
VEPB_WriteData(DS12887_Minute,SET_BCD_Minute);/*寫入分鐘數(shù)據(jù)*/
VEPB_WriteData(DS12887_Second,SET_BCD_Second);/*寫入秒數(shù)據(jù)*/
VEPB_WriteData(DS12887_Week,SET_BCD_Week);/*寫入星期數(shù)據(jù)*/
/*讀取DS12887寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,使該寄存器清零所有標(biāo)志位*/
temp=VEPB_ReadData(DS12887_REG_C);
/*使芯片處于正常工作狀態(tài)、其他設(shè)置保持原來狀態(tài)*/
temp2&=~BIT7;
VEPB_WriteData(DS12887_REG_B,temp2);
#else
/*使芯片處于禁止更新狀態(tài)、其他設(shè)置保持原來狀態(tài)*/
temp2=DS12887_REG_B;
temp=DS12887_REG_B;
temp|=BIT7;
DS12887_REG_B=temp;
DS12887_Year_H=SET_BCD_Year_H;/*寫入年前兩位數(shù)據(jù)*/
DS12887_Year=SET_BCD_Year;/*寫入年數(shù)據(jù)*/
DS12887_Month=SET_BCD_Month;/*寫入月份數(shù)據(jù)*/
DS12887_Date=SET_BCD_Date;/*寫入日期數(shù)據(jù)*/
DS12887_Hour=SET_BCD_Hour;/*寫入小時數(shù)據(jù)*/
DS12887_Minute=SET_BCD_Minute;/*寫入分鐘數(shù)據(jù)*/
DS12887_Second=SET_BCD_Second;/*寫入秒數(shù)據(jù)*/
DS12887_Week=SET_BCD_Week;/*寫入星期數(shù)據(jù)*/
/*讀取DS12887寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,使該寄存器清零所有標(biāo)志位*/
temp=DS12887_REG_C;
/*使芯片處于正常工作狀態(tài)、其他設(shè)置保持原來狀態(tài)*/
temp2&=~BIT7;
DS12887_REG_B=temp2;
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
SREG|=BIT7;/*使能全局中斷*/
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于控制DS12887鬧鐘打開/關(guān)閉的操作。
函數(shù)入口參數(shù):AC_status------僅可取二個值ON或OFF中的一個。
----------------------------------------------------------------------------*/
voidDS12887_AlarmClock(Uchar8AC_status)
{
registerUchar8temp;/*臨時寄存器變量*/
if(AC_status==ON)
{
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*設(shè)置允許鬧鐘中斷、其他設(shè)置保持原來狀態(tài)*/
temp=VEPB_ReadData(DS12887_REG_B);
temp|=BIT5;
VEPB_WriteData(DS12887_REG_B,temp);
#else
/*設(shè)置允許鬧鐘中斷、其他設(shè)置保持原來狀態(tài)*/
temp=DS12887_REG_B;
temp|=BIT5;
DS12887_REG_B=temp;
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
SREG|=BIT7;/*使能全局中斷*/
}
if(AC_status==OFF)
{
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
/*設(shè)置禁止鬧鐘中斷、其他設(shè)置保持原來狀態(tài)*/
temp=VEPB_ReadData(DS12887_REG_B);
temp&=~BIT5;
VEPB_WriteData(DS12887_REG_B,temp);
#else
/*設(shè)置禁止鬧鐘中斷、其他設(shè)置保持原來狀態(tài)*/
temp=DS12887_REG_B;
temp&=~BIT5;
DS12887_REG_B=temp;
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
SREG|=BIT7;/*使能全局中斷*/
}
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于設(shè)置DS12887鬧鐘各個時標(biāo)寄存器的時間數(shù)值(BCD碼)操作。
函數(shù)入口參數(shù):SET_BCD_HouAlm------設(shè)置的分鐘鬧鐘時間數(shù)值(BCD碼)。
SET_BCD_MinAlm------設(shè)置的小時鬧鐘時間數(shù)值(BCD碼)。
備注:①.設(shè)置DS12887鬧鐘各個時標(biāo)寄存器的時間數(shù)值后,將打開鬧鐘告警中斷。
②.本函數(shù)將秒鬧鐘時間數(shù)值自動設(shè)置為0秒。
----------------------------------------------------------------------------*/
voidSET_DS12887_AlarmClock(Uchar8SET_BCD_HouAlm,Uchar8SET_BCD_MinAlm)
{
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴展并行總線結(jié)構(gòu)單片機的條件編譯*/
VEPB_WriteData(DS12887_HouAlm,SET_BCD_HouAlm);/*寫入小時鬧鐘數(shù)據(jù)*/
VEPB_WriteData(DS12887_MinAlm,SET_BCD_MinAlm);/*寫入分鐘鬧鐘數(shù)據(jù)*/
VEPB_WriteData(DS12887_SecAlm,0x00);/*寫入秒鬧鐘數(shù)據(jù)*/
#else
DS12887_HouAlm=SET_BCD_HouAlm;/*寫入小時鬧鐘數(shù)據(jù)*/
DS12887_MinAlm=SET_BCD_MinAlm;/*寫入分鐘鬧鐘數(shù)據(jù)*/
DS12887_SecAlm=0x00;/*寫入秒鬧鐘數(shù)據(jù)*/
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
DS12887_CS_PORT|=DS12887_CS_PINNum;/*置DS12887片選控制引腳為H*/
DS12887_AlarmClock(ON);/*打開鬧鐘告警中斷*/
SREG|=BIT7;/*使能全局中斷*/
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于鬧鐘告警中斷的任務(wù)時間消息處理操作。
函數(shù)入口參數(shù):BAC_number------蜂鳴器發(fā)出聲響次數(shù)值。
本函數(shù)還將在函數(shù)體中檢查隱含的全局靜態(tài)變量參數(shù)變量tasks_time
(時間消息的任務(wù))位1的布爾值而執(zhí)行發(fā)出聲響告警操作。
備注:①.本函數(shù)需要放在主函數(shù)的不間斷循環(huán)體中運行。
②.本函數(shù)在執(zhí)行過程中將修改tasks_time(時間消息的任務(wù))變量的位1
和位2,與buzzer_alarm_counte(蜂鳴器發(fā)出聲響次數(shù))變量的數(shù)值。
----------------------------------------------------------------------------*/
voidTasks_AlarmClock(Uint16BAC_number)
{
registerUchar8temp;/*臨時寄存器變量*/
registerUint16temp_2;/*臨時雙寄存器變量*/
temp=tasks_time;
/*如果鬧鐘告警消息任務(wù)位置位,將執(zhí)行發(fā)出聲響告警操作*/
if((temp&BIT1)==BIT1)
{
temp=tasks_time;
if((temp&BIT2)==BIT2)
{
temp_2=buzzer_alarm_counter;
if(temp_2!=0x0000)
{
Buzzer();/*蜂鳴器發(fā)出一聲聲響*/
buzzer_alarm_counter--;/*蜂鳴器發(fā)出聲響次數(shù)-1*/
LCDM_BackgroundLight(ON);
delay_ms(300);
LCDM_BackgroundLight(OFF);
Buzzer();/*蜂鳴器發(fā)出一聲聲響*/
delay_ms(200);
}
else
{
tasks_time&=~BIT2;/*蜂鳴聲響消息任務(wù)位清零*/
tasks_time&=~BIT1;/*鬧鐘告警消息任務(wù)位清零*/
}
}
else
{
buzzer_alarm_counter=BAC_number;/*置蜂鳴器發(fā)出聲響次數(shù)值*/
tasks_time|=BIT2;/*蜂鳴聲響消息任務(wù)位置位*/
}
}
}
/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于時間更新中斷的任務(wù)時間消息處理操作。
函數(shù)入口參數(shù):LCDM_ShowMode---在液晶上顯示日期和時間的點陣字符樣式選擇值。
共有下列兩種選擇值和點陣字符樣式供選擇:
入口參數(shù)=8:8×16點陣字符樣式。
入口參數(shù)=16:16×16點陣字符樣式。
本函數(shù)還將在函數(shù)體中檢查隱含的全局靜態(tài)變量參數(shù)變量tasks_time
(時間消息的任務(wù))位0的布爾值而執(zhí)行時間更新操作。
備注:①.本函數(shù)需要放在主函數(shù)的不間斷循環(huán)體中運行。
②.本函數(shù)在執(zhí)行過程中將修改tasks_time(時間消息的任務(wù))變量的位0。
----------------------------------------------------------------------------*/
voidTasks_TimeUpdate(Uchar8LCDM_ShowMode)
{
registerUchar8temp;/*臨時寄存器變量*/
temp=tasks_time;
/*如果更新中斷消息任務(wù)位置位,將執(zhí)行相應(yīng)的更新處理操作*/
if((temp&BIT0)==BIT0)
{
switch(LCDM_ShowMode)
{
case8:
LCDM_DayTime_Show_8_16(&time);/*在液晶上顯示8×16字符的日期和時間*/
break;
case16:
LCDM_DayTime_Show_16_16(&time);/*在液晶上顯示16×16字符的日期和時間*/
break;
default:
LCDM_DayTime_Show_8_16(&time);/*在液晶上顯示8×16字符的日期和時間*/
}
tasks_time&=~BIT0;/*時間更新消息任務(wù)位清零*/
}
}
/*
****************************************************************************************
本C語言源程序文件到此結(jié)束
****************************************************************************************
*/
interrupt[EXT_INT0]voidext_int0_isr(void)
{
DS12887_INT_ISR();
}
voidmain(void)
{
LCDM_initialization();
external_INT0_initialization();
RTC_DS12887_initialization();
SREG|=BIT7;/*使能全局中斷*/
//SET_DS12887_TimeRegister(0x20,0x05,0x05,0x31,0x22,0x51,0x00,0x03);
SET_DS12887_AlarmClock(0x11,0x12);
while(1)
{
Tasks_TimeUpdate(16);
Tasks_AlarmClock(0x0088);
};
}