1 | // Programmvorlage
|
2 | // Datum: 19.07.2010
|
3 | // Autor: ALfi
|
4 |
|
5 |
|
6 | //Einbinden der Include- und Define- Dateien
|
7 | #include <stdio.h>
|
8 | #include <math.h>
|
9 | #include <regx51.h>
|
10 | #include <absacc.h>
|
11 |
|
12 |
|
13 | //Basis-Adressen
|
14 | #define CS_RTC 0xFFF0 // Basis-Adresse der RTC
|
15 |
|
16 | //Special function register
|
17 | //für die RTC
|
18 |
|
19 | #define SEC0 XBYTE [CS_RTC + 0x00] // RTC-SFR Sekunden Einerstelle
|
20 | #define SEC10 XBYTE [CS_RTC + 0x01] // RTC-SFR Sekunden Zehnerstelle
|
21 | #define MIN0 XBYTE [CS_RTC + 0x02] // RTC-SFR Minuten Einerstelle
|
22 | #define MIN10 XBYTE [CS_RTC + 0x03] // RTC-SFR Minuten Zehnerstelle
|
23 | #define HOUR0 XBYTE [CS_RTC + 0x04] // RTC-SFR Stunden Einerstelle
|
24 | #define HOUR10 XBYTE [CS_RTC + 0x05] // RTC-SFR Stunden Zehnerstelle
|
25 | #define DAY0 XBYTE [CS_RTC + 0x06] // RTC-SFR Tag Einerstelle
|
26 | #define DAY10 XBYTE [CS_RTC + 0x07] // RTC-SFR Tag Zehnerstelle
|
27 | #define MONTH0 XBYTE [CS_RTC + 0x08] // RTC-SFR Monat Einerstelle
|
28 | #define MONTH10 XBYTE [CS_RTC + 0x09] // RTC-SFR Monat Zehnerstelle
|
29 | #define YEAR0 XBYTE [CS_RTC + 0x0A] // RTC-SFR Jahr Einerstelle
|
30 | #define YEAR10 XBYTE [CS_RTC + 0x0B] // RTC-SFR Jahr Zehnerstelle
|
31 | #define WEEK XBYTE [CS_RTC + 0x0C] // RTC-SFR Wochentag
|
32 | #define REGD XBYTE [CS_RTC + 0x0D] // RTC-SFR D
|
33 | #define REGE XBYTE [CS_RTC + 0x0E] // RTC-SFR E
|
34 | #define REGF XBYTE [CS_RTC + 0x0F] // RTC-SFR F
|
35 |
|
36 |
|
37 | //Deklaration der globalen Variabeln
|
38 | char s1[10];//wird für das LCD benötigt
|
39 | unsigned char secE,secZ,minE,minZ,stdE,stdZ;
|
40 | unsigned char tagE,tagZ,monE,monZ,jahrE,jahrZ,wo_ta,z_inter;
|
41 |
|
42 |
|
43 |
|
44 | void _wait_ms(unsigned int multiplikator)
|
45 | {
|
46 | unsigned int i,j;
|
47 |
|
48 | for(i=0;i<multiplikator;i++)
|
49 | {
|
50 | for(j=0;j<123;j++);
|
51 | }
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 | /*** RTC überprüfen, ob bereit ist, Werte zu übergeben bzw. auszulesen ***/
|
57 | void rtc_check(void)
|
58 | {
|
59 | unsigned char help; // Deklaration der Lokalen Variable "help"
|
60 | do // Tu das folgenden solange -siehe while
|
61 | {
|
62 | REGD = (REGD | 0x01) ; // HOLD Bit auf HIGH setzen!
|
63 | help = (REGD & 0x02) ; // BUSY Bit maskieren
|
64 | if (help) REGD = (REGD & 0x0e) ; // Wenn BUSY Bit HIGH ist, HOLD Bit wieder auf
|
65 | }
|
66 | while(help) ; // LOW setzen und Schleife nochmals ausfuehren!
|
67 | // Wenn Busy Bit LOW ist, weiter mit Zugriff auf RTC
|
68 | }
|
69 |
|
70 |
|
71 |
|
72 | // Programm-Variablen zum Arbeiten mit Uhrzeit und Datum
|
73 |
|
74 | /*** Aktuelle Daten aus RTC auslesen ***/
|
75 |
|
76 | void rtc_read(void)
|
77 | {
|
78 | rtc_check(); secE = SEC0; REGD = (REGD & 0x0e); secE= secE & 0x0f;
|
79 | rtc_check(); secZ = SEC10; REGD = (REGD & 0x0e); secZ= secZ & 0x0f;
|
80 | rtc_check(); minE = MIN0; REGD = (REGD & 0x0e); minE= minE & 0x0f;
|
81 | rtc_check(); minZ = MIN10; REGD = (REGD & 0x0e); minZ= minZ & 0x0f;
|
82 | rtc_check(); stdE = HOUR0; REGD = (REGD & 0x0e); stdE= stdE & 0x0f;
|
83 | rtc_check(); stdZ = HOUR10; REGD = (REGD & 0x0e); stdZ= stdZ & 0x0f;
|
84 | rtc_check(); tagE = DAY0; REGD = (REGD & 0x0e); tagE= tagE & 0x0f;
|
85 | rtc_check(); tagZ = DAY10; REGD = (REGD & 0x0e); tagZ= tagZ & 0x0f;
|
86 | rtc_check(); monE = MONTH0; REGD = (REGD & 0x0e); monE= monE & 0x0f;
|
87 | rtc_check(); monZ = MONTH10; REGD = (REGD & 0x0e); monZ= monZ & 0x0f;
|
88 | rtc_check(); jahrE = YEAR0; REGD = (REGD & 0x0e); jahrE= jahrE & 0x0f;
|
89 | rtc_check(); jahrZ = YEAR10; REGD = (REGD & 0x0e); jahrZ= jahrZ & 0x0f;
|
90 | rtc_check(); wo_ta = WEEK; REGD = (REGD & 0x0e); wo_ta= wo_ta & 0x0f;
|
91 | }
|
92 |
|
93 | void init_seri(void)
|
94 | {
|
95 | SCON=0x52;
|
96 | TMOD |=0x20;
|
97 | TH1=0xfd;
|
98 | TR1=1;
|
99 | TI=1;
|
100 | }
|
101 |
|
102 | /*** Hauptprogramm ***/
|
103 | void main(void)
|
104 | {
|
105 | init_seri();
|
106 | SEC0 = 0; //Sekunden einstellen
|
107 | SEC10 = 1;
|
108 | MIN0 = 0; //Minuten einstellen
|
109 | MIN10 = 1;
|
110 | HOUR0 = 0; //Stunden einstellen
|
111 | HOUR10 = 1;
|
112 | DAY0 = 0; //Tag einstellen
|
113 | DAY10 = 1;
|
114 | MONTH0 = 1; //Monat einstellen
|
115 | MONTH10 = 0;
|
116 | YEAR0 = 1; //Jahr einstellen
|
117 | YEAR10 = 1;
|
118 | WEEK = 1; //woche einstellen
|
119 | while(1)
|
120 | {
|
121 | rtc_read();
|
122 | printf(" D %c%c.%c%c.%c%c Z %c%c:%c%c:%c%c E",tagZ,tagE,monZ,monE,jahrZ,jahrE,stdZ,stdE,minZ,minE,secZ,secE);
|
123 | //printf(" D %u%u.%u%u.%u%u Z %u%u:%u%u:%u%u E",tagZ,tagE,monZ,monE,jahrZ,jahrE,stdZ,stdE,minZ,minE,secZ,secE);
|
124 | _wait_ms(200);
|
125 | getchar();
|
126 | }
|
127 | }
|