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);
} |
Partager