home *** CD-ROM | disk | FTP | other *** search
-
- ; Modele de micro-contrôleur: 80C31
- Model 31
- ;
- ;---------------------------------------------------------------------------
- ; Définition des constantes
- ;
- V24SPD EQU 243
- t10msH EQU 0D8h
- t10msL EQU 0F0h
- EEPROM EQU 10100000b
- ; Adresse de commande des sorties:
- ;
- ; Triac1 EQU 000
- ; Triac2 EQU 001
- ; Triac3 EQU 002
- ; Triac4 EQU 003
- ; Triac5 EQU 004
- ; Triac6 EQU 005
- ; Triac7 EQU 006
- ; Triac8 EQU 007
- ; Triac9 EQU 008
- ; Triac10 EQU 009
- ; Triac11 EQU 010
- ; Triac12 EQU 011
- ; Triac13 EQU 012
-
- Grad1 EQU 013
- Grad2 EQU 014
- Grad3 EQU 015
-
- ; Relais1 EQU 016
- ; Relais2 EQU 017
- ; Relais3 EQU 018
- ; Relais4 EQU 019
- ;
- ; Les entrées se font sur le port P1
- ; Les bits de 0 à 5 servent pour le codage des B.P.
- ; Le P1.6 est l'entrée d'alarme (Entrée +12V quand alarme non active)
- ;
- ;---------------------------------------------------------------------------
- ; Définition des diverses zones de stockage en RAM interne
- ; Mémoire pour état des sorties (en RAM interne)
- ;
- ORG 0020h ; debut zone adressable par bit (0-7F)
- DS 1 ; Réserve bytes de stockage
- Flag1 EQU 000h ; Adresse 1er bit
- Flag2 EQU 001h ; Adresse 2eme bit
- Flag3 EQU 002h ; Adresse 3eme Bit
- TMP DS 1 ; Variable TMP
- Last_Code DS 1 ; Dernier code lu
- MemoOut DS 20 ; Memoire etat sortie
-
- ORG 0040h
- DPL_232 DS 1
- DPH_232 DS 1
- EOT EQU 003h ; End Of Transmit (! Bit = 20.3h !)
- ;
- ;---------------------------------------------------------------------------
- ; Programme
- ;
- ORG 0000
- LJMP Debut
-
- ORG 000Bh
- LJMP IntrT0
-
- ORG 0023h
- LJMP IntrSerie
- DM "ADAM E. 1996"
- LJMP 0100h
-
- ORG 0100h
-
- Debut CLR Flag1
- CLR Flag2
- MOV Last_Code,#0
- LCALL InitIntr
- LCALL InitTimer0
- LCALL InitRS232 ; initialisation du port RS232
- MOV DPTR,#Welcome ; } envoi du message de connection.
- LCALL SendTxt ; }
- LCALL InitSorties ; Initialise les sorties
- ; LCALL ResetSorties ; Place les sorties à 0 (1 pour relais)
- AJMP $
-
-
- ;
- ;---------------------------------------------------------------------------
- ; Initialise des interruptions
- ; All (80h) ; Série (10h) ; Timer 0 (02h)
- InitIntr MOV IP,#02H
- MOV IE,#92H
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Initialise le port série à 4800 bauds, 8 bits, pas de parité et 1 stop bit
- ;
- InitRS232 MOV PSW,#0 ; reset register banks
- MOV PCON,#080H ; SMOD=1
- MOV TMOD,#22H ; modes are timer
- MOV TH1,#V24SPD ; preload value
- MOV TL1,#V24SPD
- MOV TMOD,#21H
- SETB TCON.6 ; start counter
- MOV SCON,#050H ; mode 1 , Enable receiver=10H
- SETB EOT ; Positionne Flag End Of Transmit
- RET
-
- ;----------------------------------------------------------------------------
- ; Initialisation du Timer 0 (Tempo de 10 ms)
- ;
- InitTimer0 MOV TH0,#t10msH
- MOV TL0,#t10msL
- SETB TR0
- RET
-
- ;---------------------------------------------------------------------------
- ; Envoi la valeur de l'accu (00->99) par le port série
- ;
- Send_Val PUSH ACC ; Empile l'accu
- MOV B,#10 ; } Divise par 10
- DIV AB ; }
- ADD A,#'0'
- MOV SBUF,A
- JNB TI,$
- CLR TI
- MOV A,B
- ADD A,#'0'
- MOV SBUF,A
- JNB TI,$
- CLR TI
- LCALL Send_CRLF
- POP ACC
- RET
- ;
- ;---------------------------------------------------------------------------
- ; envoi d'un CR et d'un LF par le port série
- ;
- Send_CRLF PUSH DPL ; Sauve le DPL tâche principale
- PUSH DPH ; IDEM
- JNB EOT,$ ; Attend End of Transmit
- CLR EOT
- MOV DPTR,#Txt_CRLF ; Pointe chaîne CRLF
- MOV DPL_232,DPL ; } Sauve le DPTR pour le port série
- MOV DPH_232,DPH ; }
- SETB TI ; Lance l'écriture série
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Envoi d'un texte présent en ROM (DPTR pointe sur la chaîne)
- ;
- SendTxt JNB EOT,$ ; Attend End Of Transmit
- CLR EOT
- MOV DPL_232,DPL
- MOV DPH_232,DPH
- SETB TI ; Lance l'écriture par RS232
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Coupe toutes les sorties
- ;
- ResetSorties MOV A,#0
- MOV R0,#16
- MOV DPTR,#0
- RstOut1 MOVX @DPTR,A
- INC DPTR
- DJNZ R0,RstOut1
- MOV A,#0FFh
- MOV R0,#4
- RstOut2 MOVX @DPTR,A
- INC DPTR
- DJNZ R0,RstOut2
-
- MOV R0,#16 ; Init 16 sorties
- MOV R1,#MemoOut ; R1 pointe sur MemoOut
- RstOut3 MOV @R1,#0 ; Ecrit des 0
- INC R1 ; Passe sortie suivante
- DJNZ R0,RstOut3 ; Décremente R0
- MOV R0,#4 ; Init 4 sorties
- RstOut4 MOV @R1,#0FFh ; Ecrit FFh (Pour les relais)
- INC R1 ; Passe sortie suivante
- DJNZ R0,RstOut4 ; Décrement R0
-
- RET
-
- ;---------------------------------------------------------------------------
- ; Gestion de l'interruption série
- ;
- IntrSerie JB RI,IntrReceive ; si RI = 1 on continue
- LJMP IntrSend ; Sinon Gestion Envoi par Série
-
- IntrReceive EQU $ ; Coupe l'interruption serie
- CLR RI ; Efface le RI
- PUSH ACC ; Sauve l'accu
- MOV A,SBUF ; Lecture du caractère recu
-
- CJNE A,#'?',SerieCase1
- MOV DPTR,#TextHelp ;}
- LCALL SendTxt2 ;} Envoi du texte d'aide
- AJMP FinIntr ; Fin d'interruption
-
- SerieCase1 CJNE A,#'a',SerieCase2
- LCALL LectChanel
- LCALL ON_Sortie
- AJMP FinIntr
-
- SerieCase2 CJNE A,#'e',SerieCase3
- LCALL LectChanel
- LCALL OFF_Sortie
- AJMP FinIntr
-
- SerieCase3 CJNE A,#'t',FinIntr
- LCALL LectChanel
- LCALL TOG_Sortie
- AJMP FinIntr
-
- FinIntr MOV DPTR,#Prompt
- LCALL SendTxt2
- POP ACC
- SETB ET0 ; Active les interruptions
- RETI
- ;
- ;---------------------------------------------------------------------------
- ; Routine d'envoi d'un texte présent en ROM (Appellé par Intr)
- ;
- IntrSend PUSH ACC ; Empile l'Accu
- PUSH DPL ; Empile le DPL
- PUSH DPH ; Bien tu as deviné !
- CLR TI ; Efface le bit TI
- MOV DPL,DPL_232 ; Restaure le pointeur pour RS232
- MOV DPH,DPH_232 ; IDEM
- MOV A,#0
- MOVC A,@A+DPTR ; Lecture du caractère à afficher
- JZ FinSndTxt ; Si 0 Termine
- MOV SBUF,A
- INC DPTR
- MOV DPL_232,DPL ; Sauve le pointeur pour RS232
- MOV DPH_232,DPH ; IDEM
- AJMP NextSnd
- FinSndTxt SETB EOT ; SET End Of Transmit
-
- NextSnd POP DPH ; Restaure le DPH tâche principale
- POP DPL ; IDEM
- POP ACC ; Restaure l'acccu tâche principale
- RETI ; Termine gestion intr Send RS232
-
- ;---------------------------------------------------------------------------
- ; Routine d'envoi d'un texte présent en ROM
- ;
- SendTxt2 MOV A,#0
- MOVC A,@A+DPTR ; Lecture du caractère à afficher
- JZ FinSnd2 ; Si 0 Termine
- MOV SBUF,A
- JNB TI,$
- CLR TI ; Efface le bit TI
- INC DPTR
- AJMP SendTxt2
- FinSnd2 SETB EOT ; SET End Of Transmit
- RET ; Termine Routine Send RS232 sans
- ; les interruptions
- ;
- ;
- ;---------------------------------------------------------------------------
- ; Gestion de l'interruption Timer 0
- ;
- IntrT0 CLR TR0 ; Stop Timer 0
- CPL Flag1 ; Complemente le Flag 10 ms ecoule
- MOV TL0,#t10msL
- MOV TH0,#t10msH
- SETB TR0
- CPL P3.5 ; sortie de Flag1 sur T1 (Pin 15)
- PUSH ACC
- PUSH DPL
- PUSH DPH
- MOV A,P1
- CJNE A,#255,Intr_1
- CLR Flag2
- MOV Last_Code,#255
- LCALL Stop_Grad
- AJMP Fin_IntrT0
-
- Intr_1 JB Flag2,Intr_2
- SETB Flag2
- AJMP Fin_IntrT0
-
- Intr_2 JNB P1.6,Intr_Alarm
- LCALL Gestion_BP
- AJMP Fin_IntrT0
-
- Intr_Alarm LCALL Alarm
-
- Fin_IntrT0 POP DPH
- POP DPL
- POP ACC
- RETI
- ;
- ;---------------------------------------------------------------------------
- ; Gestion des boutons poussoirs
- ;
- Gestion_BP MOV A,P1
- ANL A,#03Fh
- MOV TMP,A
- CJNE A,Last_Code,Gestion_1
-
- AJMP Fin_Gestion
-
- Gestion_1 MOV A,#0
- MOV DPTR,#Tab_Code
-
- Gestion_2 PUSH ACC
- MOVC A,@A+DPTR
- CJNE A,TMP,Gestion_4
-
- POP ACC
- INC A
- LCALL TOG_Sortie
- MOV Last_Code,TMP
- AJMP Fin_Gestion
-
- Gestion_4 POP ACC
- CJNE A,#19,Gestion_5
- AJMP Fin_Gestion
-
- Gestion_5 INC A
- AJMP Gestion_2
-
- Fin_Gestion RET
-
- ;
- ;--------------------------------------------------------------------------
- ; Alarm
- ;
- Alarm RET
-
- ;
- ; --------------------------------------------------------------------------
- ; Routine de tempo d'anti-rebond (basé sur timer 0 et Flag 1)
- ;
- Wait JNB Flag1,$ ; Attend au minimum 10 mS
- JB Flag1,$ ; Et au Maximum 30 mS
- JNB Flag1,$
- RET
- ;
- ;---------------------------------------------------------------------------
- ; Routine de lecture du n° de canal (en sortie A = n° canal)
- ;
- LectChanel EQU $
- MOV DPTR,#TextChanel
- LCALL SendTxt2
- MOV R3,#0
- LECTCH0 JNB RI,$
- CLR RI
- MOV A,SBUF
- CJNE A,#13,LECTCh1
- MOV A,R3
- RET
-
- LECTCh1 MOV SBUF,A
- JNB TI,$
- CLR TI
- SUBB A,#'0'
- JC LECTCH0
- MOV R4,A
- SUBB A,#10
- JNC LECTCH0
- MOV A,R3
- MOV B,#10
- MUL AB
- ADD A,R4
- MOV R3,A
- AJMP LECTCH0
-
- ;---------------------------------------------------------------------------
- ; Routine Toggel Sortie Change l'état de la sortie n° A
- ;
- TOG_Sortie EQU $
- DEC A ; Convertion N° sortie -> Adr
- CJNE A,#Grad1,Tog_1
- MOV DPTR,#Grad1
- MOV A,#1
- MOVX @DPTR,A
- LJMP Fin_Tog
-
- Tog_1 CJNE A,#Grad2,Tog_2
- MOV DPTR,#Grad2
- MOV A,#1
- MOVX @DPTR,A
- LJMP Fin_Tog
-
- Tog_2 CJNE A,#Grad3,Tog_3
- MOV DPTR,#Grad3
- MOV A,#1
- MOVX @DPTR,A
- LJMP Fin_Tog
-
- Tog_3 MOV R1,A ; Sauve N° sortie dans R1
- LCALL Stop_Grad
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM
- LCALL SendByteI2C ; Adresse EEPROM
- MOV A,R1
- LCALL SendByteI2C ; Envoi Adresse (N° Sortie)
- MOV A,R1
- ADD A,#MemoOut ; Calcul Ptr sur Memo sortie
- MOV R0,A ; Place Ptr dans R0
- MOV A,@R0 ; Lit l'état actuel
- CPL A ; Complemente l'état
- MOV @R0,A ; Sauvegarde nouvel état
- MOV DPH,#00 ;
- MOV DPL,R1 ; Prépare Ptr pour écriture
- MOVX @DPTR,A ; Ecrit nouvelle état
- LCALL SendByteI2C ; Ecrit état sortie / I2C
- LCALL StopI2C ; Stop I2C
- Fin_Tog RET
-
-
- Stop_Grad PUSH ACC
- PUSH DPL
- PUSH DPH
- MOV A,#0
- MOV DPTR,#Grad1
- MOVX @DPTR,A
- INC DPTR
- MOVX @DPTR,A
- INC DPTR
- MOVX @DPTR,A
- POP DPH
- POP DPL
- POP ACC
- RET
-
-
-
- ON_Sortie RET
- OFF_Sortie RET
-
- InitSorties LCALL StartI2C ; Start bus I2C
- MOV A,#EEPROM ; Adresse de l'EEPROM
- LCALL SendByteI2C ; Envoi
- MOV A,#00
- MOV R5,#20 ; Lit les 20 sorties
- MOV DPTR,#0
- MOV R0,#MemoOut
- LCALL SendByteI2C ; Envoi adresse 1ere sortie
- LCALL StartI2C ; Start I2C
- MOV A,#EEPROM+1
- LCALL SendByteI2C ; Envoi adresse EEPROM (RD)
-
-
- Init_Bcl LCALL RecByteI2C ; Lecture de la sorrtie
- LCALL AckI2C ; Acquitte la lecture
- MOV @R0,A ; Sauve l'état de la sortie
- MOVX @DPTR,A ; Ecriture sur la sortie
- INC R0
- INC DPTR
- DJNZ R5,Init_Bcl
-
- LCALL RecByteI2C
- LCALL StopI2C
- RET
-
-
- #include "L:I2C.LIB"
-
- ;---------------------------------------------------------------------------
- ; Messages Messages Messages Messages Messages Messages Messages
- ;---------------------------------------------------------------------------
- ;
- Welcome DM "Connection a 4800 bauds, 8 bits, pas de parite, 1 stop"
- DB 10,13,10,13
- DM "Centrale d'eclairage AE-120. Copywrite ADAM E. 1996"
- DB 10,13,10,13
- DM "En attende de commande. (? = aide)"
- DB 10,13
- DM "AE-120>"
- DB 0
-
- TextHelp DM "Aide des commande de la centrale d'eclairage"
- DB 10,13,10,13
- DM "a = Allume une sortie"
- DB 10,13
- DM "e = Etteint une sortie"
- DB 10,13
- DM "t = Change l'etat d'une sortie"
- DB 10,13,0
-
- Prompt DB 10,13
- DM "AE-120>"
- DB 0
-
- TextChanel DB 10,13
- DM "Canal n.: (1-20)"
- DB 0
-
- Txt_CRLF DB 10,13,0
-
- Txt_Alarm DM " ! ALARM ! "
- DB 10,13,0
-
- Tab_Code EQU $
- BP1 DB 00000111b
- BP2 DB 00001011b
- BP3 DB 00001101b
- BP4 DB 00001110b
- BP5 DB 00010110b
- BP6 DB 00010011b
- BP7 DB 00010101b
- BP8 DB 00011001b
- BP9 DB 00011010b
- BP10 DB 00011100b
- BP11 DB 00100011b
- BP12 DB 00100101b
- BP13 DB 00100110b
- BP14 DB 00101001b
- BP15 DB 00101010b
- BP16 DB 00101100b
- BP17 DB 00110001b
- BP18 DB 00110010b
- BP19 DB 00110100b
- BP20 DB 00111000b
-
- END
-