ผมเขียนโปรแกรม ds1307 โดยใช้ pic นะครับ แบบ i2c ช่วยหน่อยนะ

กลุ่มวงจรที่ใช้ Microcontroller Arduino , PIC , AVR ,ETC.

Moderator: gang

First

ผมเขียนโปรแกรม ds1307 โดยใช้ pic นะครับ แบบ i2c ช่วยหน่อยนะ

โพสต์โดย First » 14/03/2008 12:52 am

ผมเขียนโปรแกรม DS1307 โดยใช้ PIC นะครับ แบบ i2c โปรแกรมเป็นตามนี้นะคับ
#include <16F877.h>
#ifndef RTC_SDA
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)

byte sec,min,hour,day,date,month,year;

//==========================
// initial DS1307
//==========================
void init_DS1307()
{
output_float(DS1307_SCL);
output_float(DS1307_SDA);
}
//==========================
// write data one byte to
// DS1307
//==========================
void write_DS1307(byte address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
printf("keng");
}
//==========================
// read data one byte from DS1307
//==========================
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}
void show_date(byte day)
{
switch (day)
{
case 1:printf("SUN-");
break;
case 2:printf("MON-");
break;
case 3:printf("TUE-");
break;
case 4:printf("WED-");
break;
case 5:printf("TUH-");
break;
case 6:printf("FRI-");
break;
case 7:printf("SAT-");
break;
}
}

//==== main program ============
void main()
{
init_ds1307();
write_ds1307(0,0x50); // set second to 00 and enable clock(bit7=0)
write_ds1307(1,0x59); // set minute
write_ds1307(2,0x23); // set hour
write_ds1307(3,0x04); // set day
write_ds1307(4,0x03); // set date
write_ds1307(5,0x03); // set month
write_ds1307(6,0x04); // year
//
while(true)
{
sec=read_ds1307(0);
min=read_ds1307(1);
hour=read_ds1307(2);
day=read_ds1307(3);
date=read_ds1307(4);
month=read_ds1307(5);
year=read_ds1307(6);
printf("\f");
printf("%2X:%2X:%2X\r\n",hour,min,sec);
show_date(day);
printf("%2X/%2X/20%2X",date,month,year);
delay_ms(250);
}
}

คือผมจะให้แสดงเวลาที่ได้ออกจอ LCD16x2 โดยเวลาอยู่บรรทัดบนและวันที่อยู่บรรทัดล่างแต่ไม่รูว่าจะเขียนดึงเวลา มาแสดงในจอ LCD อย่างไร ช่วยหน่อยนะคร้าบ T_T จะเป็นพระคุณอย่างมาก

พี่วุ้น

โพสต์โดย พี่วุ้น » 30/07/2008 8:17 am

แล้วน้องลองรันอันนี้แล้วออกไหมล่ะ
ถ้าออกแล้วค่อยลองใช้กับ LCD พี่ก้อมีนะcode น่ะ

บุคคลทั่วไป

โพสต์โดย บุคคลทั่วไป » 30/07/2008 9:14 am

/******************************************************************* Includes */
#include <16F877.h> // header file for PIC16F877A

/************************************************ Setting configuration fuses */
#fuses HS,NOWDT,NOPROTECT,NOLVP // Configuration word
#use delay(clock=20000000) // Change OSC here (default 20MHz)
#use fast_io (A)
#use fast_io (B)
#use standard_io(C)
#use fast_io(D)

#use I2C(master,sda=PIN_C4 ,scl=PIN_C3) // I2C Bus module
#define use_portb_lcd
#include <stdlib.h>

#define ADDR_DS1307 0xD0 // Address DS1307
#include <lcd.c>

/***************************************************************** Data types */
typedef struct {
BYTE sec; // Seconds
BYTE min; // Minutes
BYTE hr; // Hours
BYTE day;
BYTE date;
BYTE month;
BYTE year;
}DS1307_RTC;

DS1307_RTC RTC;

/***************************************************************** Prototypes */
int1 sw_set,sw_clear,sw_ok;
void DS1307_Write(unsigned char ctl,unsigned char dat);
BYTE DS1307_Read(unsigned char ctl);
void WriteDate_RTC(void);
void WriteTime_RTC(void);
void Read_RTC(void);

/*************************************************************** DS1307 Write */
void DS1307_Write(unsigned char ctl,unsigned char dat)
{
i2c_start(); // Start condition
i2c_write(ADDR_DS1307); // Device Address - Write
i2c_write(ctl); // Control byte
i2c_write(dat); // Write data
i2c_stop(); // Stop condition

}

/**************************************************************** DS1307 Read */
BYTE DS1307_Read(unsigned char ctl)
{

BYTE dat;

i2c_start(); // Start condition
i2c_write(ADDR_DS1307); // Device Address - Write
i2c_write(ctl); // Control byte

i2c_start();
i2c_write(ADDR_DS1307+1); // Device Address - Read
dat = i2c_read(0); // Read data , Not ACK
i2c_stop(); // Stop condition
return (dat); // Return data

}

/************************************************************** WriteDate RTC */
void WriteDate_RTC(void)
{
DS1307_Write(0x04,RTC.date);
DS1307_Write(0x05,RTC.month);
DS1307_Write(0x06,RTC.year);
}

/************************************************************** WriteTime RTC */
void WriteTime_RTC(void)
{
DS1307_Write(0x00,RTC.sec);
DS1307_Write(0x01,RTC.min);
DS1307_Write(0x02,RTC.hr);
}

/******************************************************************* Read RTC */
void Read_RTC(void)
{
RTC.date = DS1307_Read(0x04);
RTC.month = DS1307_Read(0x05);
RTC.year = DS1307_Read(0x06);
printf(lcd_putc,"\fDate : %X/%X/%X",RTC.date,RTC.month,RTC.year);
RTC.sec = DS1307_Read(0x00);
RTC.min = DS1307_Read(0x01);
RTC.hr = DS1307_Read(0x02);
printf(lcd_putc,"\nTime : %X:%X:%X",RTC.hr,RTC.min,RTC.sec);
}

void MenuSetDate(void)
{
printf(lcd_putc,"\fDATE: _/_/_");
delay_ms(50);// debound

do {
sw_set = input(pin_D0);
sw_clear = input(pin_D1);
sw_ok = input(pin_D2);
if(sw_set==0) {

RTC.date= RTC.date+1;
printf(lcd_putc,"\fDATE: %X/%X/%X",RTC.date,RTC.month,RTC.year);
delay_ms(100);
}

else if(sw_clear==0) {
RTC.month= RTC.month+1;
printf(lcd_putc,"\fDATE: %X/%X/%Xd",RTC.date,RTC.month,RTC.year);
delay_ms(100);// debound
}

else if(sw_ok==0) {
RTC.year=RTC.year+1;
printf(lcd_putc,"\fDATE: %X/%X/%X",RTC.date,RTC.month,RTC.year);
delay_ms(100);
}
else {
break;
}
}

while(RTC.date>0);
}

/*########################################################################*/
void MenuSetTime(void)
{
printf(lcd_putc,"\fTIME: __:__:__");
delay_ms(50);// debound

do {
sw_set = input(pin_D0);
sw_clear = input(pin_D1);
sw_ok = input(pin_D2);
if(sw_set==0) {
RTC.hr= RTC.hr+1;
printf(lcd_putc,"\fTime : %X:%X:%X",RTC.hr,RTC.min,RTC.sec);
delay_ms(100);
}

else if(sw_clear==0) {
RTC.min= RTC.min+1;
printf(lcd_putc,"\fTime : %X:%X:%X",RTC.hr,RTC.min,RTC.sec);
delay_ms(100);// debound
}

else if(sw_ok==0) {
RTC.sec=RTC.sec+1;
printf(lcd_putc,"\fTime : %X:%X:%X",RTC.hr,RTC.min,RTC.sec);
delay_ms(100);
}
else {
break;
}
}

while(RTC.sec>0);
}
/*########################################################*/
int vr1;
void main(void)
{
SET_TRIS_D(0x03);
lcd_init(); // Init LCD Module
lcd_putc("Select Menu"); delay_ms(50);
lcd_send_byte(0,0x01);
lcd_putc("(SW1)Auto");
lcd_putc("\n(SW2)Set Time");
delay_ms(100);
lcd_send_byte(0,0x01);


while (true) {
sw_set = input(pin_D0);
sw_clear = input(pin_D1);
sw_ok = input(pin_D2);
if(sw_set==0)
{

MenuSetDate();
WriteDate_RTC();
}
if(sw_clear==0)
{
MenuSetTime();

WriteTime_RTC(); }

Read_RTC();
delay_ms(50);

vr1 = input(pin_D4);

if(vr1>0)
{ output_high(pin_B3);}

if(vr1<1)
{ output_low(pin_B3);
}

}


}



/*************************** End of $Workfile: $ ******************************/

วงจรนาฬิกาใช้ PIC16F877กับDs1307แสดงผลออกLCDและตั้งเลาโดยการกดSwitch
อันนี้รองไปรันดูนะ ออกใน Protius ค่ะ ถ้าอยากได้วงจรก็เมล์มานะ wonsen_36@hotmail.com

c2436

Re: ผมเขียนโปรแกรม ds1307 โดยใช้ pic นะครับ แบบ i2c ช่วยหน่อยนะ

โพสต์โดย c2436 » 04/10/2010 9:30 pm

พอดีผมทำโปรเจค นาฬกา ใช้ pic16f84 แสดงผลออก 7-segment 6 หลักที่อยู่ใน proteus จะใช้ RTC เป็นตัวกำเนิดสัญญาณนาฬิกา แล้วให้มันแสดงเวลา 5 วินาที่ สลับกับวัน,เดือน,ปี, 5 วินาที ผมลองเขียนโปรแกรมแล้วไม่ได้ พี่พอจะมีวงจรและโค้ดไหมคับ ถ้ามีช่วยส่งเมลมาให้ผมหน่อยได้ป่าวคับ

ช่วยหน่อยนะคับเด๋วไม่จบคับ
ขอบคุณล่วงหน้าคับ


BELL

Re: ผมเขียนโปรแกรม ds1307 โดยใช้ pic นะครับ แบบ i2c ช่วยหน่อยนะ

โพสต์โดย BELL » 19/10/2010 1:47 am

อยากได้วงจรกับโค้ด ส่งให้หน่อยนะคับ เมล spiderman6-1@hotmail.com ขอบคุณมากคับ :D :D


cream

ขอคำปรึกษา

โพสต์โดย cream » 09/03/2011 10:23 am

พี่ๆค่ะ หนูมีเรื่องอยากจะปรึกษาหน่อยค่ะ พอดีหนูทำดปรเจค แล้วต้องมีการตั้งเวลานับถอยหลัง เป็นชั่วโมง : นาที : วินาที เมื่อถึงเวลาทำงานตามฐานเวลาปกติแล้ว ก็สั่งให้เอาต์พุตทำงานอะค่ะ หลังจากนั้น เมื่อทำงานไป 15-30 นาทีแล้ว ให้เครื่องหยุดทำงาน แล้วให้เริ่มเวลานับถอยหลังใหม่
***************ปัญหาหนูตอนนี้ หนูไม่รู้จะเริ่มเขียนโปรแกรมยังไง หนูจะส่งอยู่ล่ะ ทำไม่ทัน ทดลองแล้วหลายวิธีแต่ก็ไม่เวิร์ค หนูไม่รู้จะทำไง ถ้าพี่ๆรู้ ช่วยบอกหน่อยนะค่ะ
หนูส่ง15/03/54หนูไม่รู้จะทำไงล่ะ หนูมาถึงปลายทางล่ะค่ะ จะสู้จนวินาทีสุดท้าย ***********************สู้เพื่อพ่อแม่*************************


ย้อนกลับไปยัง

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: 2 และ บุคคลทั่วไป 0 ท่าน

cron