Questão 1) Projetar um sistema com PICSimLab que recebe o sinal do potenciômetro e apresenta o valor de 0 a 99% no LCD e no display de 7 segmentos. (Vale 3,0 pontos)
Resolução:
Código feito no CCS C Compiler
#include <16F877A.h>
#device adc = 8
#include <math.h>
#FUSES NOWDT, HS, NOPROTECT, NODEBUG
#FUSES NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(crystal = 20MHz)
#ifndef lcd_enable
#define lcd_enable pin_e1 // pino enable do LCD
#define lcd_rs pin_e2 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 pin_d4 // pino de dados d4 do LCD
#define lcd_d5 pin_d5 // pino de dados d5 do LCD
#define lcd_d6 pin_d6 // pino de dados d6 do LCD
#define lcd_d7 pin_d7 // pino de dados d7 do LCD
#endif
#include <mod_lcd.c>
unsigned int8 valor, aux, c, d, u;
unsigned int8 vetor[] = {0b00111111, 0b00000110, // 0 a 9
0b01011011, 0b01001111, 0b01100110, 0b01101101,
0b01111101, 0b00000111, 0b01111111, 0b01100111 };
void main(){
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
lcd_ini();
while(TRUE){
valor = read_adc();
if(valor >= 99){
valor = 99;
}
aux = valor/100; // extrai o primeiro piso das centenas
c = (int)floor(aux); // converte para inteiro
aux = ((valor/10)-(10*c)); //extrai o primeiro piso das dezenas
d = (int)floor(aux); //converte para inteiro
aux = ((valor)-(100*c)-(10*d)); //extrai o primeiro piso das unidades
u = (int)floor(aux); //converte para inteiro
printf (lcd_escreve,"\f\t\t\tIFMT\nValor = %u%%",valor);
delay_ms(20);
output_b(vetor[d]);
output_c(vetor[u]);
}
}
Questão 2) Utilize os três timers para fazer três LEDs piscarem com frequência iguais a:
Vermelho (D0) ________________Hz
Azul (D1) _______________ Hz
Amarelo (D2) ________________Hz
Sabendo que no PIC tem um cristal de _______MHz
Resolução:
Aluno1 = 25 Hz, 5 Hz, 12 Hz
Código feito em CCS C Compiler
#include <16F877A.h>
#device adc = 8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT, NOWRT
#use delay(clock = 20MHz)
unsigned int16 cont1 = 0, cont2 = 0, cont3 = 0;
#int_TIMER0
void TIMER0_isr(void){
if(++cont1 >= 394) { cont1 = 0; output_toggle(pin_B0) ; }
if(++cont2 >= 1927) {cont2 = 0;output_toggle(pin_B1); }
if(++cont3 >= 822) {cont3 = 0; output_toggle(pin_B2); }
}
void main(){
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); // overflow 51,2 us
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
//disable_interrupts(GLOBAL);
while(true);
}
Saída de frequencímetro no Proteus 7.9 |