Ir ao conteúdo
  • Cadastre-se

Outro RTC DS1307 com microcontrolador AT89S52


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

Posts recomendados

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();}}

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

@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   : [email protected]
 * 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;
}
 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

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