本工程采用STC89C52RC讀取DS12887時鐘芯片的數(shù)據(jù)實現(xiàn)的,因為DS12887本身具有后備電池,所以即使設(shè)備掉電,時鐘芯片依然通過使用后備電池運行,當(dāng)設(shè)備上電后,讀取的時鐘依然是準(zhǔn)確的。因此不用擔(dān)心掉電后時鐘運行不準(zhǔn)確
DS12887簡介
DS12887是DALLAS公司的實時時鐘芯片RTC(Real Time Clock),它功能豐富,應(yīng)用廣泛,PC機(jī)內(nèi)的時鐘信號就是由D512887提供的。DS12887內(nèi)部自帶晶體振蕩器及鋰電池,可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補償,斷電后能運行10年之久不丟失數(shù)據(jù)。可選用夏令時,具有24小時或12小時兩種制式。它在工業(yè)控制及儀器儀表中有廣泛用途。DS12887上電時,當(dāng)Vcc高于4.25V 200mS后,芯片可以被外部程序操作。當(dāng)Vcc低于4.25V時,芯片處于寫保護(hù)狀態(tài)(所有的輸入均無效),同時所有輸出呈高阻狀態(tài)。當(dāng)Vcc低于3V時,芯片將自動把供電方式切換為由內(nèi)部電池供電。
DS12887內(nèi)部寄存器說明
DS12887有128個RAM單元。其中4個單元用作控制寄存器,10個單元用作存放時鐘字節(jié),114字節(jié)為通用RAM。其主要寄存器如下:
DS12887內(nèi)部寄存器A: UIP=l:更新已到,不能讀/寫DSl2887;UIP=0:更新末到,能讀/寫DS12887。 DV2,DV1,DV0應(yīng)設(shè)置為010,表示打開晶振,允許計時。 RS3,RS2,RS1,RS0為方波頻率選擇位,產(chǎn)生方波周期中斷。
DS12887內(nèi)部寄存器B: SET=0:時間更新正常進(jìn)行,每秒計數(shù)1次;SET=1:禁止更新,程序可初始化時間和日歷。 PIE=l:允許周期中斷;PIE=0:禁止周期中斷。 AIE=1:允許報警中斷;AIE=0:禁止報警中斷。 UIE=1:允許更新結(jié)束中斷;UIE=0:禁止更新結(jié)束中斷。 SQWE為方波允許位。SQWE=1:將RS3,RS2,RS1,RS0選定的方波輸出。 DM=1:BCD碼;DM=0:二進(jìn)制。該位不受復(fù)位信號影響 24/12:1表示24[小]時制;0表示12[小]時制。 DSE為夏時制允許位。DSE=l:采用夏時制;DSE=0:不采用夏時制。
DS12887內(nèi)部寄存器C: IRQF為中斷申請標(biāo)志。 PF為方波周期中斷標(biāo)志。PF=1:方波周期結(jié)束,申請中斷。 AF為鬧鈴中斷標(biāo)志。AF=1:當(dāng)前時間與鬧鈴時間匹配時即刻申請中斷。 UF為更新周期結(jié)束中斷標(biāo)志。UF二I:更新周期結(jié)束時申請中斷。
DS12887內(nèi)部寄存器D: VRT為內(nèi)部鋰電池狀態(tài)。VRT=1:鋰電池正常;VRT=0:鋰電池耗盡。
D512887內(nèi)部存儲器功能如附表所示。
以下是部分代碼:
- #include <REG51.H>
- #include <ABSACC.H>
- #define uchar unsigned char
- #define uint unsigned int
- //============================
- #define C8155 XBYTE[0x7000]
- #define PA XBYTE[0x7001]
- #define PB XBYTE[0x7002]
- #define PC XBYTE[0x7003]
- //============================
- #define sec XBYTE[0x8000]
- #define min XBYTE[0x8002]
- #define hou XBYTE[0x8004]
- #define week XBYTE[0x8006]
- #define day XBYTE[0x8007]
- #define mon XBYTE[0x8008]
- #define year XBYTE[0x8009]
- #define cent XBYTE[0x8032]
- #define DS12887A XBYTE[0x800a]
- #define DS12887B XBYTE[0x800b]
- #define DS12887C XBYTE[0x800c]
- //===============================
- sbit set_inc=P1^0;
- sbit set_dec=P1^1;
- sbit inc=P1^2;
- sbit dec=P1^3;
- uchar disbit;
- bit flag;
- uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code act_PB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code act_PC[5]={0xfe,0xfd,0xfb,0xf7,0xef};
- char ms=0;
- char data ram_year,ram_mon,ram_day,ram_week,ram_hou,ram_min,ram_sec;
- void scan_key(void);
- void delay(uint k);
- void wr_time(void);
- void rd_time(void);
- /******************************/
- void init_timer0(void)
- {
- TH0=-(2000/256);
- TL0=-(2000%256);
- TR0=1;
- }
- //***********************
- void init(void)
- { init_timer0();
- EA=1;ET0=1;
- C8155=0x0f;
- DS12887A=0x20;
- }
- /**********************************/
- void time_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /****************************************/
- void min_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10]&0x7f;}break;
- case 3:{PA=SEG7[ram_min/10]&0x7f;}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /***************************************/
- void hou_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10]&0x7f;}break;
- case 5:{PA=SEG7[ram_hou/10]&0x7f;}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /***************************************/
- void week_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1]&0x7f;}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /**************************************/
- void day_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10]&0x7f;}break;
- case 8:{PA=SEG7[ram_day/10]&0x7f;}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /********************************************/
- void mon_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10]&0x7f;}break;
- case 10:{PA=SEG7[ram_mon/10]&0x7f;}break;
- case 11:{PA=SEG7[ram_year%10];}break;
- case 12:{PA=SEG7[ram_year/10];}break;
- default:break;
- }
- }
- /****************************************/
- void year_dis(uchar disbit)
- {uchar y_week;
- switch(disbit)
- {
- case 0:{PA=SEG7[ram_sec%10];}break;
- case 1:{PA=SEG7[ram_sec/10];}break;
- case 2:{PA=SEG7[ram_min%10];}break;
- case 3:{PA=SEG7[ram_min/10];}break;
- case 4:{PA=SEG7[ram_hou%10];}break;
- case 5:{PA=SEG7[ram_hou/10];}break;
- case 6:{if(ram_week==1)y_week=9;
- else y_week=ram_week;PA=SEG7[y_week-1];}break;
- case 7:{PA=SEG7[ram_day%10];}break;
- case 8:{PA=SEG7[ram_day/10];}break;
- case 9:{PA=SEG7[ram_mon%10];}break;
- case 10:{PA=SEG7[ram_mon/10];}break;
- case 11:{PA=SEG7[ram_year%10]&0x7f;}break;
- case 12:{PA=SEG7[ram_year/10]&0x7f;}break;
- default:break;
- }
- }
- /****************************************/
- void time0(void) interrupt 1 using 1
- {static uchar disbit;
- TH0=-(2000/256);
- TL0=-(2000%256);
- PB=0xff;PC=0xff;
- switch(ms)
- {
- case 0:{time_dis(disbit);}break;
- case 1:{min_dis(disbit);}break;
- case 2:{hou_dis(disbit);}break;
- case 3:{week_dis(disbit);}break;
- case 4:{day_dis(disbit);}break;
- case 5:{mon_dis(disbit);}break;
- case 6:{year_dis(disbit);}break;
- default:break;
- }
- disbit++;
- if(disbit>12)disbit=0;
- if(disbit<8){PB=act_PB[disbit];PC=0xff;}
- else {PB=0xff;PC=act_PC[disbit-8];}
- }
- /***********************************/
- void main(void)
- {
- init();
- rd_time();
- while(1)
- {
- scan_key();
- if(ms==0){
- if(flag){wr_time();flag=0;}
- else rd_time();
- }
- }
- }
- /*****************************************/
- void wr_time(void)
- {
- DS12887B=0x86;
- year=ram_year;mon=ram_mon;day=ram_day;
- week=ram_week;hou=ram_hou;min=ram_min;
- DS12887B=0x06;
- }
- /*******************************************/
- void rd_time(void)
- {
- uchar data temp,x;
- do{temp=DS12887A;x=temp|0x7f;}while(x==0xff);
- ram_year=year;ram_mon=mon;ram_day=day;
- ram_week=week;ram_hou=hou;ram_min=min;ram_sec=sec;
- }
- /*****************************************/
- void scan_key(void)
- {
- if(!set_inc){ms++;delay(200);if(ms>6)ms=0;}
- if(!set_dec){ms--;delay(200);if(ms<0)ms=6;}
- if(ms==1){flag=1;if(!inc){ram_min++;if(ram_min>59)ram_min=59;delay(200);}
- if(!dec){ram_min--;if(ram_min<1)ram_min=1;delay(200);} }
- if(ms==2){ if(!inc){ram_hou++;if(ram_hou>23)ram_hou=23;delay(200);}
- if(!dec){ram_hou--;if(ram_hou<0)ram_hou=0;delay(200);} }
- if(ms==3){ if(!inc){ram_week++;if(ram_week>7)ram_week=7;delay(200);}
- if(!dec){ram_week--;if(ram_week<1)ram_week=1;delay(200);} }
- if(ms==4){ if(!inc){ram_day++;if(ram_day>31)ram_day=31;delay(200);}
- if(!dec){ram_day--;if(ram_day<1)ram_day=1;delay(200);} }
- if(ms==5){ if(!inc){ram_mon++;if(ram_mon>12)ram_mon=12;delay(200);}
- if(!dec){ram_mon--;if(ram_mon<1)ram_mon=1;delay(200);} }
- if(ms==6){flag=1;if(!inc){ram_year++;if(ram_year>99)ram_year=99;delay(200);}
- if(!dec){ram_year--;if(ram_year<0)ram_day=0;delay(200);} }
- }
- /********************************************************/
- void delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++){
- for(j=0;j<60;j++)
- {;}}
- }
- /*****************end********************/
復(fù)制代碼 原理圖: 無
仿真: 無
代碼:
ds12887.7z
(13.82 KB, 下載次數(shù): 9)
2024-1-4 16:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|