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.