Ir ao conteúdo

Outro RTC DS1307 com microcontrolador AT89S52


Ir à solução Resolvido por Maria Cristina Oliveira,

Posts recomendados

Postado

Oi:

Não consigo fazer funcionar. Só funciona no Isis. O relógio só fica parado.

Alguém sabe o que está acontecendo?

 

Maria Cristina  :(

 

 

#include<AT89X52.h>
#include<lcd.h>
#include<delay.h>
#define sck P2_6
#define sda P2_7
#include<i2c.h>
#include<ds1307.h>
//********************************************************
void main(){
char dado=0;
LCD_init();
while(1) {
//Ajuste do Relógio:
if(P3_2==0){
setRTC(rtc.hour+1,RTC_HOUR);
if(rtc.hour>23) setRTC(0,RTC_HOUR);
}
if(P3_1==0) setRTC(rtc.min+1,RTC_MIN);
if(P3_0==0) setRTC(rtc.year+1,RTC_YEAR);
getTime();
LCD_putchar(rtc.hour/10+48);
LCD_putchar (rtc.hour%10+48);
LCD_putchar (':');
LCD_putchar (rtc.min/10+48);
LCD_putchar (rtc.min%10+48);
LCD_putchar (':');
LCD_putchar (rtc.sec/10+48);
LCD_putchar (rtc.sec%10+48);
getDate();
LCD_row2();
LCD_putchar (rtc.day/10+48);
LCD_putchar (rtc.day%10+48);
LCD_putchar ('/');
LCD_putchar (rtc.month/10+48);
LCD_putchar (rtc.month%10+48);
LCD_putchar ('/');
LCD_putchar (rtc.year/10+48);
LCD_putchar (rtc.year%10+48);
LCD_putchar (' ');
if(rtc.dow==1) LCD_puts("DOM");
if(rtc.dow==2) LCD_puts("SEG");
if(rtc.dow==3) LCD_puts("TER");
if(rtc.dow==4) LCD_puts("QUA");
if(rtc.dow==5) LCD_puts("QUI");
if(rtc.dow==6) LCD_puts("SEX");
if(rtc.dow==7) LCD_puts("SAB");
delay_ms(200);
LCD_row1();}}

  • Membro VIP
Postado

Sim pode ter razão. Dá uma olhadela no d.s. dele. Numa de alguns segundos não percebi tal condição ok? Veja o que vi...

 

wlasLbm.png

 

GkJdqEe.png

A princípio basta alimentar e ele já sai rodando

Também pode se basear nos exemplos com arduino.

 

Ah e não baixei seus arquivos (sorry) mas confira se colocou  pullup's

Dica: há quem prefira não baixar (tipo eu). Publique direto na página do forum através do https://imgur.com/upload

Postado

@if. Oi:

Achei que havia um comando para ligar com base nesse programa:

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

//Programa : Relogio com modulo RTC DS1307
//Autor : FILIPEFLOP
 
//Carrega a biblioteca do RTC DS1307
#include <DS1307.h>
 
//Modulo RTC DS1307 ligado as portas A4 e A5 do Arduino 
DS1307 rtc(A4, A5);
 
void setup()
{
  //Aciona o relogio
  rtc.halt(false);----------------------------------------------------------------(OLHA AQUI)
   
  //As linhas abaixo setam a data e hora do modulo
  //e podem ser comentada apos a primeira utilizacao
  rtc.setDOW(FRIDAY);      //Define o dia da semana
  rtc.setTime(20, 37, 0);     //Define o horario
  rtc.setDate(6, 6, 2014);   //Define o dia, mes e ano
   
  //Definicoes do pino SQW/Out
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
   
  Serial.begin(9600);
}
 
void loop()
{
  //Mostra as informações no Serial Monitor
  Serial.print("Hora : ");
  Serial.print(rtc.getTimeStr());
  Serial.print(" ");
  Serial.print("Data : ");
  Serial.print(rtc.getDateStr(FORMAT_SHORT));
  Serial.print(" ");
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));
   
  //Aguarda 1 segundo e repete o processo
  delay (1000);
}
 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

lcd.h

 

/*
 * Filename : lcd.h
 * Hardware : Controller  -> P89V51RD2
 *            XTAL        -> 18.432 MHz
 *            Mode        -> 6 Clock/MC
 * I/O      : RS          -> P2.5
 *            Enable      -> P2.4
 *            Data4567    -> P2.0,P2.1,P2.2,P2.3
 * Compiler : SDCC            
 * Author   : sci-3d@hotmail.com
 * Date      : 01/08/06
 */

 #define LCD_en P2_4
 #define LCD_rs P2_5 
 #define LCD_DELAY 355 /* Delay for 1 ms */
 #define LCD_clear() LCD_command(0x1)   /* Limpa o LCD */
 #define LCD_origin() LCD_command(0x2)  /* Set to origin LCD */
 #define LCD_row1() LCD_command(0x80)   /* Começa na linha 1 */
 #define LCD_row2() LCD_command(0xC0)   /* Começa na linha 2 */
 #define LCD_row3() LCD_command(0x94)   /* Começa na linha 3 */
 #define LCD_row4() LCD_command(0xD4)   /* Começa na linha 4 */
 
 
/***************************************************
 * Prototype(s)                                    *
 ***************************************************/
void LCD_delay(unsigned char ms);
void LCD_enable(void);
void LCD_command(unsigned char command);
void LCD_putchar(unsigned char ascii);
void LCD_puts(unsigned char *lcd_string);
void LCD_init(void);
void LCD_putint (unsigned int vAL, char pT, char Lengh);
//void LCD_cursor(bit blink);

/***************************************************
 * Sources                                         *
 ***************************************************/
/*
void LCD_cursor(bit blink){
    if(blink) LCD_command(0x0F);
    else LCD_command(0x0C);
}
*/
//***********************************************************
void LCD_delay(unsigned char ms)
{
   unsigned char n;
   unsigned int i;
   for (n=0; n<ms; n++)
   {
      for (i=0; i<LCD_DELAY; i++); /* For 1 ms */
   }
    
}
//***********************************************************
void LCD_enable(void)
{
    LCD_en = 0; /* Clear bit P2.4 */
    LCD_delay(1);
    LCD_en = 1; /* Set bit P2.4 */
}
//***********************************************************
void LCD_command(unsigned char command)
{
    LCD_rs = 0; /* Clear bit P2.5 */
    P2 = (P2 & 0xF0)|((command>>4) & 0x0F);
    LCD_enable();
    P2 = (P2 & 0xF0)|(command & 0x0F);
    LCD_enable();
    LCD_delay(1);
}
//***********************************************************
void LCD_putchar(unsigned char ascii)
{
    LCD_rs = 1; /* Set bit P2.5 */
    P2 = (P2 & 0xF0)|((ascii>>4) & 0x0F);
    LCD_enable();
    P2 = (P2 & 0xF0)|(ascii & 0x0F);
    LCD_enable();
    LCD_delay(1);
}
//***********************************************************
void LCD_puts(unsigned char *lcd_string)
{
   while (*lcd_string) 
   {
      LCD_putchar(*lcd_string++);
   }
}
//***********************************************************
void LCD_init(void)
{
    LCD_en = 1; /* Set bit P2.4 */
    LCD_rs = 0; /* Clear bit P2.5 */   
    LCD_command(0x33);
    LCD_command(0x32);
    LCD_command(0x28);
    LCD_command(0x0C);
    LCD_command(0x06);
    LCD_command(0x01); /* Clear */
    LCD_delay(256);
}
//***********************************************************
void LCD_putint(unsigned int val, char pT, char Lengh){
    unsigned char i=0;
    char vet[5];
    //*********************************
    for(i=4;i>0;i--){
        vet[i]=(val%10);
        val/=10;
    }
    vet[i]=val%10;        
    //*********************************
    //if(vet[0]==0 && vet[1]!=0) vet[0]='*';
    //dezena minhar
    if(Lengh>4){
        if(pT==1){
            LCD_putchar(vet[0]+48);
            LCD_putchar('.');
        }
        else{
            if(vet[0]!=0 || pT==0) LCD_putchar(vet[0]+48);
            else LCD_putchar(' ');
        }
    }

    //milhar:
    if(Lengh>3){
        if(pT==2){
            LCD_putchar(vet[1]+48);
            LCD_putchar('.');
        }
        else{
            if(pT<2 || vet[0]!=0 || vet[1]!=0) LCD_putchar(vet[1]+48);
            else LCD_putchar(' ');
        }
    }

    //Centena:
    if(Lengh>2){
        if(pT==3){
            LCD_putchar(vet[2]+48);
            LCD_putchar('.');
        }
        else{
            if(pT<3 || vet[0]!=0 || vet[1]!=0 || vet[2]!=0) LCD_putchar(vet[2]+48);
            else LCD_putchar(' ');
        }
    }

    //Dezena:
    if(Lengh>1){
        if(pT==4){
            LCD_putchar(vet[3]+48);
            LCD_putchar('.');
        }
        else{
            if(pT<4 || vet[0]!=0 || vet[1]!=0 || vet[2]!=0 || vet[3]!=0) LCD_putchar(vet[3]+48);
            else LCD_putchar(' ');
        }
    }
    //Unidade:    
    LCD_putchar(vet[4]+48);
  
//**************************************************************************************  
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

//*******************************************************************
//  RTC DS1307 RealTime Clock for 8051 Series Using I2C Protocol
//   All Data of DS1307 is originaly in BCD format
//   It needs i2c.h to work
//
//   Writed by Cristian Machado Goularte
//   friday, 19/05/2017
//  Please visit www.u8051.com.br
//*******************************************************************

#define RTC_SEC 0X00   //Seconds Time Address
#define RTC_MIN 0X01    //Minutes Time Address
#define RTC_HOUR 0X02    //Hours Time Address
#define RTC_DOW 0X03    //Day Of Week Date Address
#define RTC_DAY 0X04    //Day of Mounth Date Address
#define RTC_MONTH 0X05    //Month Of Year Date Address
#define RTC_YEAR 0X06    //Year Date Address
#define RTC 208         //RTC DS1307 I2C Address

struct{
    char hour;
    char min;
    char sec;
    char year;
    char month;
    char day;
    char dow;
} rtc;
//********************************************************
char bcdToDec(char valueBCD){
   return((valueBCD/16)*10)+(valueBCD%16);
}
//********************************************************
char decToBCD(char valueDec){
   return(((valueDec/10)*16)+(valueDec%10));
}
//**********************************************************
void setRTC(char NewValue,char addr){
    //Ex.: NewValue=12, addr=RTC_SEC  -Time will be xx:xx:12
    //Ex.: NewValue=12, addr=RTC_HOUR -Time will be 12:xx:xx
    //Ex.: NewValue=05, addr=RTC_DAY  -Date will be 05/xx/xx
    save_i2c(RTC,addr,decToBCD(NewValue));
    getTime();
    getDate();
}
//**********************************************************
void getDate(){
    rtc.day=read_i2c(RTC,RTC_DAY);            //Range: 01-31
    rtc.day=bcdToDec(rtc.day);               //Converts BCD to DEC

    rtc.month=read_i2c(RTC,RTC_MONTH);         //Range: 01-12
    rtc.month=bcdToDec(rtc.month);            //Converts BCD to DEC

    rtc.year=read_i2c(RTC,RTC_YEAR);         //Range: 00-99
    rtc.year=bcdToDec(rtc.year);            //Converts BCD to DEC
    
    rtc.dow=read_i2c(RTC,RTC_DOW);            //Range: 1-7
}
//********************************************************
void getTime(){
    rtc.hour=read_i2c(RTC,RTC_HOUR);         //Range: 00-24h
    rtc.hour=bcdToDec(rtc.hour);               //Converts BCD to DEC
    
    rtc.min=read_i2c(RTC,RTC_MIN);            //Range: 00-59m
   rtc.min=bcdToDec(rtc.min);               //Converts BCD to DEC

    rtc.sec=read_i2c(RTC,RTC_SEC);            //Range: 00-59s
    rtc.sec=bcdToDec(rtc.sec);               //Converts BCD to DEC
}
 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

I2C.h

 

#define TEMPO 1
//**************************************************************************
void delay_i2c(char i)
{
    int j;
    while(i--)
        for(j=0;j<30;j++);
}
//**************************************************************************
void start(void)
{
    /*para iniciar a comunicacao deve-se produzir
    nivel alto para baixo em sda com sck=1
    */
    sda=1;
    delay_i2c(TEMPO);
    sck=1;
    delay_i2c(TEMPO);
    sda=0;
    //sck=0;
}
//**************************************************************************
void stop()
{
    /* para parar comunicacao i2c
    deve-se produzir nivel baixo para alto em sda com sck=1 */
    sda=0;
    delay_i2c(TEMPO);
    sck=1;
    sda=1;
}


void write(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        sck=0;
        sda=(dat&0x80>>i)?1:0;
        delay_i2c(TEMPO);
        sck=1;
    }
}

void ack(void)
{
    sck=0;
    delay_i2c(TEMPO);
    sda=1;
    delay_i2c(TEMPO);
    sck=1;
    delay_i2c(TEMPO);
    sck=0;
}

void noack(void)
{
    sck=0;
    delay_i2c(TEMPO);
    sda=1;
    delay_i2c(TEMPO);
    sck=1;
}

unsigned char read()
{
    unsigned char i,buff=0;
    sda=1;

    for(i=0;i<8;i++)
    {
        sck=1;
        if(sda)
            buff|=(0x80>>i);
        sck=0;
    }

    return buff;
}


void save_i2c(char id,char addr,char ch)
{
    start();

    write(id);
    ack();

    write(addr);
    ack();

    write(ch);
    ack();

    stop();
    delay_i2c(100);
}


char read_i2c(char id,char addr)
{
    unsigned char buff;
    start();
    write(id);
    ack();

    write(addr);
    ack();

    start();
    write(id|1);
    ack();

    buff=read();

    noack();
    stop();
    return buff;
}
 

 

  • Membro VIP
Postado

Boa... tdav.... Abra agora o arquivo

2 horas atrás, Maria Cristina Oliveira disse:

//Carrega a biblioteca do RTC DS1307
#include <DS1307.h> <<<<<<<<<<<<<<<<<<<<<<<<<<<<(OLHA AQUI) :bye:
 
//Modulo RTC DS1307 ligado as portas A4 e A5 do Arduino 
DS1307 rtc(A4, A5);
 
void setup()
{
  //Aciona o relogio
  rtc.halt(false);----------------------------------------------------------------(OLHA AQUI)

e destrinche-o. Analise o que faz a função rtc.halt.... Péra... me lembro vagamente que tem que ajustar um bit qualquer e ... puts!!

EbuGwqi.png

.... estava logo acima. Desculpe por não ter lido o d.s. com mais profundidade. Nem mesmo minha falhante intuição me falou que CH era Clock Halt. Vi pelo rabo do olho e achei que era 'CHannel'.. sei lá. .. É a idade... ou melhor.. acúmulo exagerado de juventudes ...😁

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!