當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]**************************************************************************************** 源程序文件名:RTC_DS12887.C 源程序名稱:實(shí)時(shí)時(shí)鐘芯片DS12887接口驅(qū)動(dòng)的源程序文件 程序版本:  1.0 程序功能:

****************************************************************************************
源程序文件名:RTC_DS12887.C
源程序名稱:實(shí)時(shí)時(shí)鐘芯片DS12887接口驅(qū)動(dòng)的源程序文件
程序版本:  1.0
程序功能:
    本程序是用ATmega16控制實(shí)時(shí)時(shí)鐘芯片DS12887接口驅(qū)動(dòng)的源程序文件。
程序說明:
    
函數(shù)入口參數(shù):
函數(shù)出口參數(shù):

編譯工具軟件:CodeVisionAVRC版本:1.24.6以上
鏈接子程序文件:

編作者:磊元
編作者E-Mail:PTZSW@163.COM
編制日期:2005年5月22日
------------------------------------------------------------------------------
適用器件芯片類型:Atmel公司生產(chǎn)的8位RISC單片機(jī)
器件芯片時(shí)鐘頻率:
存儲(chǔ)器模式:小存儲(chǔ)器模式
外部擴(kuò)展存儲(chǔ)器大?。?【字節(jié)】
數(shù)據(jù)堆棧大?。?56【字節(jié)】
------------------------------------------------------------------------------
源程序版本歷史:
2005年5月22日--------版本1.0:發(fā)行版本
****************************************************************************************
*/


/*======================================================================================
              本源程序包括的頭部文件
======================================================================================*/
#include"LCDM_Day_Time.h"/*包含在液晶上顯示日期和時(shí)間信息的頭部文件*/
#include"RTC_DS12887.h"/*本程序的頭部文件*/


/*======================================================================================
 程序指令代碼清單
======================================================================================*/
/*----------------------------------------------------------------------------
全局靜態(tài)變量定義:
----------------------------------------------------------------------------*/
staticvolatileUchar8tasks_time=0;/*時(shí)間消息的任務(wù)變量*/
/*時(shí)間消息的任務(wù)變量的各位定義如下:
┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓
┃BIT7┃BIT6┃BIT5┃BIT4┃BIT3┃BIT2┃BIT1┃BIT0┃
┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫
┃保留┃保留┃保留┃保留┃保留┃蜂鳴聲響┃鬧鐘告警┃時(shí)間更新┃
┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛
*/
staticvolatileUint16buzzer_alarm_counter=0;/*蜂鳴器發(fā)出聲響次數(shù)*/
staticvolatileBCD_TIMEtime=BCD_TIME_defaults;/*系統(tǒng)時(shí)間結(jié)構(gòu)變量*/


/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于控制蜂鳴器發(fā)出聲響告警的操作,設(shè)定蜂鳴器頻率為2000Hz。
備注:蜂鳴器設(shè)置為相應(yīng)的控制引腳高電平時(shí),蜂鳴器發(fā)出聲響。
----------------------------------------------------------------------------*/
voidBuzzer(void)
{
Buzzer_DDR|=Buzzer_PINNum;/*設(shè)置蜂鳴器控制端口為輸出引腳*/
Buzzer_PORT|=Buzzer_PINNum;/*打開蜂鳴器*/
delay_us(500);/*延時(shí)500us*/
Buzzer_PORT&=~Buzzer_PINNum;/*關(guān)閉蜂鳴器*/
}

#ifdefMCU_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è)。
----------------------------------------------------------------------------*/
voidVEPB_WriteData(volatileUchar8AccessAddress,volatileUchar8WriteData)
{
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è)。
----------------------------------------------------------------------------*/
Uchar8VEPB_ReadData(volatileUchar8AccessAddress)
{
volatileUchar8temp;/*出口參數(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ù)脈沖信號(hào)的寬度*/
VEPB_RD_PORT|=VEPB_RD_PINNum;
return(temp);
}
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/

/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于外部中斷請(qǐng)求0中斷向量的初始化操作。
備注:①.本函數(shù)僅在主函數(shù)中調(diào)用一次即可。
②.要使能中斷還必須在主程序中打開全局中斷使能功能,推薦其指令如下:
SREG|=BIT7;/*使能全局中斷*/
----------------------------------------------------------------------------*/
voidexternal_INT0_initialization(void)
{
#ifdef_MEGA16_INCLUDED_/*目標(biāo)器件芯片為ATMega16的條件編譯*/
MCUCR&=~BIT0;/*設(shè)置外部中斷請(qǐng)求0的觸發(fā)方式為:下降沿觸發(fā)*/
MCUCR|=BIT1;
GICR|=BIT6;/*使能外部中斷請(qǐng)求0*/
GIFR|=BIT6;/*外部中斷請(qǐng)求0標(biāo)志位清零*/
#endif/*"_MEGA16_INCLUDED_"條件編譯結(jié)束*/

#ifdef_MEGA128_INCLUDED_/*目標(biāo)器件芯片為ATMega128的條件編譯*/
EICRA&=~BIT0;/*設(shè)置外部中斷請(qǐng)求0的觸發(fā)方式為:下降沿觸發(fā)*/
EICRA|=BIT1;
EIMSK|=BIT0;/*使能外部中斷請(qǐng)求0*/
EIFR|=BIT6;/*外部中斷請(qǐng)求0標(biāo)志位清零*/
#endif/*"_MEGA128_INCLUDED_"條件編譯結(jié)束*/
}

/*----------------------------------------------------------------------------
函數(shù)功能:本函數(shù)用于DS12887鬧鐘中斷請(qǐng)求和更新周期結(jié)束中斷請(qǐng)求處理的中斷服務(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中斷請(qǐng)求的中斷向量函數(shù)中調(diào)用。在調(diào)用之前
需對(duì)該中斷向量進(jìn)行初始化,以使能該中斷。例:如使用外部中斷請(qǐng)求0,
可使用上面提供的external_INT0_initialization()函數(shù)進(jìn)行初始化,
而將本本函數(shù)放在外部中斷請(qǐng)求0服務(wù)程序中。
----------------------------------------------------------------------------*/
voidDS12887_INT_ISR(void)
{
registerUchar8temp;/*臨時(shí)寄存器變量*/
registerUchar8temp2;/*臨時(shí)寄存器變量2*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
/*讀取DS12887寄存器C(中斷標(biāo)志寄存器)的內(nèi)容,訪問該寄存器后將自動(dòng)清零所有
標(biāo)志位,否則芯片將無法產(chǎn)生下一次中斷請(qǐng)求。其次可對(duì)讀取的中斷標(biāo)志位進(jìn)行判斷。*/
temp=VEPB_ReadData(DS12887_REG_C);
#else
temp=DS12887_REG_C;
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/
temp2=temp;
/*檢查是否為鬧鐘中斷?是,則通知系統(tǒng)對(duì)鬧鐘請(qǐng)求執(zhí)行相應(yīng)的處理*/
if((temp&BIT5)==BIT5)
{
tasks_time|=BIT1;/*鬧鐘告警消息任務(wù)位置位*/
}
/*檢查是否為更新周期結(jié)束中斷?是,則通知系統(tǒng)對(duì)更新周期結(jié)束請(qǐng)求執(zhí)行相應(yīng)的處理*/
if((temp2&BIT4)==BIT4)
{
/*讀取DS12887中更新的系統(tǒng)時(shí)間數(shù)值*/
#ifdefMCU_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)用一次即可。
----------------------------------------------------------------------------*/
voidRTC_DS12887_initialization(void)
{
registerUchar8temp;/*臨時(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中斷請(qǐng)求為輸入引腳*/
DS12887_IRQ_PORT|=DS12887_IRQ_PINNum;/*使能DS12887中斷請(qǐng)求引腳的上拉電阻*/
#ifdefMCU_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è)置虛擬總線控制線寫使能信號(hào)為輸出引腳*/
VEPB_WR_PORT|=VEPB_WR_PINNum;
VEPB_RD_DDR|=VEPB_RD_PINNum;/*設(shè)置虛擬總線控制線讀鎖存信號(hào)為輸出引腳*/
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;/*使能外部存儲(chǔ)器接口*/
#endif/*"MCU_No_ExtendedParallelBus"條件編譯結(jié)束*/

/*下面這些語句用于DS12887初始化操作*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
/*啟動(dòng)晶體振蕩器,關(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
/*啟動(dòng)晶體振蕩器,關(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;
DS12887_REG_B=temp;
/*檢查內(nèi)置電池能量狀態(tài)?如果電池耗盡,系統(tǒng)將進(jìn)行告警*/
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各個(gè)時(shí)標(biāo)寄存器的時(shí)間數(shù)值(BCD碼)操作。
函數(shù)入口參數(shù):SET_BCD_Year_H------設(shè)置的年前兩位時(shí)間數(shù)值(BCD碼)。
SET_BCD_Year--------設(shè)置的年時(shí)間數(shù)值(BCD碼)。
SET_BCD_Month-------設(shè)置的月份時(shí)間數(shù)值(BCD碼)。
SET_BCD_Date--------設(shè)置的日期時(shí)間數(shù)值(BCD碼)。
SET_BCD_Hour--------設(shè)置的小時(shí)時(shí)間數(shù)值(BCD碼)。
SET_BCD_Minute------設(shè)置的分鐘時(shí)間數(shù)值(BCD碼)。
SET_BCD_Second------設(shè)置的秒時(shí)間數(shù)值(BCD碼)。
SET_BCD_Week--------設(shè)置的星期時(shí)間數(shù)值(BCD碼)。
備注:
----------------------------------------------------------------------------*/
voidSET_DS12887_TimeRegister(volatileUchar8SET_BCD_Year_H,/*年前兩位*/
volatileUchar8SET_BCD_Year,/*年*/
volatileUchar8SET_BCD_Month,/*月份*/
volatileUchar8SET_BCD_Date,/*日期*/
volatileUchar8SET_BCD_Hour,/*小時(shí)*/
volatileUchar8SET_BCD_Minute,/*分鐘*/
volatileUchar8SET_BCD_Second,/*秒*/
volatileUchar8SET_BCD_Week)/*星期*/
{
registerUchar8temp;/*臨時(shí)寄存器變量*/
registerUchar8temp2;/*臨時(shí)寄存器變量2*/
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
/*使芯片處于禁止更新狀態(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í)數(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í)數(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------僅可取二個(gè)值ON或OFF中的一個(gè)。
----------------------------------------------------------------------------*/
voidDS12887_AlarmClock(Uchar8AC_status)
{
registerUchar8temp;/*臨時(shí)寄存器變量*/
if(AC_status==ON)
{
SREG&=~BIT7;/*關(guān)閉全局中斷*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片選控制引腳為L*/
#ifdefMCU_No_ExtendedParallelBus/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
/*設(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/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
/*設(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鬧鐘各個(gè)時(shí)標(biāo)寄存器的時(shí)間數(shù)值(BCD碼)操作。
函數(shù)入口參數(shù):SET_BCD_HouAlm------設(shè)置的分鐘鬧鐘時(shí)間數(shù)值(BCD碼)。
SET_BCD_MinAlm------設(shè)置的小時(shí)鬧鐘時(shí)間數(shù)值(BCD碼)。
備注:①.設(shè)置DS12887鬧鐘各個(gè)時(shí)標(biāo)寄存器的時(shí)間數(shù)值后,將打開鬧鐘告警中斷。
②.本函數(shù)將秒鬧鐘時(shí)間數(shù)值自動(dòng)設(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/*無擴(kuò)展并行總線結(jié)構(gòu)單片機(jī)的條件編譯*/
VEPB_WriteData(DS12887_HouAlm,SET_BCD_HouAlm);/*寫入小時(shí)鬧鐘數(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í)鬧鐘數(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ù)入口參數(shù):BAC_number------蜂鳴器發(fā)出聲響次數(shù)值。
本函數(shù)還將在函數(shù)體中檢查隱含的全局靜態(tài)變量參數(shù)變量tasks_time
(時(shí)間消息的任務(wù))位1的布爾值而執(zhí)行發(fā)出聲響告警操作。
備注:①.本函數(shù)需要放在主函數(shù)的不間斷循環(huán)體中運(yùn)行。
②.本函數(shù)在執(zhí)行過程中將修改tasks_time(時(shí)間消息的任務(wù))變量的位1
和位2,與buzzer_alarm_counte(蜂鳴器發(fā)出聲響次數(shù))變量的數(shù)值。
----------------------------------------------------------------------------*/
voidTasks_AlarmClock(Uint16BAC_number)
{
registerUchar8temp;/*臨時(shí)寄存器變量*/
registerUint16temp_2;/*臨時(shí)雙寄存器變量*/
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ù)用于時(shí)間更新中斷的任務(wù)時(shí)間消息處理操作。
函數(shù)入口參數(shù):LCDM_ShowMode---在液晶上顯示日期和時(shí)間的點(diǎn)陣字符樣式選擇值。
共有下列兩種選擇值和點(diǎn)陣字符樣式供選擇:
入口參數(shù)=8:8×16點(diǎn)陣字符樣式。
入口參數(shù)=16:16×16點(diǎn)陣字符樣式。
本函數(shù)還將在函數(shù)體中檢查隱含的全局靜態(tài)變量參數(shù)變量tasks_time
(時(shí)間消息的任務(wù))位0的布爾值而執(zhí)行時(shí)間更新操作。
備注:①.本函數(shù)需要放在主函數(shù)的不間斷循環(huán)體中運(yùn)行。
②.本函數(shù)在執(zhí)行過程中將修改tasks_time(時(shí)間消息的任務(wù))變量的位0。
----------------------------------------------------------------------------*/
voidTasks_TimeUpdate(Uchar8LCDM_ShowMode)
{
registerUchar8temp;/*臨時(shí)寄存器變量*/
temp=tasks_time;
/*如果更新中斷消息任務(wù)位置位,將執(zhí)行相應(yīng)的更新處理操作*/
if((temp&BIT0)==BIT0)
{
switch(LCDM_ShowMode)
{
case8:
LCDM_DayTime_Show_8_16(&time);/*在液晶上顯示8×16字符的日期和時(shí)間*/
break;
case16:
LCDM_DayTime_Show_16_16(&time);/*在液晶上顯示16×16字符的日期和時(shí)間*/
break;
default:
LCDM_DayTime_Show_8_16(&time);/*在液晶上顯示8×16字符的日期和時(shí)間*/
}
tasks_time&=~BIT0;/*時(shí)間更新消息任務(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);
};
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉