Bonjour a tous
je dois concevoir un programme pour la carte horloge temps réel, le systéme doit communiquer avec le sequenseur, il est en mode reception de l'heure et la date. J'ai un module DS3234

Sa serai cool si vous pouvez m'aidez svp

Message envoyé par la carte horloge temps réel
1er octet : caractère ASCII ‘ # ‘
Octet 2 : n° ID carte poids forts (code ASCII) ( ‘0’)
Octet 3 : n° ID carte poids faibles (code ASCII) ( ‘1')
Octet 4 : nombres de données transmises (sans CRC) Dizaines (code ASCII)
Octet 5 : nombres de données transmises (sans CRC) Unités (code ASCII)
Octet 6 : heures (dizaines) codées ASCII
Octet 7 : heures (unités) codées ASCII
Octet 8 : minutes (dizaines) codées ASCII
Octet 9 : minutes (unités) codées ASCII
Octet 10 : jour (dizaines) codées ASCII
Octet 11 : jour (unités) codées ASCII
Octet 12 : mois (dizaines) codées ASCII
Octet 13 : mois (unités) codées ASCII
Octet 14 : années (dizaines) codées ASCII
Octet 15 : années (unités) codées ASCII
Octet 16 : CRC (optionnel)



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//   ********  RELAIS : PRGM de detection d'adresse d'autorisation a transmettre sur RS485  ********
 
 
 
 
 
// tempo cadree a 12MHZ
 
//essai tempo code optimiser speed =1
 // avec 8 on a 50uS
 // avec 82 on 504uS
 // avec 15 on 104 reel 95 ss l'enrobage (bp a bp)
 // 1 unite = 6us
 
 
#include<reg51.h>
#define nope ee_dum++
 
 
 
#define tempo2us cddum++;cddum++;cddum++;cddum++ // t=2us @ 24Mhz , 4us @ 12MHz
#define tempo60us for(cddum=9;cddum!=0;cddum--)  // t= 6 x tmpdum   60uS
#define tempo500us for(cddum=83;cddum!=0;cddum--)  // t= 6 x tmpdum 
#define tempo1ms tempo500us;tempo500us //
#define tempo2ms tempo1ms;tempo1ms  // 
 
#define eedum2ascii if(eedum>9) eedum=eedum+7;\
		    eedum = eedum + 0x30;
 
 
#define MAX 80  // taille du tableau d'emission
#define MSBi 0xF0 
#define LSBi 0x0F
 
#define DIL P0
#define DATADTMF P2
#define DATACAN P1
 
unsigned data char cddum;
 
/* ********** DEFINITION DES PORTS DU MICROCONTROLLEUR ENTREES/SORTIES ********** */ 
sbit StD = P2^4;	// 
sbit BUSOUT = P3^2;			// SORTIE µP ENTREE DATA
sbit led_hf = P2^7;			// A 0 LED EST ALLUMEE A 1 ELLE EST ETEINTE
sbit led_wait_add = P2^6;		// attente adresse carte emise par sequenceur
sbit led_emit_RS485 = P2^5;		//emission du message sur le bus RS485
 
 
 
/* ********** DEFINITION DES VARIABLES ********** */
 
 
const char transcode[16]={'D','1','2','3','4','5','6','7','8','9','0','*','#','A','B','C'};
 
// DTMF 
unsigned data char data_dtmf , data_can;		// VARIABLE QUI CONTIENDRA LES DONNES A recevoir en ascii 
unsigned data char ee_dum;			// ee_dum SERT A L'INCREMENTATION DE LA FONCTION nope; 
unsigned data char i_ee;			// i_ee SERT POUR LE FOR 	
 
// TEMPOS
unsigned data char cddum;
data unsigned int ttt;		// ttt est utilise pour les tempo
 
 
// MAIN
data unsigned int i;		// POUR LE FOR QUI FAIT CLIGNOTER LA LED 
data unsigned char n ,n_total  ;          // indice tableau
idata unsigned emit_tab[MAX] ;   // tableau de reception/emission des datas
 
unsigned data char  erreur, timeout, eedum  ;
 
 
 
 
 
 
/* ********** DEFINITION DES FONCTIONS ********** */ 
 
 
 
void init_uart(void);
void start_RX(void);
void stop_RX(void);
void transmit_uart(unsigned char);
unsigned char receive_uart(void);
 
/* ********** PROGRAMME PRINCIPAL ********** */
void main(void)
{
	// INILASITATION DES VARIABLES
 
	BUSOUT = 0;			// driver en reception
	// initialisation de la liason serie 4800 bit/s
	init_uart();
 
//------------------------------------------------------------------------------
/* ********** RECEPTION DTMF version 2018 ********** */
//------------------------------------------------------------------------------
 
//-------------------------------------------------------------------------------
// construction du TABLEAU :
//-------------------------------------------------------------------------------
 
// la valeur stoke dans 4 cntient le code(A alors #) a mettre dans emit_tab[0]
 
 
// lecture des dil pour mettre l'adresse du relais dans emit_tab(1et2)
	eedum=DIL ;  //lecture port
	// decalage, masquage ....
	emit_tab[1]=eedum ;
 
	eedum=DIL ;  
	// decalage, masquage ....
	emit_tab[2]=eedum ;
 
 
 
// extinction led_hf, allumme led_seq c a d attend signal sequenceur
 
	led_hf=1;
//-----------------------------------------------------------------------
//            GESTION BUS  RS 485
//-----------------------------------------------------------------------
 
//---- Attente adresse de la carte (provenant du sequenceur)
debut_attente: 
	led_wait_add=0;
 
	start_RX();
 
	do
		{
		eedum=receive_uart();
		}
 
	while (eedum!='$') ;   // attente caractere $
	eedum=receive_uart();
	if (eedum!=emit_tab[1]) goto debut_attente ;
	eedum=receive_uart();
	if (eedum!=emit_tab[2]) goto debut_attente ;
 
	stop_RX();
 
// la bonne adresse est transmise par le sequenceur 
	led_wait_add=1;
	led_emit_RS485 =0;
 
// envoi du tableau suivant le protocole
 
//   ..............................
 
// fin du travail...  on recommence
 
	goto retour;
}
//----------------------------- fin MAIN --------------------------------------
 
 
 
//                          sous-programmes
 
 
//-------------------------------------------------------------------------------
//        void init_uart(void) initialisation uart 4800bit 8N1 ,timer1
//-------------------------------------------------------------------------------
 
void init_uart(void)
{
 
SCON=0x40;
eedum=TMOD;
eedum=eedum & 0x0F;   // RAZ timer1
eedum=eedum | 0x20 ;  // mode 2
TMOD=eedum;
TH1 = 243 ;  // 4800 bit/s @ 12MHz
TL1 = 243 ;  // pour bien commencer...
PCON =PCON | 0x80 ; // SMOD1 diviseur par 2
TF1=0 ; //  pour bien commencer...
TR1=1 ; // timer run
}
 
void start_RX(void)
{  // data char titi;
REN=1;// rajouter fflush RX : if TI==1 TI=0 titi=SBUF
}
void stop_RX(void)
{
REN=0;
}
 
void transmit_uart(unsigned char toto)
{
SBUF=toto;
while(TI==0);
TI=0;
}
 
 
unsigned char receive_uart(void)
{
while(RI==0)
	{
	}
RI=0;
return(SBUF);
}