On veut réaliser une commande des feux d’un carrefour, à deux voies, à l’aide du PIC 16F877.
On
utilise le PORTB pour commander les feux de deux voies. Ce qui fait six feux qui sont simuler par des
LED qui sont noté :
➢ Pour la voie1 : R1 ; O1 et V1
➢ Pour la voie2 : R2 ; O2 et V2 (avec R : feux Rouge, O : feux Orange et V : feux Vert)
Liaison entre le PIC et les LED
➢ R1 est relié à PB0, O1 est relié à PB1, V1 est relié à PB2,
➢ R2 est relié à PB3, O2 est relié à PB4, V2 est relié à PB5,
Durée d’allumage des feux pour chaque voie :
➢ Les feux verts s’allument pendant 10s
➢ Les feux oranges s’allument pendant 2s
➢ Les feux rouges s’allument pendant 12s 1.
Etablir l’organigramme générant une temporisation de 2 s
2. Etablir l’organigramme principal
3. Traduire les organigrammes en programmes assembleur.
Prendre fosc=4MHz
BSF STATUS, RP0
CLRF TRISB
BCF STATUS, RP0
MOVLW 0X21
MOVWF PORTB
CALL Tempo 10s
MOVLW 0X11
MOVWF PORTB
CALL Tempo 2s
MOVLW 0X0C
MOVWF PORTB
CALL Tempo 10s
MOVLW 0X0A
MOVWF PORTB
CALL Tempo 2s
Voici un exemple du programme assembleur des organigrammes. Après les calculs nous avons trouvé
la durée de 250ms c’est-à-dire qu’on va utiliser un temporisateur qui compte que 250ms donc pour
faire une temporisation de 2s on va l’appeler 4 fois. Et en fonction de la temporisation de 2s on va
appeler celle de 10s. comme par exemple si on appel 2s on va utiliser ça pour appeler 5 fois pour
avoir celle de 10s.
Fais-moi le programme en fonction de ce que je viens de te donner
float N;
float Tc=92;
float T;
char Temperature[10];
void main() {
TRISB = 0;
TRISC = 0;
TRISA= 0XFF;
Lcd_init();
ADC_init();
Lcd_cmd(_Lcd_clear);
Lcd_cmd(_Lcd_cursor_OFF);
Lcd_out(1,1,"T=");
Lcd_Out(2,1,"Moteur:");
while(1){
N=ADC_Read(0);
T=0.488*N-273;
floatToStr(T,Temperature);
Lcd_out(1,5,Temperature);
if(T>Tc){
PORTC.RC0=1;
Lcd_Out(2,10,"Marche");
}
else{
PORTC.RC0=0;
Lcd_Out(2,10,"Arret");
NOUVEAU/
sbit LCD_RS at RB6_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_RS_Direction at TRISB6_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB2_bit;
unsigned int N;
float Tc= 90;
float T;
char te[15];
void main() {
TRISC=0;
Lcd_Init();
UART1_Init();
ADC_Init();
Lcd_cmd(_Lcd_clear);
Lcd_cmd(_Lcd_cursor_OFF);
Lcd_Out(1,1,"T=");
Lcd_Out(2,1,"Moteur:");
while(1){
N=ADC_Read(0);
T=0.488*N-273;
floatToStr(T,te);
Lcd_Out(1,3,te);
Lcd_Out_cp("C");
if (T>Tc+2){
PORTC.RC6=1;
UART1_Write(1);
Lcd_Out(2,10,"Marche");
if (T<Tc-2){
PORTC.RC6=0;
UART1_Write(0);
Lcd_Out(2,10,"Arret");