Nesse exemplo mostro como criar um voltímetro para tensões mais altas.

Mudando a relação do divisor de tensão é possível ler outras tensões.

Usar no Proteus 7.10 ou superior.


Fazer o download: [PIC][MIKROC][PROTEUS] Voltimetro PIC


Segue o código:

[sections] [section title=”Esquema Elétrico”] Voltímetro 120V

[/section] [section title=”Código Fonte”]

/*
DATEK Tecnologia Eletrônica Ltda.

********************************************************************************
PROGRAMA EXEMPLO: Mostrar como criar um voltimetro.
OBJETIVO: Aprender como criar um voltimetro.
AUTOR: Fabio Mulero.[fabio@datek.com.br] ********************************************************************************
MICROCONTROLADOR: PIC12F675.

PLACA DE DESENVOLVIMENTO: SIMULAÇÃO NO PROTEUS

SOFTWARE: MikroC PRO for PIC Versão: 6.0

********************************************************************************
*/
//### DIRETIVAS DE PROGRAMA ####################################################
#include "built_in.h"

//### DEFINES E MACROS #########################################################
// Constantes
#define NAO 0
#define SIM 1
#define DESLIGA NAO
#define LIGA SIM
#define FALSO NAO
#define VERDADEIRO SIM
#define SAIDA NAO
#define ENTRADA SIM
// Macros

/* Estrutura para LCD com shift-register */

// CONTROLE DO LCD
sbit SHIFT_DATA at GP4_bit; // PINO DE DADOS
sbit SHIFT_CLK at GP5_bit; // PINO DE CLOCK
sbit SHIFT_STB at GP2_bit; // PINO DE STROBE

unsigned char STATUS_BACK;

sbit Enable_Backlight at STATUS_BACK.B0;

sbit SHIFT_DATA_Direction at TRISIO4_bit; // PINO DE DADOS
sbit SHIFT_CLK_Direction at TRISIO5_bit; // PINO DE CLOCK
sbit SHIFT_STB_Direction at TRISIO2_bit; // PINO DE STROBE
#define LCD_BACKLIGHT 0x80
#define LCD_ENABLE 0x10
#define LCD_RS 0x40
#define LCD_WR 0x20
#define DESLIGA 0
#define LIGA 1
#define ENTRADA 1
#define SAIDA 0
void ESCREVE_LCD_4094(unsigned char Value);
void lcd_cmd (unsigned char cmd);
void lcd_data (unsigned char dat);
void LCD_ESCREVE_STR(unsigned char Row, unsigned char Column, unsigned char* string);
void LCD_4094_INIT();

void main() {
unsigned int uiValor;
char txt[6];
char tst;
CMCON0 = 7;
ANSEL = 0x00;
ANS0_bit = 1; // Analogico
VCFG_bit = 1; // Referencia externa
Delay_ms(10);
LCD_4094_INIT();
Enable_Backlight = 1;
LCD_ESCREVE_STR(1,1," DATEK TECNOLOGIA ");
LCD_ESCREVE_STR(2,1," VOLTIMETRO PIC ");
LCD_ESCREVE_STR(3,1," REVISAO 00 ");
Delay_ms(3000);
LCD_ESCREVE_STR(4,1,"Tensao: ");
while(1)
{
uiValor = ADC_Read(0)*2;
WordToStr(uiValor, txt);
tst=txt[4];
txt[4]=’.’;
LCD_ESCREVE_STR(4,9,txt);
lcd_data(tst);
lcd_data(‘V’);
}
}

void ESCREVE_LCD_4094(unsigned char Value)
{
unsigned char cont=0;
for(cont=0;cont<8;cont++)
{
SHIFT_DATA = ((Value && 0x80)==0x80);
SHIFT_CLK = DESLIGA;
Delay_us(10);
SHIFT_CLK = LIGA;
Value<<=1; Delay_us(10); } SHIFT_STB = LIGA; Delay_us(10); SHIFT_STB = DESLIGA; } void lcd_cmd (unsigned char cmd) { ESCREVE_LCD_4094(((cmd >> 4) & 0x0F)|LCD_ENABLE|(Enable_Backlight==1?LCD_BACKLIGHT:0));
ESCREVE_LCD_4094(((cmd >> 4) & 0x0F)|(Enable_Backlight==1?LCD_BACKLIGHT:0));

ESCREVE_LCD_4094( (cmd & 0x0F)|LCD_ENABLE|(Enable_Backlight==1?LCD_BACKLIGHT:0));
ESCREVE_LCD_4094( (cmd & 0x0F)|(Enable_Backlight==1?LCD_BACKLIGHT:0));
}

void lcd_data (unsigned char dat)
{
ESCREVE_LCD_4094((((dat >> 4) & 0x0F)|LCD_ENABLE|LCD_RS)|(Enable_Backlight==1?LCD_BACKLIGHT:0));
ESCREVE_LCD_4094((((dat >> 4) & 0x0F)|LCD_RS)|(Enable_Backlight==1?LCD_BACKLIGHT:0));

ESCREVE_LCD_4094( ((dat & 0x0F)|LCD_ENABLE|LCD_RS)|(Enable_Backlight==1?LCD_BACKLIGHT:0));
ESCREVE_LCD_4094( ((dat & 0x0F)|LCD_RS)|(Enable_Backlight==1?LCD_BACKLIGHT:0));
}
void LCD_ESCREVE_STR(unsigned char Row, unsigned char Column, unsigned char* string)
{
if(Column>1)
Column–;
if(!Row)
Row=1;

switch(Row)
{
case 1:
lcd_cmd(_LCD_FIRST_ROW+Column);
break;
case 2:
lcd_cmd(_LCD_SECOND_ROW+Column);
break;
case 3:
lcd_cmd(_LCD_THIRD_ROW+Column);
break;
case 4:
lcd_cmd(_LCD_FOURTH_ROW+Column);
break;
}
while(*string!=”)
{
lcd_data(*string++);
}
}

void LCD_4094_INIT()
{
// CONFIGURAÇÃO DOS PORTS
SHIFT_DATA_Direction = SAIDA; // PINO DE DADOS
SHIFT_CLK_Direction = SAIDA; // PINO DE CLOCK
SHIFT_STB_Direction = SAIDA; // PINO DE STROBE
lcd_cmd(0x03);
lcd_cmd(0x03);
lcd_cmd(0x03);
lcd_cmd(0x02);
lcd_cmd(0x28); // 4-bit mode – 2 line – 5×7 font.
lcd_cmd(0x0C); // Display no cursor – no blink.
lcd_cmd(0x06); // Automatic Increment – No Display shift.
lcd_cmd(0x80); // Address DDRAM with 0 offset 80h.
}
/* [fim] Estrutura para LCD com shift-register */

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[PIC][MIKROC][PROTEUS] Voltimetro 0 – 120V
Tags:                     

Uma ideia sobre “[PIC][MIKROC][PROTEUS] Voltimetro 0 – 120V

  • 30 de janeiro de 2020 em 08:49
    Permalink

    estou começando agora aprender programa com mikroc para fazer voltimetro multiteste para usar na porta do pc

    Resposta

Deixe uma resposta

%d blogueiros gostam disto: