O código fonte:
/* * voltimetro usando RS-232 no MPlab XC8 * * Compilador : MPlabXC8 * Microcontrolador: 16F877A * Autor: aguivone * Versão: 1 * Data : 04 de março de 2013 */ #include <stdio.h> #include <stdlib.h> #define _XTAL_FREQ 20000000 // cristal de 20 Mhz #include <xc.h> #define delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) /////////////////////////////////////////////////////////configuraçôes////////////////////////////////////////////////// #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) ////////////////////////////////////////////////variaveis globais/////////////////////////////////////////////////////////// char caracter; bit flag_interrupcao = 0; ///////////////////////////////////////////////////interrupção////////////////////////////////////////////////////////////// void interrupt interrupcoes(void)//vetor de interrupção { if(RCIF) {//se interrupção de recepção da serial //aqui não será usado essa funcão caracter = RCREG; flag_interrupcao = 1; RCIF = 0;// limpa flag de interrupção de recepção } if(ADIF) {//se interrupção do modulo analogico! ADIF = 0;//limpa flag } } /////////////////////////////////funçoes usadas pela uart ////////////////////////////////////////////////////// void inicializa_RS232(long velocidade,int modo) {////por padrão é usado o modo 8 bits e sem paridade, mas se necessario ajuste aqui a configuração desejada. //verifique datasheet para ver a porcentagem de erro e se a velocidade é possivel para o cristal utilizado. RCSTA = 0X90;//habilita porta serial,recepção de 8 bit em modo continuo,assincrono. int valor; if(modo == 1) {//modo = 1 ,modo alta velocidade TXSTA = 0X24;//modo assincrono,trasmissao 8 bits. valor =(int)(((_XTAL_FREQ/velocidade)-16)/16);//calculo do valor do gerador de baud rate } else {//modo = 0 ,modo baixa velocidade TXSTA = 0X20;//modo assincrono,trasmissao 8 bits. valor =(int)(((_XTAL_FREQ/velocidade)-64)/64);//calculo do valor do gerador de baud rate } SPBRG = valor; RCIE = 1;//habilita interrupção de recepção TXIE = 0;//deixa interrupção de transmissão desligado(pois corre se o risco de ter uma interrupção escrita e leitura ao mesmo tempo) } void escreve(char valor) { TXIF = 0;//limpa flag que sinaliza envio completo. TXREG = valor; while(TXIF ==0);//espera enviar caracter } void imprime(const char frase[]) { char indice = 0; char tamanho = strlen(frase); while(indice < tamanho ) ///veja que o programa pode travar se aqui não tiver as duas aspas { escreve(frase[indice]); indice++; } } void int_to_char(int quant) { char convert_char5='0'; char convert_char6='0'; char convert_char7='0'; char convert_char8='0'; char convert_char9='0'; while(quant>=10000) { quant=quant-10000; convert_char5++; } while(quant>=1000) { quant=quant-1000; convert_char6++; } while(quant>=100) { quant=quant-100; convert_char7++; } while(quant>=10) { quant=quant-10; convert_char8++; } while(quant>=1) { quant=quant-1; convert_char9++; } escreve('\n'); escreve('\r'); escreve(convert_char5); escreve(convert_char6); escreve(convert_char7); escreve(convert_char8); escreve(convert_char9); } ///////////////////////////////////////funçoes usadas pelo conversor AD////////////////////////////////////////// void inicializa_AD() { ADCON0 = 0X10;//Tosc = 32 (20MHZ , veja datasheet) ;habilita modulo de conversão ADCON1 = 0X8E;//leitura do valor justificado a direita,apenas RA0 será de entrada de tensão()AN0. ADIE = 1;//não habilita interrupção de conversão analogica } int leitura() { long valor; ADCON0 = 5;//solicita leitura while(ADCON0 == 5);//espera terminar leitura return((ADRESH<<8)+ ADRESL); } //////////////////////////////////////////////////////Rotina principal/////////////////////////////////////////////////////////////// void main(void) { TRISC = 0X80;//configura portC C7 (pino RX) como entrada PORTC = 0; // limpar as portas que estão configuradas como saidas TRISA = 0XFF;//configura portA como entrada inicializa_RS232(9600,1);//modo de alta velocidade inicializa_AD(); PEIE = 1;//habilita interrupção de perifericos do pic GIE = 1; //GIE: Global Interrupt Enable bit imprime("Voltimetro usando a serial! \n\r"); for(;;) { int_to_char(leitura()); delay_ms(1000);//espera 1 segundo }//loop infinito }
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!