南寧網(wǎng)絡(luò)推廣建站建站平臺有哪些
一、RTC簡介
RTC(Real Time Clock)即實時時鐘,它是一個可以為系統(tǒng)提供精確的時間基準(zhǔn)的元器件,RTC一般采用精度較高的晶振作為時鐘源,有些RTC為了在主電源掉電時還可以工作,需要外加電池供電
BCD碼,四位二進制表示一位十進制數(shù)
例如:
十進制數(shù):12,二進制位:1100, BCD碼:0001 0010
寄存器詳解
BCDSEC-BCDYEAR重點掌握,存儲實際時間
ALMSEC-ALMYEAR設(shè)置預(yù)期時間
RTCCON寄存器[0]位打開RTC控制,以便校準(zhǔn)時間
修改年,月,日,星期,時,分,秒
BCDDAY(日)寄存器和BCDWEEK(星期)寄存器手冊里面的地址寫反了,所以用的時候兩個對調(diào)使用,星期6就設(shè)置BCDDAY寄存器,15日就設(shè)置BCDWEEK寄存器
BCD碼的信息不可以直接使用%d打印,因為打印出來的值是十進制的數(shù)值,比如:0x023打印出來的值是35
interface.c
#include "exynos_4412.h"int main()
{unsigned int Oldsec = 0, Newsec = 0;/*使能RTC控制*/RTCCON = RTCCON | 1;/*校準(zhǔn)時間信息*/RTC.BCDYEAR = 0x023;RTC.BCDMON = 0x8;RTC.BCDDAY = 0x1;RTC.BCDWEEK = 0x15;RTC.BCDHOUR = 0x16;RTC.BCDMIN = 0x46;RTC.BCDSEC = 0x50;/*禁止RTC控制*/RTCCON = RTCCON & (~(1));while(1) {Newsec = RTC.BCDSEC;if(Oldsec != Newsec) {printf("20%x-%x-%x %x %x:%x:%x\n", RTC.BCDYEAR, RTC.BCDMON, RTC.BCDWEEK, RTC.BCDDAY, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);Oldsec = Newsec;}}return 0;
}
實驗小例子
1.編程實現(xiàn)通過LED狀態(tài)顯示當(dāng)前電壓范圍,并打印產(chǎn)生低壓警報時的時間
注: 電壓在1501mv~1800mv時,LED2、LED3、LED4、LED5點亮
電壓在1001mv~1500mv時,LED2、LED3、LED4點亮 電壓在501mv~1000mv時,LED2、LED3點亮
電壓在0mv~500mv時,LED2閃爍,且每隔一秒鐘向終端打印一次當(dāng)前的電壓值及當(dāng)前的時間
interface.c
#include "exynos_4412.h"/* 點亮LED2 */
#define LED2_ON (GPX2.DAT = GPX2.DAT | (1 << 7))/* 熄滅LED2 */
#define LED2_OFF (GPX2.DAT = GPX2.DAT & (~(1 << 7)))/* 點亮LED3 */
#define LED3_ON (GPX1.DAT = GPX1.DAT | 1)/* 熄滅LED3 */
#define LED3_OFF (GPX1.DAT = GPX1.DAT & (~ 1))/* 點亮LED4 */
#define LED4_ON (GPF3.DAT = GPF3.DAT | (1 << 4))/* 熄滅LED4 */
#define LED4_OFF (GPF3.DAT= GPF3.DAT & (~(1 << 4)))/* 點亮LED5 */
#define LED5_ON (GPF3.DAT = GPF3.DAT | (1 << 5))/* 熄滅LED5 */
#define LED5_OFF (GPF3.DAT = GPF3.DAT & (~ (1 << 5)))/*循環(huán)延時*/
void Delay(unsigned int Time) {while(Time--);
}/*初始化呢ADCCON寄存器*/
void ADC_CON(void) {/*將ADC的精度設(shè)置成 12bit*/ADCCON = ADCCON | (1 << 16);/*使能ADC的分頻器*/ADCCON = ADCCON | (1 << 14);/*設(shè)置ADC的分頻值, ADC的時鐘頻率 = PLCK/(19+1) = 5MHZ * ADC的轉(zhuǎn)換頻率 = 5MHZ / 5 = 1MHZ*/ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);/*關(guān)閉待機模式,使能正常模式*/ADCCON = ADCCON & (~(1 << 2));/*關(guān)閉讀使能通過轉(zhuǎn)換AD*/ADCCON = ADCCON & (~(1 << 1));/*選擇轉(zhuǎn)換通道 3通道*/ADCMUX = 3;
}int main()
{unsigned int AdcValue = 0;unsigned int Oldsec = 0, Newsec = 0;ADC_CON();GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);GPX1.CON = GPX1.CON & (~(0xF)) | (0x1);GPF3.CON = GPF3.CON & (~(0xFF << 16)) | (0x11 << 16);/*使能RTC控制*/RTCCON = RTCCON | 1;/*校準(zhǔn)時間信息*/RTC.BCDYEAR = 0x023;RTC.BCDMON = 0x8;RTC.BCDDAY = 0x1;RTC.BCDWEEK = 0x15;RTC.BCDHOUR = 0x16;RTC.BCDMIN = 0x46;RTC.BCDSEC = 0x50;/*禁止RTC控制*/RTCCON = RTCCON & (~(1));while(1) {/*開始轉(zhuǎn)換*/ADCCON = ADCCON | 1;/*等待轉(zhuǎn)換完成,因為轉(zhuǎn)換需要時間*/while(!(ADCCON & (1 << 15)));/*讀取轉(zhuǎn)換結(jié)果*/AdcValue = ADCDAT & 0xFFF;/*將結(jié)果轉(zhuǎn)換成實際的電壓值 mv 1800(mv) / (2^12-1) = 0.44*/AdcValue = AdcValue * 0.44;if(AdcValue >= 1501 && AdcValue <= 1800) {/*LED2 LED3 LED4 LED5 點亮*/LED2_ON;LED3_ON;LED4_ON;LED5_ON;} else if (AdcValue >= 1001 && AdcValue <= 1500) {/*LED2 LED3 LED4 點亮*/LED5_OFF;LED2_ON;LED3_ON;LED4_ON;} else if (AdcValue >= 501 && AdcValue <= 1000) {/*LED2 LED3 點亮*/LED4_OFF;LED5_OFF;LED2_ON;LED3_ON;} else if (AdcValue >= 0 && AdcValue <= 500) {Newsec = RTC.BCDSEC;if(Oldsec != Newsec) {/*打印電壓值及當(dāng)前時間*/printf("AdcValue = %dmv, 20%x-%x-%x %x %x:%x:%x\n", AdcValue, RTC.BCDYEAR, RTC.BCDMON, RTC.BCDWEEK, RTC.BCDDAY, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);Oldsec = Newsec;}/*LED2 閃爍*/LED3_OFF;LED4_OFF;LED5_OFF;LED2_ON;Delay(1000000);LED2_OFF;Delay(1000000);} }return 0;
}