Ir ao conteúdo
  • Cadastre-se

Tudo sobre PICs - Postem aqui


Posts recomendados

vou postar um programa CCS usando pic 16f877. um conversor a/d,só que na entrada tem um potenciometro,conforme você ajusta o potenciometro,um valor é enviado ao pic (0 a 1024) se o valor chegar a tipo 500 acende um led, se chegar a 300 acende outro.


#include <16f877.h>
#device adc=10 // modo 10bits
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT


main()
{
int32 ad;
setup_adc_ports (RA0_analog);
setup_adc(adc_clock_internal);
set_adc_channel(0);
while (true);
{
ad = read_adc();
if (ad == 120) // coloque o valor que queira.
{
output_high(PIN_B0); // coloque aqui o pino que vai 'acender' ao chegar no valor desejado
}
if(ad == 520)
{
output_high(PIN_B3);
}
}


falta umas coisinhas jaja arrumo

Link para o comentário
Compartilhar em outros sites

#include <16F676.h>

#use delay(clock=4000000)

#fuses INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,XT

lógico que está errado....

vamos por partes, voce esta usando a função use delay, sendo que voce ainda nem setou o oscilador do teu PIC...segundo se voce esta usando oscilador XT não precisa usar essa função...

faça somente isso aqui:



#include <16f676.h>
[B]#FUSES NOPORTECT, NOPUT, NOMCLR, NOWDT, XT[/B]

abs.

Link para o comentário
Compartilhar em outros sites

vou tentar ajudar::


#include <16F676.h>
#use delay(clock=4000000)
#fuses NOPORTECT, NOPUT, NOMCLR, NOWDT, XT
int x;
void main (){

SETUP_PORT_A(RA0_ANALOG); // vamos colocar só essa para ser entrada ad
SETUP_ADC(ADC_CLOCK_INTERNAL); // ok
SET_ADC_CHANNEL(1);
x = read_adc();
while (1){
if (x == 100){
output_high(PIN_C1);
}
else {
output_low(PIN_C1);
}

}
}

mais ou menos isso que tu queres?

efetue a regra que o felipe citou e modifique o prog

Link para o comentário
Compartilhar em outros sites

mais uma coisa você executou qual codigo o seu ou o meu? esse int x do meu codigo? se for serve para armazenar o valor do a/d caso seja no meu codigo

ATUALIZAÇÃO.

#include <16F676.h>

#use delay(clock=4000000)

#fuses NOPORTECT, NOPUT, NOMCLR, NOWDT, XT

int x;

void main (){

SETUP_PORT_A(RA0_ANALOG); // vamos colocar só essa para ser entrada ad

SETUP_ADC(ADC_CLOCK_INTERNAL); // ok

SET_ADC_CHANNEL(1);

while (1){

x = read_adc();

if (x == 100){

output_high(PIN_C1);

}

else {

output_low(PIN_C1);

}

}

}

coloque o x = read_adc(); dentro do while..

Link para o comentário
Compartilhar em outros sites

olha você tem msn?

se tiverem acho que seria melhor pra discuti td. Se tiverem passem eles ae porque se agente fica mandando muita mensagem vai fica um topico chato de ler, ai depois eu posto os resultados.

acho que seria melhor

até porque é mais fácil tirar as duvidas conversando em tempo real

Olá galera, finalmente consegui fazer o programa, queria a avaliação de todos para o meu programa, pois não testei na vida real ainda e não sei se esta perfeito.


#include <16F676.h>
#device adc=10

#fuses INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,XT


int gustavo;
void main(){

SETUP_ADC_PORTS (sAN1);
SETUP_ADC(ADC_CLOCK_INTERNAL);
SET_ADC_CHANNEL(1);

while (1){

delay_us(100);
gustavo=read_adc();
if (gustavo=1024){
output_high(PIN_C1);
}
else {
output_low(PIN_C1);
}

if (gustavo<1024){
output_high(PIN_C2);
}
else {
output_low(PIN_C2);
}
}
}

Avaliem.

Me desculpem por alguns erros por falta de pesquisa.

Ai galera postem mais programas ai, tenho certeza que não é só o Angelox e o Felipe_Eletronic que tem conhecimentos sobre PICs.

Obrigado a todos.

Abs.

Link para o comentário
Compartilhar em outros sites

Aqui, use o PIC16f877A se voce quiser testar isso na pratica um dia, esse ta compilado e testado e comentado

Código:

---------

#include <16f877A.h>
#device adc=10;

#fuses NOPUT,NOPROTECT,NOBROWNOUT,XT,NOWDT // fuses de configuração USE ESTES!!
#use delay (clock = 4000000)

int Ad_valor;
void main(){
SET_TRIS_A(0b11111111); //configura IO do PORTA//RA0 a RA7 entradas
SET_TRIS_C(0b00000000);// configura IO do PORTC//Rc0 a RC7 saidas
SETUP_ADC_PORTS (AN0);//RA0 IO analógico
SETUP_ADC(ADC_CLOCK_INTERNAL);//configura clock de conversão
SET_ADC_CHANNEL(0);//Canal 0 para leitura do AD.

while (1){

delay_us(100);
Ad_valor=read_adc();
if (Ad_valor == 1023){
output_high(PIN_C1);
output_low (PIN_C2);
}
if(Ad_valor < 1023) {
output_low(PIN_C1);
output_high(PIN_C2);
}
}
}

abs

Link para o comentário
Compartilhar em outros sites

Vou postar aqui um codigo de um pisca pisca com velocidade variavel por um potenciometro no RA0. led no portb 0

pic 16f877a.


#include <16f877A.h>
#device adc=10;

#fuses NOPUT,NOPROTECT,NOBROWNOUT,XT,NOWDT // fuses de configuração
#use delay (clock = 4000000) // clock externo

int valor_convertido;
void main(){

SETUP_ADC_PORTS (AN0);//RA0 IO analógico
SETUP_ADC(ADC_CLOCK_INTERNAL);//configura clock do adc
SET_ADC_CHANNEL(0);

delay_us(100);
while(1)
{
valor_convertido=read_adc();
output_high(PIN_B0);
delay_ms(valor_convertido);
output_low(PIN_B0);
delay_ms(valor_convertido);

}
}


abs.

Link para o comentário
Compartilhar em outros sites

Esse é o do nosso amigo angelox: (acredito que funcione)


Postado horiginalmente por [B]Angelox_123[/B]
Vou postar um simples de fácil entendimento, detector três niveis de agua com PIC12f629 (8 pinos). para uso em picinas,na pia para indicar transbordamento,pode até em vez de led colocar relês, para desligar automaticamente bombas de agua(por exemplo você põe uma piscina pra enche para seus filhos,com uma bomba de agua que liga no 110,quando enche até um certo nivel elá automaticamente para de enche) com muito pequenas modificações.
PIN_A0 //led 1
PIN_A1 // led2
PIN_A2 // led 3

PIN_A3 // detector 1
PIN_A4 // detector 2
PIN_A5 // detector 3


Código:
#include <12F629.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8)

void main()
{
while(1){
if(input(pin_a3)==1) // parte nivel 1
{
output_high(pin_a0);
}
else{
output_low(pin_a0);
}


if(input(pin_a4)==1)// parte nivel 2
{
output_high(pin_a1);
}
else{
output_low(pin_a1);
}

if(input(pin_a5)==1)// parte nivel 3
{
output_high(pin_a2);
}
else{
output_low(pin_a2);
}
}

}

ai você ao enves de sensores usa um botão entre o Vcc(5V) e o Pino da entrada PIC. Desse modo quando clicar em um botão ele ascendera um led, e quando você apertar outro botão acendera outro led.

Aguarde mais opiniões.

Até mais.

Olá galera, olha eu queria ir passo a passo no que estou fazendo e depois postar o resultado do projeto mais vou logo dizer o quero fazer.

Ha um tempo atrás eu postei sobre como fazer uma placa de controle de motor de servo que se guia através de um potenciometro. Achei o circuito mais usa um CI que não consegui achar pra comprar, então descidi fazer com um PIC.

O programa que quero ajuda é o seguinte:

Ele vai ter que ler 10 tipos de onda quadrada, essas ondas vão ser de 100ms até 1000ms(onda 1=100ms, onda 2=200ms, onda 3=300ms e assim até 1segundo) então quando entrar, por exemplo, uma onda de 100 ms ele vai ativar o pino C1 com 5V e o pino C2 com GND ai quando o potenciometro chega em resistencia 0 esse sinal sera cortado, a mesma coisa se reptira até a onda 5 (500ms) ai quando a onda for de 6 a 10 ele vai ativar o pino C2 como 5V e o C1 como GND. Ex.: esta entrando uma onda quadrada de 800ms ai ela ativara a porta C2 como Vcc, ai o potenciometro chegara em uma posição que gerara o valor convertido no A/D de 768, com esse valor ele vai corta o Vcc do pino C2 e o motor vai parar deixando a alvanca de controle do servo na posição de de +ou- em 23 graus.

Galera por favor não quero que me falem q é mais fácil e barato comprar um pronto porque eu quero fazer eu mesmo pra ganhar experiencia e aprender fazer, não emporta tempo nem dinheiro. Principalmente tempo porque ainda tenho 14 anos e tenho muito tempo.

Galera da uma ajuda ai.

mais uma vez obrigado.

Abs.

Link para o comentário
Compartilhar em outros sites

Um projeto bem legal, eu chamo de dimmerPIC, controlado a distancia por infravermelho, creio que o pessoal vai se divertir montando:

os fontes:

transmissor:


;Gera um codigo de 4 bits ao pressionamento de uma botao
;E o envia ao HT12E
;Autor: Felipe Neves
;Data: 06/04/09
;Testado e inserido na placa final em 18/04/2009
;==============================================================================================
LIST P = PIC16F819
#INCLUDE "P16F819.INC"
RADIX DEC

__CONFIG _CP_ALL & _WDT_OFF & _MCLR_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_IO & _LVP_OFF

ERRORLEVEL -302
ERRORLEVEL -205
;==============================================================================================

#DEFINE DATABUS PORTA
#DEFINE UPLAMP PORTB,0
#DEFINE DOWNLAMP PORTB,1
#DEFINE UPCOL PORTB,2
#DEFINE DOWNCOL PORTB,3
#DEFINE RELAY1 PORTB,4
#DEFINE RELAY2 PORTB,5
#DEFINE TE PORTB,6
#DEFINE Q1 D_REG,0
#DEFINE Q2 D_REG,1
#DEFINE SETF1 MOVLW 0Fh
#DEFINE SETF MOVWF DATABUS
;==============================================================================================

CBLOCK 0X20
CONT
CONT2
VARTMP
D_REG
ENDC

;==============================================================================================

ORG 0X00
GOTO OSC_CONFIG

ORG 0X04
RETFIE

;==============================================================================================
;***PARAMETROS DE configuração***
;-PORTA: SOMENTE SAIDAS
;-PORTB: PB0 ATE PB5 ENTRADAS, PB6:SAIDA
;-NAO USA TMR0 NEM INTERRUPÇOES
;-SEM CONVERSOR A/D
OSC_CONFIG:
BANKSEL OSCCON
MOVLW 65h
MOVWF OSCCON
INIT_uC:
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ADCON1
MOVLW 06h
MOVWF ADCON1
BANKSEL ADCON0
BCF ADCON0,ADON
BANKSEL TRISA
MOVLW 00h
MOVWF TRISA
BANKSEL TRISB
MOVLW h'BF'
MOVWF TRISB
BANKSEL INTCON
CLRF INTCON
BANKSEL OPTION_REG
MOVLW .128
MOVWF OPTION_REG
BANKSEL CCP1CON
CLRF CCP1CON
BCF STATUS,RP0
BSF TE
SETF1
SETF
BCF Q1
BCF Q2
GOTO MAIN
;===============================================================================================
;***ROTINA PRINCIPAL***
;FUNCIONA ASSIM, O SOFTWARE LE O ESTADO DE TODOS OS botões(VARREDURA) E VERIFICA O PRESSIONAMENTO
;DEPENDENDO DO BOTAO, O SW IRA DIRECIONAR PARA A ROTINA DE CODIFICAÇAO CORRESPONDENTE
;SAO 4 ROTINAS IGUAIS(AUMENTA E DIMINUI LAMPADA, AUMENTA E DIMINUI VENTILADOR)
;E 2 PARA ATIVAÇAO E DESATIVAÇAO DAS CARGAS, ESSAS SAO UM POUCO DIFERENTES, JA QUE O MESMO BOTAO
;DE LIGA E O DE DESLIGA
;************************************************************************************************
MAIN:
;CLRF PORTB
MAIN2: BSF TE
BTFSC UPLAMP
CALL SEND1
BSF TE
BTFSC DOWNLAMP
CALL SEND2
BSF TE
BTFSC UPCOL
CALL SEND3
BSF TE
BTFSC DOWNCOL
CALL SEND4
BSF TE
BTFSC RELAY1
CALL SEND5
BSF TE
BTFSC RELAY2
CALL SEND6
BSF TE
GOTO MAIN2
;*************************************************************************************************
;***ROTINAS DE CODIFICAÇAO***
;EXPLICAREI APENAS UMA DAS QUATRO
;JA QUE SAO IGUAIS
SEND1
CALL DELAY_BOUNCE
MOVLW 00h ;ENVIA O CODIGO DO COMANDO
MOVWF DATABUS ; E CARREGA NO BARRAMENTO DE DADOS
BCF TE ;HABILITA A CODIFICAÇAOI
CALL DELAY ;AGUARDA UM TEMPO
BSF TE ;DESABILITA TE
SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

SEND2
CALL DELAY_BOUNCE
MOVLW 01h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

SEND3
CALL DELAY_BOUNCE
MOVLW 02h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

SEND4
CALL DELAY_BOUNCE
MOVLW 03h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

;***ESSAS AQUI SAO UM POUCO DIFERENTE***
SEND5
CALL DELAY_BOUNCE
BTFSC Q1 ;ESTADO DE Q1? (1 = LIGADO; 0 = DESLIGADO)
GOTO SEND_A ;LIGADO, então VAI PRA CA
GOTO SEND_B ;SENAO PRA CA
EXT: SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

SEND_A
CALL DELAY_BOUNCE
MOVLW 04h ;CARREGA O COMANDO
MOVWF DATABUS ;EM DATABUS
BCF TE ;HABILITA A CODIFICAÇAO
CALL DELAY
BSF TE
BCF Q1 ;LIMPA Q1
GOTO EXT ;RETORNA

SEND_B
CALL DELAY_BOUNCE
MOVLW 05h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
BSF Q1 ;NESSE CASO, SETA Q1
GOTO EXT ; E DEPOIS RETORNA


SEND6
CALL DELAY_BOUNCE
BTFSC Q2
GOTO SEND_C
GOTO SEND_D
EXT2: SETF1
SETF
BCF TE
CALL DELAY_BOUNCE
BSF TE
RETURN

SEND_C
CALL DELAY_BOUNCE
MOVLW 06h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
BCF Q2
GOTO EXT2

SEND_D
CALL DELAY_BOUNCE
MOVLW 07h
MOVWF DATABUS
BCF TE
CALL DELAY
BSF TE
BSF Q2
GOTO EXT2
;********************************************************************************************************************************************************
;***ROTINAS DE TEMPORIZAÇAO***
DELAY
MOVLW .249
MOVWF CONT
DL: NOP
DECFSZ CONT,F
GOTO DL
RETURN

DELAY_BOUNCE
MOVLW .100
MOVWF CONT2
DL2:CALL DELAY1MS
DECFSZ CONT2,F
GOTO DL2
RETURN

DELAY1MS
MOVLW .249
MOVWF CONT
NP: NOP
DECFSZ CONT,F
GOTO NP
RETURN
;***********************************************************************************************************************************************************
;***FIM DO CODIGO***
END
;codificador IR

receptor:


;controla os pulsos ao fotoacoplador e interpreta os dados
;Data: 28/04/2209
;Autor: Felipe Neves

LIST P = PIC16F819
#INCLUDE "P16F819.INC"
__CONFIG _CP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _MCLR_OFF & _INTRC_IO & _LVP_OFF


ERRORLEVEL -302
ERRORLEVEL -205

;DEFINIÇOES:

#DEFINE T1 PORTB,1
#DEFINE T2 PORTB,2
#DEFINE REDE PORTB,0
#DEFINE DATABUS PORTA

;MINHAS VARIÁVEIS
CBLOCK 0X20
DADOS
C1
TIME1
TIME2
TIME3
C2
D_REG
D_REG2
ENDC

;DIREÇOES DO PROGRAMA

ORG 0X00
GOTO INIT

ORG 0X04 ;INTERRUPÇOES
BTFSS INTCON,TMR0IF
GOTO $+2
GOTO T0_INT
BTFSS PIR1,TMR2IF
GOTO $+2
GOTO T2_INT
BTFSS INTCON,INTF
GOTO $+2
GOTO INT_REDE
RETFIE


T0_INT:
BTFSS D_REG,0
GOTO FIM1
CLRF TMR0
BSF T1
; CALL PULSE1
; BCF T1
FIM1:
BANKSEL INTCON
BCF INTCON,TMR0IF
BCF INTCON,TMR0IE
BCF STATUS,RP0
RETFIE

T2_INT:
BTFSS D_REG2,0
GOTO FIM2
CLRF TMR2
BSF T2
; CALL PULSE1
; BCF T2
FIM2:
BANKSEL PIR1
BCF PIR1,TMR2IF
BANKSEL PIE1
BCF PIE1,TMR2IE
BCF STATUS,RP0
RETFIE

INT_REDE:
CALL SHORT
BCF T1
BCF T2
BANKSEL INTCON
BCF INTCON,INTE
BSF INTCON,TMR0IE
BCF INTCON,TMR0IF
BANKSEL PIR1
BCF PIR1,TMR2IF
BANKSEL PIE1
BSF PIE1,TMR2IE
BCF STATUS,RP0
MOVF C1,W
MOVWF TMR0
MOVF C2,W
MOVWF TMR2
BSF INTCON,INTE
BCF INTCON,INTF
RETFIE
;===================FIM DAS INTs===========================



INIT:
BANKSEL OSCCON
MOVLW 065H
MOVWF OSCCON
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ADCON1
MOVLW 06H
MOVWF ADCON1
BANKSEL ADCON0
CLRF ADCON0
BANKSEL TRISA
MOVLW 0FFH
MOVWF TRISA
MOVLW 01H
MOVWF TRISB
BANKSEL OPTION_REG
MOVLW 0C4H
MOVWF OPTION_REG
BANKSEL INTCON
MOVLW 0F0H
MOVWF INTCON
BANKSEL PIE1
MOVLW 02H
MOVWF PIE1
BANKSEL PIR1
CLRF PIR1
BANKSEL CCP1CON
CLRF CCP1CON
BANKSEL T2CON
MOVLW 06H
MOVWF T2CON
BANKSEL PR2
MOVLW 0FFH
MOVWF PR2
BCF STATUS,RP0
CLRF C1
CLRF C2
MOVLW 079H
MOVWF C1
MOVLW 01H
MOVWF C2
BCF T1
BCF T2
BSF D_REG,0
BSF D_REG2,0
BTFSS REDE
GOTO $-1
GOTO LOOP


LOOP:
CALL DELAY3
MOVF DATABUS,W
MOVWF DADOS
CALL DECODIFICA
GOTO LOOP


DECODIFICA
MOVF DADOS,W
ADDWF PCL,F
RETURN
GOTO UP1
GOTO DOWN1
GOTO UP2
GOTO DOWN2
GOTO LIGA1
GOTO DESLIGA1
GOTO LIGA2
GOTO DESLIGA2
RETURN
RETURN
RETURN
RETURN
RETURN
RETURN
RETURN
RET1: CLRF DADOS
RETURN




UP1:
; CALL DELAY
CALL DELAY
MOVF C1,W
XORLW 0FDH
BTFSC STATUS,Z
GOTO RET1
INCF C1,1
GOTO RET1

DOWN1:
; CALL DELAY
CALL DELAY
MOVF C1,W
XORLW 079H
BTFSC STATUS,Z
GOTO RET1
DECF C1,1
GOTO RET1

UP2:
; CALL DELAY
CALL DELAY
MOVF C2,W
XORLW 0FBH
BTFSC STATUS,Z
GOTO RET1
INCF C2,1
GOTO RET1

DOWN2:
; CALL DELAY
CALL DELAY
MOVF C2,W
XORLW 01H
BTFSC STATUS,Z
GOTO RET1
DECF C2,1
GOTO RET1

LIGA1:
BSF D_REG,0
CALL DELAY2
GOTO RET1

DESLIGA1:
BCF D_REG,0
CALL DELAY2
GOTO RET1


LIGA2:
BSF D_REG2,0
CALL DELAY2
GOTO RET1

DESLIGA2:
BCF D_REG2,0
CALL DELAY2
GOTO RET1

;===========================================================================================================================================

PULSE1:
MOVLW .200
MOVWF TIME1
REF1:
NOP
NOP
DECFSZ TIME1,F
GOTO REF1
RETURN

DELAY
DL2:
MOVLW .10
MOVWF TIME1
DL1:
NOP
NOP
DECFSZ TIME1,F
GOTO DL1
DECFSZ TIME3,F
GOTO DL2
RETURN


DELAY2
DL4:
MOVLW .200
MOVWF TIME1
DL3:
NOP
NOP
DECFSZ TIME1,F
GOTO DL3
DECFSZ TIME3,F
GOTO DL4
RETURN

SHORT
MOVLW .125
MOVWF TIME1
DL5:
NOP
DECFSZ TIME1
GOTO DL5
RETURN
DELAY3
DLB:
MOVLW .5
MOVWF TIME1
DLA:
NOP
NOP
DECFSZ TIME1,F
GOTO DLA
DECFSZ TIME3,F
GOTO DLB
RETURN

;=========================================================================================================================================

END ;ATE QUE ENFIM ;D
;Software de controle da placa Dimmer

esquemas abaixo, divirtam se!

abs.

post-416586-13884952677677_thumb.jpg

post-416586-13884952678203_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Tem esse programa muito bom para fazer um relogio, ele pode servir de ajuda em outros porgramas também, o circuito usa um ds1307 para contar o tempo e um pic 16f877a, o programa foi feito no mikroc:


void write_ds1307(unsigned short address,unsigned short w_data);
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
unsigned short data;
char time[9];
char ddate[11];

unsigned char BCD2UpperCh(unsigned char bcd);
unsigned char BCD2LowerCh(unsigned char bcd);

void main(){

I2C_Init(100000); //DS1307 I2C is running at 100KHz
PORTB = 0;
TRISB = 0; // Configure PORTB as output
TRISC = 0xFF;
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, "TIME:");
Lcd_Out(2, 1, "DATE:");

//Set Time
write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
write_ds1307(1,0x10); //write min 27
write_ds1307(2,0x01); //write hour 14
write_ds1307(3,0x02); //write day of week 2:Monday
write_ds1307(4,0x05); // write date 17
write_ds1307(5,0x01); // write month 6 June
write_ds1307(6,0x09); // write year 8 --> 2008
write_ds1307(7,0x10); //SQWE output at 1 Hz
write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator

while(1)
{
sec=read_ds1307(0); // read second
minute=read_ds1307(1); // read minute
hour=read_ds1307(2); // read hour
day=read_ds1307(3); // read day
date=read_ds1307(4); // read date
month=read_ds1307(5); // read month
year=read_ds1307(6); // read year

time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '\0';

ddate[0] = BCD2UpperCh(date);
ddate[1] = BCD2LowerCh(date);
ddate[2] ='/';
ddate[3] = BCD2UpperCh(month);
ddate[4] = BCD2LowerCh(month);
ddate[5] ='/';
ddate[6] = '2';
ddate[7] = '0';
ddate[8] = BCD2UpperCh(year);
ddate[9] = BCD2LowerCh(year);
ddate[10] = '\0';

Lcd_Out(1,6,time);
Lcd_Out(2,6,ddate);
Delay_ms(50);
}
}

unsigned short read_ds1307(unsigned short address)
{
I2C_Start();
I2C_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C_Wr(address);
I2C_Repeated_Start();
I2C_Wr(0xd1); //0x68 followed by 1 --> 0xD1
data=I2C_Rd(0);
I2C_Stop();
return(data);
}

unsigned char BCD2UpperCh(unsigned char bcd)
{
return ((bcd >> 4) + '0');
}

unsigned char BCD2LowerCh(unsigned char bcd)
{
return ((bcd & 0x0F) + '0');
}
void write_ds1307(unsigned short address,unsigned short w_data)
{
I2C_Start(); // issue I2C start signal
//address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C_Wr(0xD0); // send byte via I2C (device address + W)
I2C_Wr(address); // send byte (address of DS1307 location)
I2C_Wr(w_data); // send data (data to be written)
I2C_Stop(); // issue I2C stop signal
}
unsigned short read_ds1307(unsigned short address );

a simulação foi feita no proteus,

eu montei já o circuito no protoboard e ta funcionando direitinho.

post-580463-13884952678713_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!