Chia sẻ mạch đồng hồ atmega16

mta_cdt

Super Moderator
Thành viên BQT
#1
Sử dụng mạch này bạn có thể làm đồng hồ treo tường và hẹn giờ bật tắt thiết bị nào đó. Mạch sử dụng atmega16, RTC ds1307 hiển thị trên led 7 thanh.
2014-01-14_193915.png
code test thử
Mã:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 10/9/2013
Author  : NeVaDa
Company :
Comments:


Chip type              : ATmega16
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size      : 0
Data Stack size        : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>


// I2C Bus functions
#asm
  .equ __i2c_port=0x15 ;PORTC
  .equ __sda_bit=1
  .equ __scl_bit=0
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>
#define led6 PORTC.7
#define led5 PORTC.2
#define led1 PORTC.6
#define led4 PORTC.5
#define led3 PORTC.4
#define led2 PORTC.3
#define Set_key PIND.4
#define Dw_key PIND.5
#define Up_key PIND.7
#define ok PIND.6




//unsigned char i;
unsigned char font[10]={0x81,0xb7,0x8a,0x92,0xb4,0xd0,0xC0,0x97,0x80,0x90};
unsigned char h,m,s;
unsigned char t_view,index,F_set;

void Fix_time(void)    // Kiem tra va hieu chinh gia tri cua gio,phut,giay
{
//Tang
if(s==60)  {s=0;m++;  }
if(m==60)  {m=0;h++;  }
if(h==24) h=0;
//Giam
if(s== -1) {s=59;m--;}
if(m== -1) {m=59;h-- ;}
if(h== -1)h= 23;
}
///////////cài dat thoi gian dong ho
void Keypad(void)    // Kiem tra phim nhan.
{
if(!Set_key){
while(!Set_key);    //phim Set duoc nhan ?
F_set++;    // Bien F_set co gia tri tu 0->2
if((F_set==4)||(ok==0)) {F_set=0;
rtc_set_time(h,m,s);}
}
if(F_set==1){    //Tang hoac giam phut neu F_set = 1
if(!Up_key) h++;
if(!Dw_key)  h--;
}
if(F_set==2){    //Tang hoac giam gio neu F_set = 2
if(!Up_key) m++;
if(!Dw_key) m--;
}
if(F_set==3){    //Tang hoac giam gio neu F_set = 2
if(!Up_key) s++;
if(!Dw_key) s--;
}
Fix_time();    //kiem tra tran so
delay_ms(200);
}

// dung timer1 de quet led
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=230;
index++;
if(index==1 ){
t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=1;led2=0;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];

}
if(index==2 )
{// t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=1;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==3){
t_view=m;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];
}
if(index==4 )
{
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==5) {

t_view=s;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;
PORTA=font[t_view/10];
}

if(index==6 )
{ //t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=1;
PORTA=font[t_view%10];
index=0;
}
// Place your code here

}
void main(void)
{  h=0;
  m=0;
  s=0;
  index=0;
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x0F;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xF0;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x04;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")


// I2C Bus initialization
i2c_init();


// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);

while (1)
      {
      Keypad();
      if(F_set==0)
      {
  
      rtc_get_time(&h,&m,&s);
      if((h==14)&&(m>2)&&(m<12)){PORTB.0=1;}
      else{PORTB.0=0;}
    
        }
  // quetled(h,m,s);
      // Place your code here

      }
}
Chạy trên phần mềm mô phỏng.
2014-01-14_193915.png
Mạch đã test và chạy ổn định, chức năng chỉnh thời gian hẹn lúc nào rảnh mình thêm vào.
Sơ đồ nguyên lý+mô phỏng+code download ở file đính kèm
 

Đính kèm

#2
em đọc mà vẫn không biết chương trình giao tiếp với ds1307 là viết như thế nào?
chuong trình cho nút phim nhấn ok chưa viết ạ?
 

mta_cdt

Super Moderator
Thành viên BQT
#3
em đọc mà vẫn không biết chương trình giao tiếp với ds1307 là viết như thế nào?
chuong trình cho nút phim nhấn ok chưa viết ạ?
Đây là dòng đọc thời gian trong ds1307
rtc_get_time(&h,&m,&s);
Code set thời gian cho ds1307 là
rtc_set_time(&h,&m,&s);
2 thằng này ở trong thư viện ds1307.h của codevison avr đã hỗ trợ rồi mà.
Chương trình cho nút bấm có rồi mà nhưng khi đổi giờ set thì không nháy đèn thôi.
 
#4
Đây là dòng đọc thời gian trong ds1307
rtc_get_time(&h,&m,&s);
Code set thời gian cho ds1307 là
rtc_set_time(&h,&m,&s);
2 thằng này ở trong thư viện ds1307.h của codevison avr đã hỗ trợ rồi mà.
Chương trình cho nút bấm có rồi mà nhưng khi đổi giờ set thì không nháy đèn thôi.
em muốn hiển thị cả thứ thì phải làm thế nào ạ?
 

mta_cdt

Super Moderator
Thành viên BQT
#5
em muốn hiển thị cả thứ thì phải làm thế nào ạ?
Muốn đọc thứ thì bạn vào mở file ds1307.c trong chương trình codevison avr đó.
Mã:
unsigned char rtc_read(unsigned char address);
void rtc_write(unsigned char address,unsigned char data);
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out);
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec);
void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec);
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year);
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);
unsigned char rtc_read(unsigned char address);
đọc dữ liệu từ ds1307 nhé muốn đọc thứ thì địa chỉ nó là 0x03 cái này đọc trong datasheet nó có.
void rtc_write(unsigned char address,unsigned char data); dùng để cài đặt thời gian.
void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec); dùng để cài đặt giờ phút và giây.
void rtc_get_time(unsigned char hour,unsigned char min,unsigned char sec); dùng để đọc đó.
tương tự với rtc_set_date thôi.
 

thuytran

Học sinh phổ thông
#6
cho e hỏi, muốn hiển thị cả ngày tháng lên led 7 thanh hoặc LCD thì làm thế nào ạ.
 

mta_cdt

Super Moderator
Thành viên BQT
#7
cho e hỏi, muốn hiển thị cả ngày tháng lên led 7 thanh hoặc LCD thì làm thế nào ạ.
Mở ds1307.h ra nhé là có câu trả lời.
Mã:
unsigned char rtc_read(unsigned char address);
void rtc_write(unsigned char address,unsigned char data);
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out);
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec);
void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec);
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year);
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);
set là cài đặt ( ghi vào ds1307), get là đọc từ ds1307 ra.
 

phamphilong

Học sinh phổ thông
#10
a ơi,,,,, e muốn dùng 2 con mega16 giao tiếp với nhau để làm mạch lịch vạn niên thì 1 con master sẽ đọc dữ liệu từ ds1307 sau đó truyền qua cho con slave sẽ hiển thị ra led phải không ah
 

Quảng cáo Google