Buscar

declarações de controle -MICROCONTROLADORES

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

*
*
*
CAPÍTULO 7 
 DECLARAÇÕES DE CONTROLE
*
*
*
DECLARAÇÕES DE CONTROLE
		As declarações de controle dividem-se em:
	- DECLARAÇÕES DE TESTE CONDICIONAL,
	- DECLARAÇÕES DE ESTRUTURAS DE REPETIÇÃO.
*
*
*
DECLARAÇÕES DE TESTE CONDICIONAL
		São utilizadas para testar determinadas condições ou variáveis e executar um comando ou um bloco de comandos uma única vez.
		A linguagem C dispõe de dois tipos de declarações condicionais: 
COMANDO “IF”
COMANDO “SWITCH-CASE”
*
*
*
COMANDO “IF- ELSE”
		O comando if (“se” em português) é utilizado para executar uma única vez um comando ou um bloco de comandos caso uma determinada condição seja avaliada como verdadeira. 
		Opcionalmente, é também possível executar outro comando, ou outro bloco de comandos, caso a condição seja avaliada como falsa. 
		A forma geral deste comando é:
		if (condição) comando A; 
		else comando B;
*
*
*
COMANDO “IF- ELSE”
	if (condição)
	{
	 comando A1;
	 comando A2;
	 comando A3; 
	}
	else
	{
	 comando B1;
	 comando B2;
	 comando B3;
	}
*
*
*
COMANDO “IF-ELSE”
*
*
*
COMANDO “IF (SEM ELSE)”
 A forma geral deste comando é:
		if (condição) comando A; 
		comando B;
		comando C;
		...
*
*
*
COMANDO “IF (SEM ELSE)”
*
*
*
COMANDO “IF- ELSE”
	Exemplo 1: Escreva um programa que faça o led da figura piscar a uma frequência de 5 Hz se a chave estiver fechada e a uma freqüência de 1 Hz se a chave estiver aberta. Após retorna para o início. 
- CIRCUITO:
*
*
*
	- FLUXOGRAMA:
*
*
*
void main()
{
 trisd.f0 = 0; 	 
 trisb.f0 = 1; 		 
 portd = 0; 		 
		 
 while (1) 		 
 {
 	if (portb.f0 == 1) 	 
 	{
 	portd.f0 = 1; 
 	delay_ms(100); 
 	portd.f0 = 0; 
 	delay_ms(100); 
 	}
 
	else	 	
	{
 portd.f0 = 1; 		 delay_ms (500); 	 portd.f0 = 0; 	 
 delay_ms (500); 
	}
 }
}
- PROGRAMA:
*
*
*
	Considere o circuito da figura 4 e escreva um programa que funcione de acordo com a seguinte lógica:
	- Se a chave S1 for pressionada e o led 1 estiver desligado, liga o led 0. 
	- Se a chave S2 for pressionada e o led 0 estiver desligado, liga o led 1. 
	- Se a chave S3 for pressionada, independentemente do estado das outras duas chaves e dos leds, deve desligar o led que estiver ligado. 
EXEMPLO 2
*
*
*
- CIRCUITO ELETRÔNICO:
*
*
*
FLUXOGRAMA
*
*
*
- PROGRAMA:
void main() 	
{
 trisb = 0b111;
	 trisd = 0; 
 portd = 0; 
 while (1) 
 {
 if (portb.f0 == 1 & portd.f1 == 0) portd.f0 = 1;	
 if (portb.f1 == 1 & portd.f0 == 0) portd.f1 = 1;	
 if (portb.f2 == 1) portd = 0;				
 }
}
*
*
*
- PROGRAMA CORRIGIDO:
void main() 	
{
 trisb = 0b111;
	 trisd = 0; 
 portd = 0; 
 while (1) 
 {
 if (portb.f0 == 1 & portd.f1 == 0 & portb.f2 == 0) portd.f0 = 1; 
	 if (portb.f1 == 1 & portd.f0 == 0 & portb.f2 == 0) portd.f1 = 1;
 if (portb.f2 == 1) portd = 0;				
 }
}
*
*
*
CHAVE REVERSORA AUTOMÁTICA CIRCUITO DE POTÊNCIA
*
*
*
CHAVE REVERSORA AUTOMÁTICA CIRCUITO DE COMANDO
*
*
*
COMANDO “SWITCH-CASE”
		O comando switch-case permite comparar uma determinada variável com diversos valores diferentes, e executar um comando, ou bloco de comandos, específico para cada valor da variável.
	
*
*
*
COMANDO “SWITCH-CASE”
		Forma geral:
	
	switch (variável)
	{
		case valor1:
			comando A;
			 ...
			break;
		case valor2;
			comando B;
			 ...
			break;
		case valor3;
			comando C;
			 ...
			break;
		 Default:
			Comando D;
	}	
*
*
*
COMANDO “SWITCH-CASE”
*
*
*
COMANDO “SWITCH-CASE”
	OBSERVAÇÕES:
	 	O comando switch só pode testar igualdades. Não são admitidos outros operadores relacionais ou lógicos como no comando if.
		Somente números inteiros ou caracteres podem ser utilizados como constantes.
		As cláusulas break e default são opcionais. Se a cláusula break for omitida, todos os comandos subseqüentes ao case especificado serão executados, até que seja encontrada uma outra cláusula break. 
*
*
*
EXEMPLO 3
	Os pinos 0 à 7 da porta D de um microcontrolador PIC 16F877A estão conectados nos pinos a a g, respectivamente, de um display catodo comum. Entre os pinos 0 a 3 da porta B e o + 5 V foram conectadas 4 chaves. Faça um programa que mostre em decimal no display o valor correspondente em binário da porta B. Isto deve acontecer enquanto o circuito estiver energizado.
*
*
*
CIRCUITO ELETRÔNICO
*
*
*
*
*
*
PROGRAMA
void main() 
{
 trisa = 0b0;
 adcon1 = 7;
 porta.f5 = 1;
 trisb = 0b1111; 
 trisd = 0;
 portd = 0;
 while (1) 
 { 
 switch (portb) 
 {
	 case 0: portd = 0b00111111; 
	 break; 	
 case 1: portd = 0b00000110; 
	 break; 
 case 2: portd = 0b01011011;
	 break; 
 case 3: portd = 0b01001111; 
 break; 
 case 4: portd = 0b01100110; 
 break; 
 case 5: portd = 0b01101101; 
 break; 
 case 6: portd = 0b01111101; 
 break; 
 case 7: portd = 0b00000111; 
 break; 
 case 8: portd = 0b01111111; 
 break; 
 case 9: portd = 0b01101111; 
 break; 
 default: portd = 0b01110110;
 } 
 }
}
*
*
*
ESTRUTURAS OU LAÇOS DE REPETIÇÃO
		Servem para executar um comando ou um conjunto de comandos repetidamente enquanto uma determinada condição é satisfeita.
		Neste capítulo estudaremos as seguintes estruturas de repetição:
LAÇO “FOR”,
LAÇO “WHILE”
*
*
*
LAÇO “FOR” (PARA EM INGLÊS) 
		É utilizada para laços finitos de contagem, normalmente utiliza uma variável que faz o controle da contagem.
		
		A forma geral do laço for é:
		for (inicialização; condição; in/decremento) 	comando;
	
		ou,
		
*
*
*
	for ( inicialização; condição; incremento)
	{
		comando 1; // Início do bloco de comandos
		comando 2; //
			...
	}
	
	inicialização - contém uma expressão utilizada para atribuir à variável de controle um valor inicial (i = 0, por exemplo).
	condição - estabelece a condição que deve ser satisfeita pela variável de controle para que o laço continue sendo executado (i < 10, por ex). 
	incremento - contém uma expressão que determina como será feito o incremento ou decremento da variável de controle ( i ++, por ex).
*
*
*
SEQÜÊNCIA DO LAÇO DO FOR
	1) A expressão de inicialização atribui à variável de controle o valor inicial.
	2) A condição de teste é verificada e, se for falsa, o comando, ou o bloco de comando, é pulado e o programa segue para a próxima linha. Se a condição de teste for verdadeira, o comando ou o bloco de comando será executado. 
	3) Após o bloco de comando ser executado a variável de controle é incrementada ou decrementada, conforme o caso, a condição de teste é verificada e, se ainda for verdadeira, o laço é repetido.
*
*
*
FLUXOGRAMA DO LAÇO FOR
*
*
*
EXEMPLO 4
		Faça um programa para piscar 6 vezes o led conectado no pino 0 da porta D a uma freqüência de 1 Hz,
	a-) sem utilizar o laço do for.
	b-) utilizando o laço do for.
- CIRCUITO ELETRÔNICO:
*
*
*
FLUXOGRAMA
*
*
*
void main ()					int i;	
{							void main ()	 
 trisd = 0;					{ 
 portd = 1;					 trisd = 0;	 
 delay_ms
(500); 				 for (i = 0; i < 6; i++) 
 	portd = 0; 					 {		
 delay_ms (500);					 portd = 1;
	portd = 1;						delay_ms (500); 
	delay_ms (500);					 portd = 0; 
	portd = 0;						delay_ms (500); delay_ms (500);				 }
 	portd = 1; 					}
 delay_ms (500);
 	portd = 0;
 delay_ms (500);
 	portd = 1;
 delay_ms (500);
 	portd = 0;
 delay_ms (500);
	portd = 1;
 delay_ms (500);
	 portd = 0;
 delay_ms (500);
 	portd = 1;
 delay_ms (500);
 	portd = 0;
	delay_ms(500);
	}
PROGRAMA
*
*
*
EXEMPLO 5
		Faça um contador progressivo de 0 a 15, utilizando o laço do for, que apresente o resultado da contagem em binário nos 4 leds conectados nos pinos de 0 a 3 da porta D mostrados na figura 12. 	Cada contagem deve ser apresentada nos leds durante 1 segundo.
*
*
*
CIRCUITO ELETRÔNICO
*
*
*
FLUXOGRAMA
não
sim
 j = 0; j < 16; j++
*
*
*
PROGRAMA
int j; 				
void main()			
{
	 trisd = 0;		
	 portd = 0;		 
	 for (j = 0; j < 16; j++)	 
	 {			 
		 portd = j;		 	 	 delay_ms (1000); 
	 }			 
	 portd = 0; 
}				 
*
*
*
EXEMPLO 6
		Repita o exercício 5 para um contador regressivo (15 a 0).
*
*
*
CIRCUITO ELETRÔNICO
*
*
*
FLUXOGRAMA
*
*
*
PROGRAMA
int j; 				
void main()			
{
	 trisd = 0;		
	 portd = 0;		 
	 for (j = 15; j >= 0; j--)	 
	 {			 
		 portd = j;		 	 	 delay_ms (1000); 
	 }			 
	}				 
*
*
*
EXEMPLO 7
	Faça um programa, utilizando o comando for, para fazer o led 0 da figura 12 piscar a uma freqüência de 0,5 Hz. Utilize na temporização laço do for com um delay de 10 ms. OBS: 1 segundo = 1000 ms = 100 x 10 ms.
*
*
*
CIRCUITO ELETRÔNICO
*
*
*
FLUXOGRAMA
*
*
*
PROGRAMA
Int i;
void main()
{
 trisd = 0;
 while(1)
 {
 portd.f0 = 1;
		 for (i = 0; i < 100; i++) delay_ms (10);
		 portd.f0 = 0;
		 for (i = 0; i < 100; i++) delay_ms (10);
 }
}
*
*
*
EXEMPLO 8
		Projetar uma minuteria para um prédio de 4 andares, utilizando microcontrolador PIC, que ligue as lâmpadas das escadas do prédio quando qualquer chave for pressionada e as mantenha ligadas durante 1 minuto. Se as lâmpadas já estiverem ligadas e qualquer chave for pressionada, o circuito deverá reiniciar a contagem de tempo permitindo que a pessoa tenha tempo de chegar ao seu apartamento. As chaves são normalmente abertas e devem ser ligadas de modo que o seu fechamento gere nível lógico 1 no pino da porta do PIC.
*
*
*
CIRCUITO
*
*
*
 FLUXOGRAMA
*
*
*
PROGRAMA
int i;				 
void main ()		 
{
 trisd = 0;		 
 portd = 0;		 
 trisb = 1;		 
 while (1)		 
 {
		if (portb.f0 == 1) 	 
		{
		 portd.f0 = 1;		 
		 for (i = 0; i < 1000; i++)	 
		 {
	 		delay_ms (10);			 
	 		if (portb.f0 == 1) i = 0;
 		 }
 		 portd.f0 = 0;
		 }		 
 }
}
*
*
*
LAÇO “WHILE” (ENQUANTO)
Forma geral:					Fluxograma:
	while (condição) comando;
	ou 
	while (condição)
	{
		comando 1,
		comando 2,
 ...
	 }
*
*
*
LAÇO “WHILE” (ENQUANTO)
		No laço while primeiro a condição é avaliada, se for verdadeira, o comando ou o bloco de comandos é executado. Após, a condição volta a ser avaliada e, se for falsa, o comando ou o bloco de comandos não é executado e o programa segue a partir da linha seguinte ao bloco while, ou seja, enquanto a condição é verdadeira o comando ou o bloco de comandos é executado.
		
*
*
*
EXEMPLO 9
	Faça um programa para piscar o led da figura 2 a uma freqüência de 4 Hz enquanto a chave estiver pressionada. Quando a chave for liberada o led pára de piscar e volta para o início. 
*
*
*
void main ()		 
{
 trisb = 1; 		 
 trisd = 0;
	 portd = 0; 	 
 while (1)	 
 {
 while (portb.f0 == 1) 
 {
	 	 portd= 1; 	 
	 delay_ms (125); 
 portd = 0;	 
 delay_ms (125);	
		 }
 }
 }
 FLUXOGRAMA	 PROGRAMA
*
*
*
EXEMPLO 10
	Considerando-se o circuito da figura 2, faça um programa que funcione da seguinte forma: enquanto a chave não for pressionada, fica esperando, ou seja, a execução do programa não avança. No instante em que a chave é pressionada o led deve ligar durante 5 segundos, depois desliga e volta para o início.
*
*
*
EXEMPLO 10 - FLUXOGRAMA
*
*
*
EXEMPLO 10 - PROGRAMA
void main ()		 		 
{
 trisb =1;		 		 
 trisd = 0; 
	 portd = 0; 	 		 
 while (1)				 
 {
 	 while (portb.f0 == 0); 		 
	 	 portd = 1;			 	 	 delay_ms (5000);		 
	 	 portd = 0;			 
 }
}
*
*
*
EXEMPLO 11
	Faça um programa para inverter o estado do led conectado no pino 0 da porta D da figura 21 cada vez que a chave, conectada no pino 0 da porta B, for pressionada e liberada. Para isto o programa deve aguardar que a chave seja pressionada e, após a chave ser pressionada, deve aguardar que a chave seja liberada para só então inverter o nível lógico do pino 0 da porta D.
*
*
*
EXEMPLO 11 - FLUXOGRAMA
não
sim
 rb0 == 0?
não
não
sim
sim
*
*
*
EXEMPLO 11 - PROGRAMA
void main ()
{
 trisd = 0;			 
 portd = 0;			 
 trisb = 1;			 
 while (1)			 
 {
 while (portb.f0 == 0); 	 		 while (portb.f0 == 1); 
 portd.f0 = ~portd.f0; 
 }
}
*
*
*
EXEMPLO 12
	Faça um programa para inverter o estado do led conectado no pino 0 da porta D da figura 21 para cada segundo que a chave, conectada no pino 0 da porta B, permanecer pressionada. 
*
*
*
FLUXOGRAMA
*
*
*
PROGRAMA
void main ()
{
 trisd = 0;			 
 portd = 0;			 
 trisb = 1;			 
	 while (1)			 
 {
 while (portb.f0 == 1) 	 
 { 
	 portd.f0 = ~ portd.f0; 
	 delay_ms (1000);	 
 }
 }
}
*
*
*
COMANDO “BREAK”
		Este comando pode ser usado para sair de um loop for, while, do-while ou switch passando a execução para o comando imediatamente seguinte ao loop.
*
*
*
EXEMPLO 13
	Os pinos 0, 1 e 2 da porta D do microcontrolador da figura 25 são utilizados para acionar os contatores K1, K2 e K3 respectivamente de um chave estrela-triângulo. Quando os contatores K1 e K3 são energizados ligam os enrolamentos do motor em estrela. Energizando-se os contatores K1 e K2 os enrolamentos do motor são ligados em triângulo. 
	Escreva um programa para fazer a partida de um motor em estrela (ligar K1 e K3) se a chave liga (L) for pressionada e o motor estiver desligado (K1 = 0).
	Após a partida do motor, espera 10 segundos e liga os enrolamentos do motor em triângulo (desliga K3 e liga K2, mantendo K1 ligado).
	No exato momento em que a chave desliga (D) for pressionada, o motor deve ser desligado e deve ficar aguardando que a chave liga seja novamente pressionada.
*
*
*
CIRCUITO ELETRÔNICO
*
*
*
ALGORITMO
1) Início.
2) Se a chave Liga for pressionada e o motor estiver desligado executa os comandos abaixo. 
	2.1) Liga o motor em estrela 
	2.2) Executa uma temporização de 10 segundos 	 monitorando a chave Desliga. Se a chave 	 Desliga for pressionada, finaliza a 	 temporização e desliga o motor. 
	2.3) Após a temporização, liga o motor em 	 	 triângulo.
	2.4) Quando a chave Desliga for pressionada,
desliga o motor.
3) Volta para o início.
*
*
*
FLUXOGRAMA
*
*
*
int i;
void main()
{
 trisb = 0b11;
 trisd = 0;
 portd = 0;
 while (1)
 {
 if (portb.f0 == 1 & 
	 portd.f0 == 0)
 {
 portd.f0 = 1;
 portd.f2 = 1;
 for (i = 0; i < 1000; i++)
 {
 delay_ms(10);
 if (portb.f1 == 1)
	 break;
	 }
PROGRAMA
 	if (i == 1000)
	{
	 portd.f2 = 0;
	 delay_ms(10);
	 portd.f1 = 1;
	 while (portb.f1 == 0);
	}
	portd = 0;
	}
 }
}
*
*
*
CIRCUITO DE POTÊNCIA

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais